root/trunk/VmrMixerBitmapSample01/VmrMixerBitmapSample01.cpp

User picture

Author: alax

Revision: 304 («Previous)

(Sep 18 16:24 2009 UTC) Over 2 years ago


  

 
Show/hide line numbers
////////////////////////////////////////////////////////////
// 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;
}