-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathCommandVid.cpp
More file actions
138 lines (117 loc) · 4.61 KB
/
CommandVid.cpp
File metadata and controls
138 lines (117 loc) · 4.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//
// test.cpp - A DirectShow console application
// written by Ted Burke on 26-9-2011
//
// Info about building DirectShow applications:
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd377592%28v=vs.85%29.aspx
//
//
#include <windows.h>
#include <dshow.h>
// Would the following line suffice to pull in required library?
//#pragma comment(lib, "strmiids")
void main()
{
HRESULT hr;
// DirectShow objects
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
IMoniker *pMoniker = NULL;
IPropertyBag *pPropBag = NULL;
// More DirectShow objects for graph
IGraphBuilder *pGraph = NULL;
ICaptureGraphBuilder2 *pBuilder = NULL;
IBaseFilter *pCap = NULL;
IBaseFilter *pCompressor = NULL;
IMediaControl *pMediaControl = NULL;
printf("Initialising...\n");
//CoInitialize(NULL);
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// Create filter graph
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph); // Filter graph manager
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void **)&pBuilder); // Capture Graph Builder.
pBuilder->SetFiltergraph(pGraph);
// Create system device enumerator
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
// Look for video input device
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); // Video input device enumerator
if (hr == VFW_E_NOT_FOUND) {printf("No video input devices found.\n"); return;}
hr = pEnum->Next(1, &pMoniker, NULL); // Get moniker for next video input device
pEnum->Release();
// Get video input device name
hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag)); // Get properties of this video input device
VARIANT var;
VariantInit(&var);
//hr = pPropBag->Read(L"Description", &var, 0);
hr = pPropBag->Read(L"FriendlyName", &var, 0);
printf("%ls\n", var.bstrVal);
VariantClear(&var);
pPropBag->Release();
//hr = pPropBag->Write(L"FriendlyName", &var);
//hr = pPropBag->Read(L"DevicePath", &var, 0);
// The device path is not intended for display.
//printf("Device path: %S\n", var.bstrVal);
//VariantClear(&var);
// Build graph
//pGraph->RenderFile(L"C:\\Documents and Settings\\Administrator\\Desktop\\EI Accreditation - April 2011\\robosumo_evidence\\video evidence\\staging\\robosumo_2008.avi", NULL);
// Create capture filter and add to graph
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
hr = pGraph->AddFilter(pCap, L"Capture Filter");
pMoniker->Release();
// Create an enumerator for video compression devices
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnum, 0);
while (S_OK == pEnum->Next(1, &pMoniker, NULL))
{
IPropertyBag *pPropBag = NULL;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
VARIANT var;
VariantInit(&var);
hr = pPropBag->Read(L"FriendlyName", &var, 0);
printf("%ls", var.bstrVal);
//if (wcscmp(var.bstrVal, L"Microsoft H.263 Video Codec") == 0)
if (wcscmp(var.bstrVal, L"WMVideo9 Encoder DMO") == 0)
{
// This is the desired compression filter
printf(" ### ");
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCompressor);
if (SUCCEEDED(hr)) printf(" +"); else printf(" -");
hr = pGraph->AddFilter(pCompressor, L"Compressor");
if (SUCCEEDED(hr)) printf(" +"); else printf(" -");
}
printf("\n");
VariantClear(&var);
pPropBag->Release();
pMoniker->Release();
}
pEnum->Release();
// Prepare to output to file
IBaseFilter *ppf;
IFileSinkFilter *pSink;
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\ted_test.avi", &ppf, &pSink);
// Connect up the filter graph - preview and capture streams
printf("Connecting up the filter graph... ");
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, pCompressor, ppf);
if (SUCCEEDED(hr)) printf(" +"); else printf(" -");
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
if (SUCCEEDED(hr)) printf(" +"); else printf(" -");
printf("\n");
// Get media control interfaces to graph builder object
hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&pMediaControl);
// Run graph
printf("Previewing and capturing video...");
pMediaControl->Run();
Sleep(5000); // 5 second delay
pMediaControl->Stop();
printf("Done\n");
// Release DirectShow COM objects
pMediaControl->Release();
pCompressor->Release();
pCap->Release();
pBuilder->Release();
pGraph->Release();
pDevEnum->Release();
CoUninitialize();
// Wait for a key press before exiting
printf("Press enter to exit...\n");
getchar();
}