source: trunk/Utilities/MediaFoundation/VideoCaptureAsynchronous/VideoCaptureAsynchronous.cpp

Last change on this file was 801, checked in by roman, 9 months ago
  • Property svn:mime-type set to application/octet-stream
File size: 7.3 KB
Line 
1#include <winsdkver.h>
2#include <sdkddkver.h>
3#include <stdio.h>
4#include <tchar.h>
5#include <mfapi.h>
6#include <mfidl.h>
7#include <mfreadwrite.h>
8#include <atlbase.h>
9#include <atlcom.h>
10
11#pragma comment(lib, "mfplat.lib")
12#pragma comment(lib, "mf.lib")
13#pragma comment(lib, "mfreadwrite.lib")
14
15#define _A      ATLASSERT
16#define __C ATLENSURE_SUCCEEDED
17#define __D ATLENSURE_THROW
18
19static UINT32 g_nIndex = 0;
20
21class CModule :
22        public CComModule
23{
24};
25
26class ATL_NO_VTABLE CCallback :
27        public CComObjectRootEx<CComMultiThreadModelNoCS>,
28        public IMFSourceReaderCallback
29{
30public:
31
32BEGIN_COM_MAP(CCallback)
33        COM_INTERFACE_ENTRY(IMFSourceReaderCallback)
34END_COM_MAP()
35
36private:
37        CComPtr<IMFSourceReader> m_pSourceReader;
38        LONGLONG m_nBaseTime;
39
40public:
41// CCallback
42        CCallback()
43        {
44        }
45        VOID Initialize(IMFSourceReader* pSourceReader)
46        {
47                _A(!m_pSourceReader && pSourceReader);
48                m_pSourceReader = pSourceReader;
49                m_nBaseTime = 0;
50        }
51        VOID ReadSample()
52        {
53                _A(m_pSourceReader);
54                __C(m_pSourceReader->ReadSample(MF_SOURCE_READER_ANY_STREAM, 0, NULL, NULL, NULL, NULL));
55        }
56
57// IMFSourceReaderCallback
58        STDMETHOD(OnReadSample)(HRESULT nStatus, DWORD nStreamIndex, DWORD nStreamFlags, LONGLONG nTime, IMFSample* pSample) override
59        {
60                ATLTRACE(atlTraceCOM, 4, _T("nStatus 0x%08X, nStreamIndex %d, nStreamFlags 0x%X, nTime %I64d, pSample 0x%p\n"), nStatus, nStreamIndex, nStreamFlags, nTime, pSample);
61                nTime -= m_nBaseTime;
62                _tprintf(_T("nStatus 0x%08X, nStreamIndex %d, nStreamFlags 0x%X, nTime %.3f, pSample 0x%p\n"), nStatus, nStreamIndex, nStreamFlags, nTime / 1E7, (IMFSample*) pSample);
63                if(nStreamIndex == 0 && (nStreamFlags & MF_SOURCE_READERF_STREAMTICK))
64                {
65                        _A(!pSample);
66                        m_nBaseTime = nTime;
67                }
68                ReadSample();
69                return S_OK;
70        }
71        STDMETHOD(OnFlush)(DWORD nStreamIndex) override
72        {
73                ATLTRACE(atlTraceCOM, 4, _T("nStreamIndex %d\n"), nStreamIndex);
74                return S_OK;
75        }
76        STDMETHOD(OnEvent)(DWORD nStreamIndex, IMFMediaEvent* pMediaEvent) override
77        {
78                ATLTRACE(atlTraceCOM, 4, _T("nStreamIndex %d, pMediaEvent 0x%p\n"), nStreamIndex, pMediaEvent);
79                return S_OK;
80        }
81};
82
83int main()
84{
85        CModule Module;
86        __C(MFStartup(MF_VERSION));
87        {
88                CComPtr<IMFMediaSource> pMediaSource;
89                {
90                        CComPtr<IMFAttributes> pAttributes;
91                        __C(MFCreateAttributes(&pAttributes, 1));
92                        __C(pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID));
93                        CComHeapPtr<IMFActivate*> ppActivates;
94                        UINT32 nActivateCount = 0;
95                        __C(MFEnumDeviceSources(pAttributes, &ppActivates, &nActivateCount));
96                        __D(g_nIndex < nActivateCount, E_INVALIDARG);
97                        const CComPtr<IMFActivate> pActivate = ppActivates[g_nIndex];
98                        for(UINT32 nIndex = 0; nIndex < nActivateCount; nIndex++)
99                                reinterpret_cast<CComPtr<IMFActivate>&>(ppActivates[nIndex]).Release();
100                        __C(pActivate->ActivateObject(__uuidof(IMFMediaSource), (VOID**) &pMediaSource));
101                        CComHeapPtr<WCHAR> pszFriendlyName;
102                        __C(pActivate->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &pszFriendlyName, NULL));
103                        _tprintf(_T("Friendly Name: %ls\n"), (LPCWSTR) pszFriendlyName);
104                }
105                CComObject<CCallback>* pCallback;
106                __C(CComObject<CCallback>::CreateInstance(&pCallback));
107                _A(pCallback->m_dwRef == 0);
108                CComPtr<IMFAttributes> pAttributes;
109                __C(MFCreateAttributes(&pAttributes, 1));
110                __C(pAttributes->SetUnknown(MF_SOURCE_READER_ASYNC_CALLBACK, pCallback));
111                CComPtr<IMFSourceReader> pSourceReader;
112                __C(MFCreateSourceReaderFromMediaSource(pMediaSource, pAttributes, &pSourceReader));
113                pCallback->Initialize(pSourceReader);
114                pCallback->ReadSample();
115                for(; ; )
116                        SwitchToThread();
117        }
118        __C(MFShutdown());
119    return 0;
120}
121
Note: See TracBrowser for help on using the repository browser.