1 //*********************************************************
2 //
3 // Copyright (c) Microsoft. All rights reserved.
4 // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
5 // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
6 // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
7 // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
8 //
9 //*********************************************************
10
11 //
12 // AdvancedCapture.xaml.cpp
13 // Implementation of the AdvancedCapture class
14 //
15
16 #include "pch.h"
17 #include "AdvancedCapture.xaml.h"
18
19 using namespace SDKSample::MediaCapture;
20
21 using namespace Windows::UI::Xaml;
22 using namespace Windows::UI::Xaml::Navigation;
23 using namespace Windows::UI::Xaml::Data;
24 using namespace Windows::System;
25 using namespace Windows::Foundation;
26 using namespace Windows::Foundation::Collections;
27 using namespace Platform;
28 using namespace Windows::UI;
29 using namespace Windows::UI::Core;
30 using namespace Windows::UI::Xaml;
31 using namespace Windows::UI::Xaml::Controls;
32 using namespace Windows::UI::Xaml::Data;
33 using namespace Windows::UI::Xaml::Media;
34 using namespace Windows::Storage;
35 using namespace Windows::Media::MediaProperties;
36 using namespace Windows::Storage::Streams;
37 using namespace Windows::System;
38 using namespace Windows::UI::Xaml::Media::Imaging;
39 using namespace Windows::Devices::Enumeration;
40
41 ref class ReencodeState sealed
42 {
43 public:
ReencodeState()44 ReencodeState()
45 {
46 }
47
~ReencodeState()48 virtual ~ReencodeState()
49 {
50 if (InputStream != nullptr)
51 {
52 delete InputStream;
53 }
54 if (OutputStream != nullptr)
55 {
56 delete OutputStream;
57 }
58 }
59
60 internal:
61 Windows::Storage::Streams::IRandomAccessStream ^InputStream;
62 Windows::Storage::Streams::IRandomAccessStream ^OutputStream;
63 Windows::Storage::StorageFile ^PhotoStorage;
64 Windows::Graphics::Imaging::BitmapDecoder ^Decoder;
65 Windows::Graphics::Imaging::BitmapEncoder ^Encoder;
66 };
67
AdvancedCapture()68 AdvancedCapture::AdvancedCapture()
69 {
70 InitializeComponent();
71 ScenarioInit();
72 }
73
74 /// <summary>
75 /// Invoked when this page is about to be displayed in a Frame.
76 /// </summary>
77 /// <param name="e">Event data that describes how this page was reached. The Parameter
78 /// property is typically used to configure the page.</param>
79 void AdvancedCapture::OnNavigatedTo(NavigationEventArgs^ e)
80 {
81 // A pointer back to the main page. This is needed if you want to call methods in MainPage such
82 // as NotifyUser()
83 rootPage = MainPage::Current;
84
85 m_orientationChangedEventToken = Windows::Graphics::Display::DisplayProperties::OrientationChanged += ref new Windows::Graphics::Display::DisplayPropertiesEventHandler(this, &AdvancedCapture::DisplayProperties_OrientationChanged);
86 }
87
88 void AdvancedCapture::OnNavigatedFrom(NavigationEventArgs^ e)
89 {
90 Windows::Media::MediaControl::SoundLevelChanged -= m_eventRegistrationToken;
91 Windows::Graphics::Display::DisplayProperties::OrientationChanged -= m_orientationChangedEventToken;
92 }
93
ScenarioInit()94 void AdvancedCapture::ScenarioInit()
95 {
96 rootPage = MainPage::Current;
97 btnStartDevice2->IsEnabled = true;
98 btnStartPreview2->IsEnabled = false;
99 m_bRecording = false;
100 m_bPreviewing = false;
101 m_bEffectAdded = false;
102 previewElement2->Source = nullptr;
103 ShowStatusMessage("");
104 EffectTypeCombo->IsEnabled = false;
105 previewCanvas2->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
106 EnumerateWebcamsAsync();
107 m_bSuspended = false;
108 }
109
ScenarioReset()110 void AdvancedCapture::ScenarioReset()
111 {
112 previewCanvas2->Visibility = Windows::UI::Xaml::Visibility::Collapsed;
113 ScenarioInit();
114 }
115
116 void AdvancedCapture::Failed(Windows::Media::Capture::MediaCapture ^currentCaptureObject, Windows::Media::Capture::MediaCaptureFailedEventArgs^ currentFailure)
117 {
118 String ^message = "Fatal error" + currentFailure->Message;
119 create_task(Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High,
120 ref new Windows::UI::Core::DispatchedHandler([this, message]()
__anonf55c16f60102() 121 {
122 ShowStatusMessage(message);
123 })));
124 }
125
126 void AdvancedCapture::btnStartDevice_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
127 {
128 try
129 {
130 EnableButton(false, "StartDevice");
131 ShowStatusMessage("Starting device");
132 auto mediaCapture = ref new Windows::Media::Capture::MediaCapture();
133 m_mediaCaptureMgr = mediaCapture;
134 auto settings = ref new Windows::Media::Capture::MediaCaptureInitializationSettings();
135 auto chosenDevInfo = m_devInfoCollection->GetAt(EnumedDeviceList2->SelectedIndex);
136 settings->VideoDeviceId = chosenDevInfo->Id;
137 if (chosenDevInfo->EnclosureLocation != nullptr && chosenDevInfo->EnclosureLocation->Panel == Windows::Devices::Enumeration::Panel::Back)
138 {
139 m_bRotateVideoOnOrientationChange = true;
140 m_bReversePreviewRotation = false;
141 }
142 else if (chosenDevInfo->EnclosureLocation != nullptr && chosenDevInfo->EnclosureLocation->Panel == Windows::Devices::Enumeration::Panel::Front)
143 {
144 m_bRotateVideoOnOrientationChange = true;
145 m_bReversePreviewRotation = true;
146 }
147 else
148 {
149 m_bRotateVideoOnOrientationChange = false;
150 }
151
152 create_task(mediaCapture->InitializeAsync(settings)).then([this](task<void> initTask)
__anonf55c16f60202(task<void> initTask) 153 {
154 try
155 {
156 initTask.get();
157
158 auto mediaCapture = m_mediaCaptureMgr.Get();
159
160 DisplayProperties_OrientationChanged(nullptr);
161
162 EnableButton(true, "StartPreview");
163 EnableButton(true, "StartStopRecord");
164 EnableButton(true, "TakePhoto");
165 ShowStatusMessage("Device initialized successful");
166 EffectTypeCombo->IsEnabled = true;
167 mediaCapture->Failed += ref new Windows::Media::Capture::MediaCaptureFailedEventHandler(this, &AdvancedCapture::Failed);
168 }
169 catch (Exception ^ e)
170 {
171 ShowExceptionMessage(e);
172 }
173 });
174 }
175 catch (Platform::Exception^ e)
176 {
177 ShowExceptionMessage(e);
178 }
179 }
180
181 void AdvancedCapture::btnStartPreview_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
182 {
183 m_bPreviewing = false;
184 try
185 {
186 ShowStatusMessage("Starting preview");
187 EnableButton(false, "StartPreview");
188
189 auto mediaCapture = m_mediaCaptureMgr.Get();
190 previewCanvas2->Visibility = Windows::UI::Xaml::Visibility::Visible;
191 previewElement2->Source = mediaCapture;
192 create_task(mediaCapture->StartPreviewAsync()).then([this](task<void> previewTask)
__anonf55c16f60302(task<void> previewTask) 193 {
194 try
195 {
196 previewTask.get();
197 m_bPreviewing = true;
198 ShowStatusMessage("Start preview successful");
199 }
200 catch (Exception ^e)
201 {
202 ShowExceptionMessage(e);
203 }
204 });
205 }
206 catch (Platform::Exception^ e)
207 {
208 m_bPreviewing = false;
209 previewElement2->Source = nullptr;
210 EnableButton(true, "StartPreview");
211 ShowExceptionMessage(e);
212 }
213 }
214
215 void AdvancedCapture::lstEnumedDevices_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
216 {
217 if ( m_bPreviewing )
218 {
219 create_task(m_mediaCaptureMgr->StopPreviewAsync()).then([this](task<void> previewTask)
__anonf55c16f60402(task<void> previewTask) 220 {
221 try
222 {
223 previewTask.get();
224 m_bPreviewing = false;
225 }
226 catch (Exception ^e)
227 {
228 ShowExceptionMessage(e);
229 }
230 });
231 }
232
233 btnStartDevice2->IsEnabled = true;
234 btnStartPreview2->IsEnabled = false;
235 m_bRecording = false;
236 previewElement2->Source = nullptr;
237 EffectTypeCombo->IsEnabled = false;
238 m_bEffectAdded = false;
239 m_bEffectAddedToRecord = false;
240 m_bEffectAddedToPhoto = false;
241 ShowStatusMessage("");
242 }
243
EnumerateWebcamsAsync()244 void AdvancedCapture::EnumerateWebcamsAsync()
245 {
246 try
247 {
248 ShowStatusMessage("Enumerating Webcams...");
249 m_devInfoCollection = nullptr;
250
251 EnumedDeviceList2->Items->Clear();
252
253 task<DeviceInformationCollection^>(DeviceInformation::FindAllAsync(DeviceClass::VideoCapture)).then([this](task<DeviceInformationCollection^> findTask)
254 {
255 try
256 {
257 m_devInfoCollection = findTask.get();
258 if (m_devInfoCollection == nullptr || m_devInfoCollection->Size == 0)
259 {
260 ShowStatusMessage("No WebCams found.");
261 }
262 else
263 {
264 for(unsigned int i = 0; i < m_devInfoCollection->Size; i++)
265 {
266 auto devInfo = m_devInfoCollection->GetAt(i);
267 EnumedDeviceList2->Items->Append(devInfo->Name);
268 }
269 EnumedDeviceList2->SelectedIndex = 0;
270 ShowStatusMessage("Enumerating Webcams completed successfully.");
271 btnStartDevice2->IsEnabled = true;
272 }
273 }
274 catch (Exception ^e)
275 {
276 ShowExceptionMessage(e);
277 }
278 });
279 }
280 catch (Platform::Exception^ e)
281 {
282 ShowExceptionMessage(e);
283 }
284 }
285
AddEffectToImageStream()286 void AdvancedCapture::AddEffectToImageStream()
287 {
288 auto mediaCapture = m_mediaCaptureMgr.Get();
289 Windows::Media::Capture::VideoDeviceCharacteristic charecteristic = mediaCapture->MediaCaptureSettings->VideoDeviceCharacteristic;
290
291 if((charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::AllStreamsIdentical) &&
292 (charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::PreviewPhotoStreamsIdentical) &&
293 (charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::RecordPhotoStreamsIdentical))
294 {
295 Windows::Media::MediaProperties::IMediaEncodingProperties ^props = mediaCapture->VideoDeviceController->GetMediaStreamProperties(Windows::Media::Capture::MediaStreamType::Photo);
296 if(props->Type->Equals("Image"))
297 {
298 //Switch to a video media type instead since we cant add an effect to a image media type
299 Windows::Foundation::Collections::IVectorView<Windows::Media::MediaProperties::IMediaEncodingProperties^>^ supportedPropsList = mediaCapture->VideoDeviceController->GetAvailableMediaStreamProperties(Windows::Media::Capture::MediaStreamType::Photo);
300 {
301 unsigned int i = 0;
302 while (i < supportedPropsList->Size)
303 {
304 Windows::Media::MediaProperties::IMediaEncodingProperties^ props = supportedPropsList->GetAt(i);
305
306 String^ s = props->Type;
307 if(props->Type->Equals("Video"))
308 {
309 task<void>(mediaCapture->VideoDeviceController->SetMediaStreamPropertiesAsync(Windows::Media::Capture::MediaStreamType::Photo,props)).then([this](task<void> changeTypeTask)
310 {
311 try
312 {
313 changeTypeTask.get();
314 ShowStatusMessage("Change type on photo stream successful");
315 //Now add the effect on the image pin
316 task<void>(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task<void> effectTask3)
317 {
318 try
319 {
320 effectTask3.get();
321 m_bEffectAddedToPhoto = true;
322 ShowStatusMessage("Adding effect to photo stream successful");
323 EffectTypeCombo->IsEnabled = true;
324
325 }
326 catch(Exception ^e)
327 {
328 ShowExceptionMessage(e);
329 EffectTypeCombo->IsEnabled = true;
330 }
331 });
332
333 }
334 catch(Exception ^e)
335 {
336 ShowExceptionMessage(e);
337 EffectTypeCombo->IsEnabled = true;
338 }
339
340 });
341 break;
342
343 }
344 i++;
345 }
346 }
347 }
348 else
349 {
350 //Add the effect to the image pin if the type is already "Video"
351 task<void>(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task<void> effectTask3)
352 {
353 try
354 {
355 effectTask3.get();
356 m_bEffectAddedToPhoto = true;
357 ShowStatusMessage("Adding effect to photo stream successful");
358 EffectTypeCombo->IsEnabled = true;
359
360 }
361 catch(Exception ^e)
362 {
363 ShowExceptionMessage(e);
364 EffectTypeCombo->IsEnabled = true;
365 }
366 });
367 }
368 }
369 }
370
371 void AdvancedCapture::ShowStatusMessage(Platform::String^ text)
372 {
373 rootPage->NotifyUser(text, NotifyType::StatusMessage);
374 }
375
376 void AdvancedCapture::ShowExceptionMessage(Platform::Exception^ ex)
377 {
378 rootPage->NotifyUser(ex->Message, NotifyType::ErrorMessage);
379 }
380
381 void AdvancedCapture::EnableButton(bool enabled, String^ name)
382 {
383 if (name->Equals("StartDevice"))
384 {
385 btnStartDevice2->IsEnabled = enabled;
386 }
387 else if (name->Equals("StartPreview"))
388 {
389 btnStartPreview2->IsEnabled = enabled;
390 }
391 }
392
393 task<Windows::Storage::StorageFile^> AdvancedCapture::ReencodePhotoAsync(
394 Windows::Storage::StorageFile ^tempStorageFile,
395 Windows::Storage::FileProperties::PhotoOrientation photoRotation)
396 {
397 ReencodeState ^state = ref new ReencodeState();
398
399 return create_task(tempStorageFile->OpenAsync(Windows::Storage::FileAccessMode::Read)).then([state](Windows::Storage::Streams::IRandomAccessStream ^stream)
__anonf55c16f60902(Windows::Storage::Streams::IRandomAccessStream ^stream) 400 {
401 state->InputStream = stream;
402 return Windows::Graphics::Imaging::BitmapDecoder::CreateAsync(state->InputStream);
403 }).then([state](Windows::Graphics::Imaging::BitmapDecoder ^decoder)
__anonf55c16f60a02(Windows::Graphics::Imaging::BitmapDecoder ^decoder) 404 {
405 state->Decoder = decoder;
406 return Windows::Storage::KnownFolders::PicturesLibrary->CreateFileAsync(PHOTO_FILE_NAME, Windows::Storage::CreationCollisionOption::GenerateUniqueName);
407 }).then([state](Windows::Storage::StorageFile ^storageFile)
__anonf55c16f60b02(Windows::Storage::StorageFile ^storageFile) 408 {
409 state->PhotoStorage = storageFile;
410 return state->PhotoStorage->OpenAsync(Windows::Storage::FileAccessMode::ReadWrite);
411 }).then([state](Windows::Storage::Streams::IRandomAccessStream ^stream)
__anonf55c16f60c02(Windows::Storage::Streams::IRandomAccessStream ^stream) 412 {
413 state->OutputStream = stream;
414 state->OutputStream->Size = 0;
415 return Windows::Graphics::Imaging::BitmapEncoder::CreateForTranscodingAsync(state->OutputStream, state->Decoder);
416 }).then([state, photoRotation](Windows::Graphics::Imaging::BitmapEncoder ^encoder)
__anonf55c16f60d02(Windows::Graphics::Imaging::BitmapEncoder ^encoder) 417 {
418 state->Encoder = encoder;
419 auto properties = ref new Windows::Graphics::Imaging::BitmapPropertySet();
420 properties->Insert("System.Photo.Orientation",
421 ref new Windows::Graphics::Imaging::BitmapTypedValue((unsigned short)photoRotation, Windows::Foundation::PropertyType::UInt16));
422 return create_task(state->Encoder->BitmapProperties->SetPropertiesAsync(properties));
423 }).then([state]()
__anonf55c16f60e02() 424 {
425 return state->Encoder->FlushAsync();
426 }).then([tempStorageFile, state](task<void> previousTask)
__anonf55c16f60f02(task<void> previousTask) 427 {
428 auto result = state->PhotoStorage;
429 delete state;
430
431 tempStorageFile->DeleteAsync(Windows::Storage::StorageDeleteOption::PermanentDelete);
432
433 previousTask.get();
434
435 return result;
436 });
437 }
438
GetCurrentPhotoRotation()439 Windows::Storage::FileProperties::PhotoOrientation AdvancedCapture::GetCurrentPhotoRotation()
440 {
441 bool counterclockwiseRotation = m_bReversePreviewRotation;
442
443 if (m_bRotateVideoOnOrientationChange)
444 {
445 return PhotoRotationLookup(Windows::Graphics::Display::DisplayProperties::CurrentOrientation, counterclockwiseRotation);
446 }
447 else
448 {
449 return Windows::Storage::FileProperties::PhotoOrientation::Normal;
450 }
451 }
452
PrepareForVideoRecording()453 void AdvancedCapture::PrepareForVideoRecording()
454 {
455 Windows::Media::Capture::MediaCapture ^mediaCapture = m_mediaCaptureMgr.Get();
456 if (mediaCapture == nullptr)
457 {
458 return;
459 }
460
461 bool counterclockwiseRotation = m_bReversePreviewRotation;
462
463 if (m_bRotateVideoOnOrientationChange)
464 {
465 mediaCapture->SetRecordRotation(VideoRotationLookup(Windows::Graphics::Display::DisplayProperties::CurrentOrientation, counterclockwiseRotation));
466 }
467 else
468 {
469 mediaCapture->SetRecordRotation(Windows::Media::Capture::VideoRotation::None);
470 }
471 }
472
473 void AdvancedCapture::DisplayProperties_OrientationChanged(Platform::Object^ sender)
474 {
475 Windows::Media::Capture::MediaCapture ^mediaCapture = m_mediaCaptureMgr.Get();
476 if (mediaCapture == nullptr)
477 {
478 return;
479 }
480
481 bool previewMirroring = mediaCapture->GetPreviewMirroring();
482 bool counterclockwiseRotation = (previewMirroring && !m_bReversePreviewRotation) ||
483 (!previewMirroring && m_bReversePreviewRotation);
484
485 if (m_bRotateVideoOnOrientationChange)
486 {
487 mediaCapture->SetPreviewRotation(VideoRotationLookup(Windows::Graphics::Display::DisplayProperties::CurrentOrientation, counterclockwiseRotation));
488 }
489 else
490 {
491 mediaCapture->SetPreviewRotation(Windows::Media::Capture::VideoRotation::None);
492 }
493 }
494
PhotoRotationLookup(Windows::Graphics::Display::DisplayOrientations displayOrientation,bool counterclockwise)495 Windows::Storage::FileProperties::PhotoOrientation AdvancedCapture::PhotoRotationLookup(
496 Windows::Graphics::Display::DisplayOrientations displayOrientation, bool counterclockwise)
497 {
498 switch (displayOrientation)
499 {
500 case Windows::Graphics::Display::DisplayOrientations::Landscape:
501 return Windows::Storage::FileProperties::PhotoOrientation::Normal;
502
503 case Windows::Graphics::Display::DisplayOrientations::Portrait:
504 return (counterclockwise) ? Windows::Storage::FileProperties::PhotoOrientation::Rotate270:
505 Windows::Storage::FileProperties::PhotoOrientation::Rotate90;
506
507 case Windows::Graphics::Display::DisplayOrientations::LandscapeFlipped:
508 return Windows::Storage::FileProperties::PhotoOrientation::Rotate180;
509
510 case Windows::Graphics::Display::DisplayOrientations::PortraitFlipped:
511 return (counterclockwise) ? Windows::Storage::FileProperties::PhotoOrientation::Rotate90 :
512 Windows::Storage::FileProperties::PhotoOrientation::Rotate270;
513
514 default:
515 return Windows::Storage::FileProperties::PhotoOrientation::Unspecified;
516 }
517 }
518
VideoRotationLookup(Windows::Graphics::Display::DisplayOrientations displayOrientation,bool counterclockwise)519 Windows::Media::Capture::VideoRotation AdvancedCapture::VideoRotationLookup(
520 Windows::Graphics::Display::DisplayOrientations displayOrientation, bool counterclockwise)
521 {
522 switch (displayOrientation)
523 {
524 case Windows::Graphics::Display::DisplayOrientations::Landscape:
525 return Windows::Media::Capture::VideoRotation::None;
526
527 case Windows::Graphics::Display::DisplayOrientations::Portrait:
528 return (counterclockwise) ? Windows::Media::Capture::VideoRotation::Clockwise270Degrees :
529 Windows::Media::Capture::VideoRotation::Clockwise90Degrees;
530
531 case Windows::Graphics::Display::DisplayOrientations::LandscapeFlipped:
532 return Windows::Media::Capture::VideoRotation::Clockwise180Degrees;
533
534 case Windows::Graphics::Display::DisplayOrientations::PortraitFlipped:
535 return (counterclockwise) ? Windows::Media::Capture::VideoRotation::Clockwise90Degrees:
536 Windows::Media::Capture::VideoRotation::Clockwise270Degrees ;
537
538 default:
539 return Windows::Media::Capture::VideoRotation::None;
540 }
541 }
542
543 void SDKSample::MediaCapture::AdvancedCapture::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
544 {
545 try
546 {
547 create_task(m_mediaCaptureMgr->ClearEffectsAsync(Windows::Media::Capture::MediaStreamType::VideoPreview)).then([this](task<void> cleanTask)
__anonf55c16f61002(task<void> cleanTask) 548 {
549 m_bEffectAdded = true;
550 int index = EffectTypeCombo->SelectedIndex;
551 PropertySet^ props = ref new PropertySet();
552 props->Insert(L"{698649BE-8EAE-4551-A4CB-3EC98FBD3D86}", index);
553 create_task(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoPreview,"OcvTransform.OcvImageManipulations", props)).then([this](task<void> effectTask)
554 {
555 try
556 {
557 effectTask.get();
558
559 auto mediaCapture = m_mediaCaptureMgr.Get();
560 Windows::Media::Capture::VideoDeviceCharacteristic charecteristic = mediaCapture->MediaCaptureSettings->VideoDeviceCharacteristic;
561
562 ShowStatusMessage("Add effect successful to preview stream successful");
563 if((charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::AllStreamsIdentical) &&
564 (charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::PreviewRecordStreamsIdentical))
565 {
566 Windows::Media::MediaProperties::IMediaEncodingProperties ^props = mediaCapture->VideoDeviceController->GetMediaStreamProperties(Windows::Media::Capture::MediaStreamType::VideoRecord);
567 Windows::Media::MediaProperties::VideoEncodingProperties ^videoEncodingProperties = static_cast<Windows::Media::MediaProperties::VideoEncodingProperties ^>(props);
568 if(!videoEncodingProperties->Subtype->Equals("H264")) //Cant add an effect to an H264 stream
569 {
570 task<void>(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoRecord,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task<void> effectTask2)
571 {
572 try
573 {
574 effectTask2.get();
575 ShowStatusMessage("Add effect successful to record stream successful");
576 m_bEffectAddedToRecord = true;
577 AddEffectToImageStream();
578 EffectTypeCombo->IsEnabled = true;
579 }
580 catch(Exception ^e)
581 {
582 ShowExceptionMessage(e);
583 EffectTypeCombo->IsEnabled = true;
584 }
585 });
586 }
587 else
588 {
589 AddEffectToImageStream();
590 EffectTypeCombo->IsEnabled = true;
591 }
592
593 }
594 else
595 {
596 AddEffectToImageStream();
597 EffectTypeCombo->IsEnabled = true;
598 }
599 }
600 catch (Exception ^e)
601 {
602 ShowExceptionMessage(e);
603 EffectTypeCombo->IsEnabled = true;
604 }
605 });
606 });
607 }
608 catch (Platform::Exception ^e)
609 {
610 ShowExceptionMessage(e);
611 EffectTypeCombo->IsEnabled = true;
612 }
613 }
614