1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//********************************************************* 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (c) Microsoft. All rights reserved. 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//********************************************************* 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// AdvancedCapture.xaml.cpp 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Implementation of the AdvancedCapture class 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "pch.h" 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "AdvancedCapture.xaml.h" 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace SDKSample::MediaCapture; 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml; 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Navigation; 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Data; 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::System; 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Foundation; 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Foundation::Collections; 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Platform; 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI; 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Core; 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml; 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Controls; 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Data; 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Media; 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Storage; 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Media::MediaProperties; 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Storage::Streams; 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::System; 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Media::Imaging; 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Devices::Enumeration; 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerref class ReencodeState sealed 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic: 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ReencodeState() 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual ~ReencodeState() 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (InputStream != nullptr) 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler delete InputStream; 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (OutputStream != nullptr) 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler delete OutputStream; 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinternal: 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Storage::Streams::IRandomAccessStream ^InputStream; 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Storage::Streams::IRandomAccessStream ^OutputStream; 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Storage::StorageFile ^PhotoStorage; 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Graphics::Imaging::BitmapDecoder ^Decoder; 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Graphics::Imaging::BitmapEncoder ^Encoder; 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerAdvancedCapture::AdvancedCapture() 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler InitializeComponent(); 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ScenarioInit(); 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <summary> 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// Invoked when this page is about to be displayed in a Frame. 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// </summary> 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <param name="e">Event data that describes how this page was reached. The Parameter 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// property is typically used to configure the page.</param> 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::OnNavigatedTo(NavigationEventArgs^ e) 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // A pointer back to the main page. This is needed if you want to call methods in MainPage such 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // as NotifyUser() 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rootPage = MainPage::Current; 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_orientationChangedEventToken = Windows::Graphics::Display::DisplayProperties::OrientationChanged += ref new Windows::Graphics::Display::DisplayPropertiesEventHandler(this, &AdvancedCapture::DisplayProperties_OrientationChanged); 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::OnNavigatedFrom(NavigationEventArgs^ e) 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::MediaControl::SoundLevelChanged -= m_eventRegistrationToken; 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Graphics::Display::DisplayProperties::OrientationChanged -= m_orientationChangedEventToken; 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::ScenarioInit() 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rootPage = MainPage::Current; 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler btnStartDevice2->IsEnabled = true; 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler btnStartPreview2->IsEnabled = false; 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bRecording = false; 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bPreviewing = false; 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAdded = false; 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewElement2->Source = nullptr; 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage(""); 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = false; 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewCanvas2->Visibility = Windows::UI::Xaml::Visibility::Collapsed; 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnumerateWebcamsAsync(); 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bSuspended = false; 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::ScenarioReset() 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewCanvas2->Visibility = Windows::UI::Xaml::Visibility::Collapsed; 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ScenarioInit(); 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::Failed(Windows::Media::Capture::MediaCapture ^currentCaptureObject, Windows::Media::Capture::MediaCaptureFailedEventArgs^ currentFailure) 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler String ^message = "Fatal error" + currentFailure->Message; 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler create_task(Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ref new Windows::UI::Core::DispatchedHandler([this, message]() 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage(message); 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }))); 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::btnStartDevice_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnableButton(false, "StartDevice"); 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Starting device"); 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto mediaCapture = ref new Windows::Media::Capture::MediaCapture(); 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_mediaCaptureMgr = mediaCapture; 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto settings = ref new Windows::Media::Capture::MediaCaptureInitializationSettings(); 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto chosenDevInfo = m_devInfoCollection->GetAt(EnumedDeviceList2->SelectedIndex); 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler settings->VideoDeviceId = chosenDevInfo->Id; 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (chosenDevInfo->EnclosureLocation != nullptr && chosenDevInfo->EnclosureLocation->Panel == Windows::Devices::Enumeration::Panel::Back) 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bRotateVideoOnOrientationChange = true; 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bReversePreviewRotation = false; 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if (chosenDevInfo->EnclosureLocation != nullptr && chosenDevInfo->EnclosureLocation->Panel == Windows::Devices::Enumeration::Panel::Front) 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bRotateVideoOnOrientationChange = true; 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bReversePreviewRotation = true; 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bRotateVideoOnOrientationChange = false; 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler create_task(mediaCapture->InitializeAsync(settings)).then([this](task<void> initTask) 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler initTask.get(); 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto mediaCapture = m_mediaCaptureMgr.Get(); 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DisplayProperties_OrientationChanged(nullptr); 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnableButton(true, "StartPreview"); 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnableButton(true, "StartStopRecord"); 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnableButton(true, "TakePhoto"); 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Device initialized successful"); 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mediaCapture->Failed += ref new Windows::Media::Capture::MediaCaptureFailedEventHandler(this, &AdvancedCapture::Failed); 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Exception ^ e) 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Platform::Exception^ e) 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::btnStartPreview_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bPreviewing = false; 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Starting preview"); 187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnableButton(false, "StartPreview"); 188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto mediaCapture = m_mediaCaptureMgr.Get(); 190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewCanvas2->Visibility = Windows::UI::Xaml::Visibility::Visible; 191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewElement2->Source = mediaCapture; 192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler create_task(mediaCapture->StartPreviewAsync()).then([this](task<void> previewTask) 193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewTask.get(); 197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bPreviewing = true; 198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Start preview successful"); 199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Exception ^e) 201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Platform::Exception^ e) 207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bPreviewing = false; 209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewElement2->Source = nullptr; 210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnableButton(true, "StartPreview"); 211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::lstEnumedDevices_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e) 216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ( m_bPreviewing ) 218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler create_task(m_mediaCaptureMgr->StopPreviewAsync()).then([this](task<void> previewTask) 220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewTask.get(); 224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bPreviewing = false; 225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Exception ^e) 227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler btnStartDevice2->IsEnabled = true; 234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler btnStartPreview2->IsEnabled = false; 235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bRecording = false; 236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previewElement2->Source = nullptr; 237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = false; 238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAdded = false; 239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAddedToRecord = false; 240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAddedToPhoto = false; 241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage(""); 242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::EnumerateWebcamsAsync() 245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Enumerating Webcams..."); 249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_devInfoCollection = nullptr; 250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnumedDeviceList2->Items->Clear(); 252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler task<DeviceInformationCollection^>(DeviceInformation::FindAllAsync(DeviceClass::VideoCapture)).then([this](task<DeviceInformationCollection^> findTask) 254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_devInfoCollection = findTask.get(); 258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (m_devInfoCollection == nullptr || m_devInfoCollection->Size == 0) 259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("No WebCams found."); 261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for(unsigned int i = 0; i < m_devInfoCollection->Size; i++) 265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto devInfo = m_devInfoCollection->GetAt(i); 267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnumedDeviceList2->Items->Append(devInfo->Name); 268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EnumedDeviceList2->SelectedIndex = 0; 270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Enumerating Webcams completed successfully."); 271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler btnStartDevice2->IsEnabled = true; 272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Exception ^e) 275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Platform::Exception^ e) 281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::AddEffectToImageStream() 287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto mediaCapture = m_mediaCaptureMgr.Get(); 289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::Capture::VideoDeviceCharacteristic charecteristic = mediaCapture->MediaCaptureSettings->VideoDeviceCharacteristic; 290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if((charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::AllStreamsIdentical) && 292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::PreviewPhotoStreamsIdentical) && 293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::RecordPhotoStreamsIdentical)) 294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::MediaProperties::IMediaEncodingProperties ^props = mediaCapture->VideoDeviceController->GetMediaStreamProperties(Windows::Media::Capture::MediaStreamType::Photo); 296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(props->Type->Equals("Image")) 297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //Switch to a video media type instead since we cant add an effect to a image media type 299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Foundation::Collections::IVectorView<Windows::Media::MediaProperties::IMediaEncodingProperties^>^ supportedPropsList = mediaCapture->VideoDeviceController->GetAvailableMediaStreamProperties(Windows::Media::Capture::MediaStreamType::Photo); 300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler unsigned int i = 0; 302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while (i < supportedPropsList->Size) 303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::MediaProperties::IMediaEncodingProperties^ props = supportedPropsList->GetAt(i); 305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler String^ s = props->Type; 307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(props->Type->Equals("Video")) 308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler task<void>(mediaCapture->VideoDeviceController->SetMediaStreamPropertiesAsync(Windows::Media::Capture::MediaStreamType::Photo,props)).then([this](task<void> changeTypeTask) 310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler changeTypeTask.get(); 314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Change type on photo stream successful"); 315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //Now add the effect on the image pin 316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler task<void>(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task<void> effectTask3) 317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler effectTask3.get(); 321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAddedToPhoto = true; 322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Adding effect to photo stream successful"); 323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch(Exception ^e) 327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch(Exception ^e) 335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler i++; 345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //Add the effect to the image pin if the type is already "Video" 351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler task<void>(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task<void> effectTask3) 352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler effectTask3.get(); 356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAddedToPhoto = true; 357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Adding effect to photo stream successful"); 358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch(Exception ^e) 362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::ShowStatusMessage(Platform::String^ text) 372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rootPage->NotifyUser(text, NotifyType::StatusMessage); 374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::ShowExceptionMessage(Platform::Exception^ ex) 377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rootPage->NotifyUser(ex->Message, NotifyType::ErrorMessage); 379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::EnableButton(bool enabled, String^ name) 382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (name->Equals("StartDevice")) 384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler btnStartDevice2->IsEnabled = enabled; 386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if (name->Equals("StartPreview")) 388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler btnStartPreview2->IsEnabled = enabled; 390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertask<Windows::Storage::StorageFile^> AdvancedCapture::ReencodePhotoAsync( 394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Storage::StorageFile ^tempStorageFile, 395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Storage::FileProperties::PhotoOrientation photoRotation) 396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ReencodeState ^state = ref new ReencodeState(); 398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return create_task(tempStorageFile->OpenAsync(Windows::Storage::FileAccessMode::Read)).then([state](Windows::Storage::Streams::IRandomAccessStream ^stream) 400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler state->InputStream = stream; 402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Graphics::Imaging::BitmapDecoder::CreateAsync(state->InputStream); 403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }).then([state](Windows::Graphics::Imaging::BitmapDecoder ^decoder) 404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler state->Decoder = decoder; 406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Storage::KnownFolders::PicturesLibrary->CreateFileAsync(PHOTO_FILE_NAME, Windows::Storage::CreationCollisionOption::GenerateUniqueName); 407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }).then([state](Windows::Storage::StorageFile ^storageFile) 408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler state->PhotoStorage = storageFile; 410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return state->PhotoStorage->OpenAsync(Windows::Storage::FileAccessMode::ReadWrite); 411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }).then([state](Windows::Storage::Streams::IRandomAccessStream ^stream) 412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler state->OutputStream = stream; 414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler state->OutputStream->Size = 0; 415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Graphics::Imaging::BitmapEncoder::CreateForTranscodingAsync(state->OutputStream, state->Decoder); 416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }).then([state, photoRotation](Windows::Graphics::Imaging::BitmapEncoder ^encoder) 417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler state->Encoder = encoder; 419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto properties = ref new Windows::Graphics::Imaging::BitmapPropertySet(); 420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler properties->Insert("System.Photo.Orientation", 421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ref new Windows::Graphics::Imaging::BitmapTypedValue((unsigned short)photoRotation, Windows::Foundation::PropertyType::UInt16)); 422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return create_task(state->Encoder->BitmapProperties->SetPropertiesAsync(properties)); 423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }).then([state]() 424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return state->Encoder->FlushAsync(); 426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }).then([tempStorageFile, state](task<void> previousTask) 427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto result = state->PhotoStorage; 429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler delete state; 430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tempStorageFile->DeleteAsync(Windows::Storage::StorageDeleteOption::PermanentDelete); 432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler previousTask.get(); 434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return result; 436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 439793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerWindows::Storage::FileProperties::PhotoOrientation AdvancedCapture::GetCurrentPhotoRotation() 440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool counterclockwiseRotation = m_bReversePreviewRotation; 442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (m_bRotateVideoOnOrientationChange) 444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return PhotoRotationLookup(Windows::Graphics::Display::DisplayProperties::CurrentOrientation, counterclockwiseRotation); 446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Storage::FileProperties::PhotoOrientation::Normal; 450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::PrepareForVideoRecording() 454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::Capture::MediaCapture ^mediaCapture = m_mediaCaptureMgr.Get(); 456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (mediaCapture == nullptr) 457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool counterclockwiseRotation = m_bReversePreviewRotation; 462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (m_bRotateVideoOnOrientationChange) 464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mediaCapture->SetRecordRotation(VideoRotationLookup(Windows::Graphics::Display::DisplayProperties::CurrentOrientation, counterclockwiseRotation)); 466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mediaCapture->SetRecordRotation(Windows::Media::Capture::VideoRotation::None); 470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid AdvancedCapture::DisplayProperties_OrientationChanged(Platform::Object^ sender) 474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::Capture::MediaCapture ^mediaCapture = m_mediaCaptureMgr.Get(); 476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (mediaCapture == nullptr) 477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool previewMirroring = mediaCapture->GetPreviewMirroring(); 482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool counterclockwiseRotation = (previewMirroring && !m_bReversePreviewRotation) || 483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (!previewMirroring && m_bReversePreviewRotation); 484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (m_bRotateVideoOnOrientationChange) 486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mediaCapture->SetPreviewRotation(VideoRotationLookup(Windows::Graphics::Display::DisplayProperties::CurrentOrientation, counterclockwiseRotation)); 488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mediaCapture->SetPreviewRotation(Windows::Media::Capture::VideoRotation::None); 492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 495793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerWindows::Storage::FileProperties::PhotoOrientation AdvancedCapture::PhotoRotationLookup( 496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Graphics::Display::DisplayOrientations displayOrientation, bool counterclockwise) 497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch (displayOrientation) 499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::Landscape: 501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Storage::FileProperties::PhotoOrientation::Normal; 502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::Portrait: 504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (counterclockwise) ? Windows::Storage::FileProperties::PhotoOrientation::Rotate270: 505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Storage::FileProperties::PhotoOrientation::Rotate90; 506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::LandscapeFlipped: 508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Storage::FileProperties::PhotoOrientation::Rotate180; 509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::PortraitFlipped: 511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (counterclockwise) ? Windows::Storage::FileProperties::PhotoOrientation::Rotate90 : 512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Storage::FileProperties::PhotoOrientation::Rotate270; 513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler default: 515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Storage::FileProperties::PhotoOrientation::Unspecified; 516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 519793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerWindows::Media::Capture::VideoRotation AdvancedCapture::VideoRotationLookup( 520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Graphics::Display::DisplayOrientations displayOrientation, bool counterclockwise) 521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch (displayOrientation) 523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::Landscape: 525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Media::Capture::VideoRotation::None; 526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::Portrait: 528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (counterclockwise) ? Windows::Media::Capture::VideoRotation::Clockwise270Degrees : 529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::Capture::VideoRotation::Clockwise90Degrees; 530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::LandscapeFlipped: 532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Media::Capture::VideoRotation::Clockwise180Degrees; 533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case Windows::Graphics::Display::DisplayOrientations::PortraitFlipped: 535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (counterclockwise) ? Windows::Media::Capture::VideoRotation::Clockwise90Degrees: 536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::Capture::VideoRotation::Clockwise270Degrees ; 537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler default: 539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Windows::Media::Capture::VideoRotation::None; 540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid SDKSample::MediaCapture::AdvancedCapture::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler create_task(m_mediaCaptureMgr->ClearEffectsAsync(Windows::Media::Capture::MediaStreamType::VideoPreview)).then([this](task<void> cleanTask) 548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAdded = true; 550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int index = EffectTypeCombo->SelectedIndex; 551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PropertySet^ props = ref new PropertySet(); 552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler props->Insert(L"{698649BE-8EAE-4551-A4CB-3EC98FBD3D86}", index); 553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler create_task(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoPreview,"OcvTransform.OcvImageManipulations", props)).then([this](task<void> effectTask) 554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler effectTask.get(); 558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler auto mediaCapture = m_mediaCaptureMgr.Get(); 560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::Capture::VideoDeviceCharacteristic charecteristic = mediaCapture->MediaCaptureSettings->VideoDeviceCharacteristic; 561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Add effect successful to preview stream successful"); 563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if((charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::AllStreamsIdentical) && 564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (charecteristic != Windows::Media::Capture::VideoDeviceCharacteristic::PreviewRecordStreamsIdentical)) 565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::MediaProperties::IMediaEncodingProperties ^props = mediaCapture->VideoDeviceController->GetMediaStreamProperties(Windows::Media::Capture::MediaStreamType::VideoRecord); 567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Windows::Media::MediaProperties::VideoEncodingProperties ^videoEncodingProperties = static_cast<Windows::Media::MediaProperties::VideoEncodingProperties ^>(props); 568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(!videoEncodingProperties->Subtype->Equals("H264")) //Cant add an effect to an H264 stream 569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler task<void>(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoRecord,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task<void> effectTask2) 571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler try 573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler effectTask2.get(); 575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowStatusMessage("Add effect successful to record stream successful"); 576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler m_bEffectAddedToRecord = true; 577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler AddEffectToImageStream(); 578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch(Exception ^e) 581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler AddEffectToImageStream(); 590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler AddEffectToImageStream(); 597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Exception ^e) 601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }); 607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler catch (Platform::Exception ^e) 609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ShowExceptionMessage(e); 611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EffectTypeCombo->IsEnabled = true; 612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 614