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 |
////////////////////////////////////////////////////////////
// Copyright (C) Roman Ryltsov, 2008-2009
// Created by Roman Ryltsov roman@alax.info
//
// $Id$
#include "stdafx.h"
#include "resource.h"
#include <dshow.h>
#include <d3d9.h>
#include <vmr9.h>
#pragma comment(lib, "strmiids.lib")
int _tmain(int argc, _TCHAR* argv[])
{
ATLENSURE_SUCCEEDED(CoInitialize(NULL));
_ATLTRY
{
CComPtr<IGraphBuilder> pGraphBuilder;
ATLENSURE_SUCCEEDED(pGraphBuilder.CoCreateInstance(CLSID_FilterGraph));
CComPtr<ICaptureGraphBuilder2> pCaptureGraphBuilder2;
ATLENSURE_SUCCEEDED(pCaptureGraphBuilder2.CoCreateInstance(CLSID_CaptureGraphBuilder2));
ATLENSURE_SUCCEEDED(pCaptureGraphBuilder2->SetFiltergraph(pGraphBuilder));
CComPtr<IBaseFilter> pSourceBaseFilter;
TCHAR pszPath[MAX_PATH] = { 0 };
ATLVERIFY(GetWindowsDirectory(pszPath, _countof(pszPath)));
ATLPath::Combine(pszPath, pszPath, _T("clock.avi"));
ATLENSURE_SUCCEEDED(pGraphBuilder->AddSourceFilter(CT2CW(pszPath), NULL, &pSourceBaseFilter));
CComPtr<IBaseFilter> pVmrBaseFilter;
ATLENSURE_SUCCEEDED(pVmrBaseFilter.CoCreateInstance(CLSID_VideoMixingRenderer9));
CComQIPtr<IVMRFilterConfig9> pVmrFilterConfig = pVmrBaseFilter;
ATLENSURE_THROW(pVmrFilterConfig, E_NOINTERFACE);
ATLENSURE_SUCCEEDED(pGraphBuilder->AddFilter(pVmrBaseFilter, NULL));
ATLENSURE_SUCCEEDED(pVmrFilterConfig->SetNumberOfStreams(1));
ATLENSURE_SUCCEEDED(pCaptureGraphBuilder2->RenderStream(NULL, NULL, pSourceBaseFilter, NULL, pVmrBaseFilter));
CComQIPtr<IMediaControl> pMediaControl = pGraphBuilder;
ATLENSURE_THROW(pMediaControl, E_NOINTERFACE);
ATLENSURE_SUCCEEDED(pMediaControl->Run());
MSG Message;
while(PeekMessage(&Message, NULL, WM_NULL, WM_NULL, PM_REMOVE))
DispatchMessage(&Message);
CDC Dc;
ATLVERIFY(Dc.CreateCompatibleDC(NULL));
Sleep(1000);
{
CComQIPtr<IVMRMixerBitmap9> pVmrMixerBitmap = pVmrBaseFilter;
ATLENSURE_THROW(pVmrMixerBitmap, E_NOINTERFACE);
for(; ; )
{
CBitmap Bitmap = AtlLoadBitmap(IDB_OVERLAY);
HGDIOBJ hPreviousBitmap = SelectObject(Dc, Bitmap);
VMR9AlphaBitmap AlphaBitmap;
ZeroMemory(&AlphaBitmap, sizeof AlphaBitmap);
AlphaBitmap.dwFlags = VMR9AlphaBitmap_hDC;
AlphaBitmap.hdc = Dc;
AlphaBitmap.rSrc = CRect(0, 0, 32, 32);
AlphaBitmap.rDest.left = (FLOAT) 0.75;
AlphaBitmap.rDest.top = (FLOAT) 0.75;
AlphaBitmap.rDest.right = (FLOAT) 0.95;
AlphaBitmap.rDest.bottom = (FLOAT) 0.95;
AlphaBitmap.fAlpha = 0.75;
const HRESULT nSetAlphaBitmapResult = pVmrMixerBitmap->SetAlphaBitmap(&AlphaBitmap);
ATLENSURE_SUCCEEDED(nSetAlphaBitmapResult);
for(UINT nIndex = 0; nIndex < 30; nIndex++)
{
Sleep(75);
AlphaBitmap.fAlpha -= (FLOAT) 0.50 / 30;
const HRESULT nUpdateAlphaBitmapParametersResult = pVmrMixerBitmap->UpdateAlphaBitmapParameters(&AlphaBitmap);
ATLENSURE_SUCCEEDED(nUpdateAlphaBitmapParametersResult);
}
SelectObject(Dc, hPreviousBitmap);
// NOTE: For a changed bitmap UpdateAlphaBitmapParameters is not going to work, it requires to SetAlphaBitmap
{
CBitmap AnotherBitmap = AtlLoadBitmap(IDB_ANOTHEROVERLAY);
hPreviousBitmap = SelectObject(Dc, AnotherBitmap);
//const HRESULT nUpdateAlphaBitmapParametersResult = pVmrMixerBitmap->UpdateAlphaBitmapParameters(&AlphaBitmap);
//ATLENSURE_SUCCEEDED(nUpdateAlphaBitmapParametersResult);
const HRESULT nSetAlphaBitmapResult = pVmrMixerBitmap->SetAlphaBitmap(&AlphaBitmap);
ATLENSURE_SUCCEEDED(nSetAlphaBitmapResult);
SelectObject(Dc, hPreviousBitmap);
Sleep(2000);
}
}
}
while(GetMessage(&Message, NULL, WM_NULL, WM_NULL))
DispatchMessage(&Message);
}
_ATLCATCHALL()
{
CoUninitialize();
_ATLRETHROW;
}
CoUninitialize();
return 0;
}
|