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