The following code demonstrates an advanced capture application. It utilizes most of the functions available in the ltmfCapture object.
// include the LEAD Media Foundation TOOLKIT header
#include "ltmf.h"
#include "resource.h"
#include <tchar.h>
#include <stdio.h>
#include <olectl.h>
#include <math.h>
#include <assert.h>
#define SZ_WNDCLASS_CAPTURE _T("CAPTURE WNDCLASS")
#define WM_CAPTURENOTIFY (WM_USER + 1000)
HINSTANCE g_hInstance; // application instance handle
HWND g_hwndCapture; // video frame window
IltmfCapture* g_pCapture; // capture object interface pointer
//
// FreeTarget
// resets target and free asssociated resources
//
void FreeTarget(void)
{
long type;
VARIANT var;
g_pCapture->get_TargetType(&type);
if(type == ltmfCapture_Target_File)
{
g_pCapture->ResetTarget();
}
}
//
// SnapFrameToVideo
// resizes the frame window to match the video width and height
//
void SnapFrameToVideo(void)
{
HWND hwnd;
RECT rcWindow, rcClient;
long cx, cy;
// get the frame window
g_pCapture->get_VideoWindowFrame((long*) &hwnd);
// get the video dimensions
g_pCapture->get_VideoWidth(&cx);
g_pCapture->get_VideoHeight(&cy);
// adjust by the border dimensions
GetWindowRect(hwnd, &rcWindow);
GetClientRect(hwnd, &rcClient);
cx += ((rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left));
cy += ((rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top));
// resize the window
SetWindowPos(hwnd, NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER);
}
//
// CaptureWndProc
// video frame window procedure
//
LRESULT CALLBACK CaptureWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
VARIANT_BOOL f;
HRESULT hr;
HGLOBAL hDIB;
IPictureDisp* pPictureDisp;
BSTR bstr;
IltmfDevices* pDevices;
long index;
long l;
long l2;
BOOL fActive;
ltmfSizeMode sm;
TCHAR sz[2048];
LPTSTR p;
double d;
VARIANT var;
long x, y, cx, cy;
RECT rc;
POINT pt;
switch (message)
{
case WM_CREATE:
g_hwndCapture = hwnd;
// window is the video window frame
g_pCapture->put_VideoWindowFrame((long) hwnd);
// want notification messages as well
g_pCapture->SetNotifyWindow((long) hwnd, WM_CAPTURENOTIFY);
// set preview source video only
g_pCapture->put_PreviewSource(ltmfCapture_Preview_Video);
// enable preview
g_pCapture->put_Preview(VARIANT_TRUE);
// assign initial frame delay
g_pCapture->put_FrameDelay(1.0);
// assign a target file
bstr = SysAllocString(L"c:\\target.mp4");
g_pCapture->put_TargetFile(bstr);
SysFreeString(bstr);
// set output format to MP4
g_pCapture->put_TargetFormat(ltmfCapture_TargetFormat_MP4);
#ifdef _DEBUG
{
long v;
g_pCapture->get_TargetFormat(&v);
assert(v == ltmfCapture_TargetFormat_MP4);
}
#endif
// get target format
IltmfTargetFormats* pTargetFormats;
IltmfTargetFormat* pTargetFormat;
g_pCapture->get_TargetFormats(&pTargetFormats);
long v;
pTargetFormats->get_Selection(&v);
pTargetFormats->Item(v, &pTargetFormat);
pTargetFormats->Release();
// get target video formats
IltmfTargetVideoFormats* pTargetVideoFormats;
pTargetFormat->get_VideoFormats(&pTargetVideoFormats);
// select the H264 target video format
bstr = SysAllocString(L"{34363248-0000-0010-8000-00AA00389B71}");
pTargetVideoFormats->Find(bstr, &index);
SysFreeString(bstr);
if(index < 0)
{
// video target format isn't registered
pTargetFormat->Release();
pTargetVideoFormats->Release();
return E_FAIL;
}
pTargetVideoFormats->put_Selection(index);
pTargetVideoFormats->Release();
// get target audio formats
IltmfTargetAudioFormats* pTargetAudioFormats;
pTargetFormat->get_AudioFormats(&pTargetAudioFormats);
// select the AAC target audio format
bstr = SysAllocString(L"{00001610-0000-0010-8000-00AA00389B71}");
pTargetAudioFormats->Find(bstr, &index);
SysFreeString(bstr);
if(index < 0)
{
// audio target format isn't registered
pTargetFormat->Release();
pTargetAudioFormats->Release();
return E_FAIL;
}
pTargetAudioFormats->put_Selection(index);
pTargetAudioFormats->Release();
pTargetFormat->Release();
// select the first audio device available
g_pCapture->get_AudioDevices(&pDevices);
pDevices->put_Selection(0);
pDevices->Release();
// select the first video device available
g_pCapture->get_VideoDevices(&pDevices);
pDevices->put_Selection(0);
pDevices->Release();
SnapFrameToVideo();
return 0;
break;
case WM_CAPTURENOTIFY:
switch(wParam)
{
case ltmfCapture_Notify_Started:
_stprintf(sz, _T("Started"));
SetWindowText(hwnd, sz);
break;
case ltmfCapture_Notify_Complete:
g_pCapture->get_Mode(&l);
if(l == ltmfCapture_Mode_Still)
{
_stprintf(sz, _T("Complete - [still]"));
}
else
{
g_pCapture->get_TargetType(&l);
if(l == ltmfCapture_Target_File)
{
g_pCapture->get_TargetFile(&bstr);
_stprintf(sz, _T("Complete - [%ls]"), bstr);
SysFreeString(bstr);
}
}
SetWindowText(hwnd, sz);
break;
case ltmfCapture_Notify_ErrorAbort:
_stprintf(sz, _T("Error 0x%.8X. Capture stopped."), lParam);
MessageBox(hwnd, sz, _T("Play"), MB_ICONEXCLAMATION | MB_OK);
break;
case ltmfCapture_Notify_Progress:
p = sz;
*p = _T('\0');
hr = g_pCapture->get_NumDropped(&l);
if(SUCCEEDED(hr))
{
if(p != sz)
p += _stprintf(p, _T(", "));
p += _stprintf(p, _T("Dropped: %d"), l);
}
hr = g_pCapture->get_NumNotDropped(&l);
if(SUCCEEDED(hr))
{
if(p != sz)
p += _stprintf(p, _T(", "));
p += _stprintf(p, _T("Not Dropped: %d"), l);
}
hr = g_pCapture->get_AverageFrameSize(&l);
if(SUCCEEDED(hr))
{
if(p != sz)
p += _stprintf(p, _T(", "));
p += _stprintf(p, _T("Frame Size: %d"), l);
}
g_pCapture->get_Mode(&l);
if(l != ltmfCapture_Mode_Still || l != ltmfCapture_Mode_ManualFrames)
{
// only display the capture time for free running captures
hr = g_pCapture->get_CaptureTime(&d);
if(SUCCEEDED(hr))
{
if(p != sz)
p += _stprintf(p, _T(", "));
p += _stprintf(p, _T("Time: %f"), d);
}
}
SetWindowText(hwnd, sz);
break;
}
return 0;
break;
case WM_KEYDOWN:
if(wParam == VK_ESCAPE)
{
// if fullscreen mode then exit it
g_pCapture->get_FullScreenMode(&f);
if(f)
{
g_pCapture->put_FullScreenMode(VARIANT_FALSE);
return 0;
}
}
break;
case WM_DESTROY:
FreeTarget();
// no video frame
g_pCapture->put_VideoWindowFrame((long) NULL);
// no more notifications
g_pCapture->SetNotifyWindow((long) NULL, 0);
PostQuitMessage(0);
break;
case WM_INITMENUPOPUP:
if(GetSubMenu(GetMenu(hwnd), 0) == (HMENU)wParam)
{
// determine whether the object is active
g_pCapture->get_State(&l);
fActive = (l == ltmfCapture_State_Pending || l == ltmfCapture_State_Running);
// enable stop if active
EnableMenuItem((HMENU) wParam, ID_CONTROL_STOPCAPTURE, fActive ? MF_ENABLED : MF_GRAYED);
// enable run if paused
EnableMenuItem((HMENU) wParam, ID_CONTROL_RUN, (l == ltmfCapture_State_Paused) ? MF_ENABLED : MF_GRAYED);
// enable pause if running or pending
EnableMenuItem((HMENU) wParam, ID_CONTROL_PAUSE, (l == ltmfCapture_State_Running || l == ltmfCapture_State_Pending) ? MF_ENABLED : MF_GRAYED);
// can perform normal capture?
g_pCapture->IsModeAvailable(ltmfCapture_Mode_VideoOrAudio, &f);
EnableMenuItem((HMENU) wParam, ID_CONTROL_STARTCAPTURE, f ? MF_ENABLED : MF_GRAYED);
// can perform auto frame capture?
g_pCapture->IsModeAvailable(ltmfCapture_Mode_AutoFrames, &f);
EnableMenuItem((HMENU) wParam, ID_CONTROL_CAPTUREAUTOFRAMES, f ? MF_ENABLED : MF_GRAYED);
// can perform manual frame capture?
g_pCapture->IsModeAvailable(ltmfCapture_Mode_ManualFrames, &f);
EnableMenuItem((HMENU) wParam, ID_CONTROL_CAPTUREMANUALFRAMES, f ? MF_ENABLED : MF_GRAYED);
// can perform still image capture?
g_pCapture->IsModeAvailable(ltmfCapture_Mode_Still, &f);
EnableMenuItem((HMENU) wParam, ID_CONTROL_CAPTUREDIB, f ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_CAPTUREPICTURE, f ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_GETSTILLDIB, f ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_GETSTILLPICTURE, f ? MF_ENABLED : MF_GRAYED);
// check the current video size mode
g_pCapture->get_VideoWindowSizeMode(&sm);
CheckMenuItem((HMENU) wParam, ID_CONTROL_FITTOWINDOW, (sm == ltmfFit) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem((HMENU) wParam, ID_CONTROL_STRETCHTOWINDOW, (sm == ltmfStretch) ? MF_CHECKED : MF_UNCHECKED);
// check preview
g_pCapture->get_Preview(&f);
CheckMenuItem((HMENU) wParam, ID_CONTROL_PREVIEW, f ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_PREVIEW, !fActive ? MF_ENABLED : MF_GRAYED);
// check preview audio
g_pCapture->get_PreviewSource(&l);
CheckMenuItem((HMENU) wParam, ID_CONTROL_PREVIEWVIDEOANDAUDIO, (l == ltmfCapture_Preview_VideoAndAudio) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_PREVIEWVIDEOANDAUDIO, !fActive ? MF_ENABLED : MF_GRAYED);
// check frame rate
g_pCapture->get_UseFrameRate(&f);
g_pCapture->get_FrameRate(&d);
CheckMenuItem((HMENU) wParam, ID_CONTROL_FRAMERATE_DEFAULT, (!f) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem((HMENU) wParam, ID_CONTROL_FRAMERATE_15FPS, (f && fabs(d - 15.0) < 0.1) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem((HMENU) wParam, ID_CONTROL_FRAMERATE_30FPS, (f && fabs(d - 30.0) < 0.1) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_FRAMERATE_DEFAULT, (!fActive) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_FRAMERATE_15FPS, (!fActive) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_FRAMERATE_30FPS, (!fActive) ? MF_ENABLED : MF_GRAYED);
// check time limit
g_pCapture->get_UseTimeLimit(&f);
g_pCapture->get_TimeLimit(&d);
CheckMenuItem((HMENU) wParam, ID_CONTROL_TIMELIMIT_NONE, (!f) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem((HMENU) wParam, ID_CONTROL_TIMELIMIT_15SEC, (f && fabs(d - 15.0) < 0.1) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem((HMENU) wParam, ID_CONTROL_TIMELIMIT_30SEC, (f && fabs(d - 30.0) < 0.1) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_TIMELIMIT_NONE, (!fActive) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_TIMELIMIT_15SEC, (!fActive) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_TIMELIMIT_30SEC, (!fActive) ? MF_ENABLED : MF_GRAYED);
// check frame delay
g_pCapture->get_FrameDelay(&d);
CheckMenuItem((HMENU) wParam, ID_CONTROL_FRAMEDELAY_1SEC, (fabs(d - 1.0) < 0.1) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem((HMENU) wParam, ID_CONTROL_FRAMEDELAY_5SEC, (fabs(d - 5.0) < 0.1) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_FRAMEDELAY_1SEC, (!fActive) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_FRAMEDELAY_5SEC, (!fActive) ? MF_ENABLED : MF_GRAYED);
// check target
g_pCapture->get_TargetType(&l);
CheckMenuItem((HMENU) wParam, ID_CONTROL_TARGET_FILE, (l == ltmfCapture_Target_File) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_TARGET_FILE, (!fActive) ? MF_ENABLED : MF_GRAYED);
// check target format
g_pCapture->get_TargetFormat(&l);
g_pCapture->get_TargetType(&l2);
CheckMenuItem((HMENU) wParam, ID_CONTROL_TARGETFORMAT_MP4, (l == ltmfCapture_TargetFormat_MP4) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem((HMENU) wParam, ID_CONTROL_TARGETFORMAT_WMV, (l == ltmfCapture_TargetFormat_WMV) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_TARGETFORMAT_MP4, (!fActive && l2 == ltmfCapture_Target_File) ? MF_ENABLED : MF_GRAYED);
EnableMenuItem((HMENU) wParam, ID_CONTROL_TARGETFORMAT_WMV, (!fActive && l2 == ltmfCapture_Target_File) ? MF_ENABLED : MF_GRAYED);
// check properties preview
g_pCapture->get_ShowDialogPreview(&f);
CheckMenuItem((HMENU) wParam, ID_CONTROL_PROPERTIESPREVIEW, (f) ? MF_CHECKED : MF_UNCHECKED);
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_CONTROL_FITTOWINDOW:
// fit the video to the window
g_pCapture->put_VideoWindowSizeMode(ltmfFit);
return 0;
break;
case ID_CONTROL_STRETCHTOWINDOW:
// stretch the video to the window
g_pCapture->put_VideoWindowSizeMode(ltmfStretch);
return 0;
break;
case ID_CONTROL_FULLSCREEN:
// toggle fullscreen mode
g_pCapture->ToggleFullScreenMode();
return 0;
break;
case ID_CONTROL_PREVIEW:
// toggle preview
g_pCapture->TogglePreview();
return 0;
break;
case ID_CONTROL_PREVIEWVIDEOANDAUDIO:
// toggle audio preview
g_pCapture->get_PreviewSource(&l);
if(l == ltmfCapture_Preview_VideoAndAudio)
g_pCapture->put_PreviewSource(ltmfCapture_Preview_Video);
else
g_pCapture->put_PreviewSource(ltmfCapture_Preview_VideoAndAudio);
return 0;
break;
case ID_CONTROL_STOPCAPTURE:
// stop capturing
g_pCapture->StopCapture();
return 0;
break;
case ID_CONTROL_STARTCAPTURE:
// ready capture to eliminate start delays
hr = g_pCapture->ReadyCapture(ltmfCapture_Mode_VideoOrAudio);
if(SUCCEEDED(hr))
{
if(MessageBox(hwnd, _T("Ready to capture. Click 'ok' to start."), _T("Capture"), MB_OKCANCEL) == IDOK)
{
// start capturing
g_pCapture->StartCapture(ltmfCapture_Mode_VideoOrAudio);
}
else
{
// cancel capture
g_pCapture->StopCapture();
}
}
return 0;
break;
case ID_CONTROL_RUN:
// run the capture graph
g_pCapture->RunCapture();
return 0;
break;
case ID_CONTROL_PAUSE:
// pause the capture graph
g_pCapture->PauseCapture();
return 0;
break;
case ID_CONTROL_CAPTUREAUTOFRAMES:
hr = g_pCapture->ReadyCapture(ltmfCapture_Mode_AutoFrames);
if(SUCCEEDED(hr))
{
// start capturing automatic frame sequence
g_pCapture->StartCapture(ltmfCapture_Mode_AutoFrames);
}
return 0;
break;
case ID_CONTROL_CAPTUREMANUALFRAMES:
hr = g_pCapture->ReadyCapture(ltmfCapture_Mode_ManualFrames);
if(SUCCEEDED(hr))
{
// start capturing automatic frame sequence
hr = g_pCapture->StartCapture(ltmfCapture_Mode_ManualFrames);
if(SUCCEEDED(hr))
{
while(MessageBox(hwnd, _T("Press 'ok' to capture frame."), _T("Capture Manual Frames"), MB_OKCANCEL) == IDOK)
g_pCapture->CaptureFrame();
g_pCapture->StopCapture();
}
}
return 0;
break;
case ID_CONTROL_CAPTUREDIB:
// capture device independent bitmap
hr = g_pCapture->CaptureDIB((long*) &hDIB);
if(SUCCEEDED(hr))
{
// copy to the clipboard
OpenClipboard(hwnd);
EmptyClipboard();
SetClipboardData(CF_DIB, hDIB);
CloseClipboard();
}
return 0;
break;
case ID_CONTROL_CAPTUREPICTURE:
// capture ole picture object
hr = g_pCapture->CapturePicture(&pPictureDisp);
if(SUCCEEDED(hr))
{
// save the picture
bstr = SysAllocString(L"c:\\still.bmp");
OleSavePictureFile(pPictureDisp, bstr);
SysFreeString(bstr);
pPictureDisp->Release();
}
return 0;
break;
case ID_CONTROL_GETSTILLDIB:
// alternate method of capturing a device independent bitmap
hr = g_pCapture->StartCapture(ltmfCapture_Mode_Still);
if(SUCCEEDED(hr))
{
hr = g_pCapture->GetStillDIB(INFINITE, (long*) &hDIB);
g_pCapture->StopCapture();
if(SUCCEEDED(hr))
{
// copy to the clipboard
OpenClipboard(hwnd);
EmptyClipboard();
SetClipboardData(CF_DIB, hDIB);
CloseClipboard();
}
}
return 0;
break;
case ID_CONTROL_GETSTILLPICTURE:
// alternate method of capturing an ole picture object
hr = g_pCapture->StartCapture(ltmfCapture_Mode_Still);
if(SUCCEEDED(hr))
{
hr = g_pCapture->GetStillPicture(INFINITE, &pPictureDisp);
g_pCapture->StopCapture();
if(SUCCEEDED(hr))
{
// save the picture
bstr = SysAllocString(L"c:\\still.bmp");
OleSavePictureFile(pPictureDisp, bstr);
SysFreeString(bstr);
pPictureDisp->Release();
}
}
return 0;
break;
case ID_CONTROL_FRAMERATE_DEFAULT:
// set rate to default
g_pCapture->put_UseFrameRate(VARIANT_FALSE);
return 0;
break;
case ID_CONTROL_FRAMERATE_15FPS:
// set rate to 15 fps
g_pCapture->put_FrameRate(15.0);
g_pCapture->put_UseFrameRate(VARIANT_TRUE);
return 0;
break;
case ID_CONTROL_FRAMERATE_30FPS:
// set rate to 30 fps
g_pCapture->put_FrameRate(30.0);
g_pCapture->put_UseFrameRate(VARIANT_TRUE);
return 0;
break;
case ID_CONTROL_TIMELIMIT_NONE:
// no time limit
g_pCapture->put_UseTimeLimit(VARIANT_FALSE);
return 0;
break;
case ID_CONTROL_TIMELIMIT_15SEC:
// 15 sec time limit
g_pCapture->put_TimeLimit(15.0);
g_pCapture->put_UseTimeLimit(VARIANT_TRUE);
return 0;
break;
case ID_CONTROL_TIMELIMIT_30SEC:
// 30 sec time limit
g_pCapture->put_TimeLimit(30.0);
g_pCapture->put_UseTimeLimit(VARIANT_TRUE);
return 0;
break;
case ID_CONTROL_FRAMEDELAY_1SEC:
// 1 sec frame delay
g_pCapture->put_FrameDelay(1.0);
return 0;
break;
case ID_CONTROL_FRAMEDELAY_5SEC:
// 5 sec frame delay
g_pCapture->put_FrameDelay(5.0);
return 0;
break;
case ID_CONTROL_TARGET_FILE:
// assign a target file
FreeTarget();
// set output format to MP4
g_pCapture->put_TargetFormat(ltmfCapture_TargetFormat_MP4);
#ifdef _DEBUG
{
long v;
g_pCapture->get_TargetFormat(&v);
assert(v == ltmfCapture_TargetFormat_MP4);
}
#endif
// get target format
IltmfTargetFormats* pTargetFormats;
IltmfTargetFormat* pTargetFormat;
g_pCapture->get_TargetFormats(&pTargetFormats);
long v;
pTargetFormats->get_Selection(&v);
pTargetFormats->Item(v, &pTargetFormat);
pTargetFormats->Release();
// get target video formats
IltmfTargetVideoFormats* pTargetVideoFormats;
pTargetFormat->get_VideoFormats(&pTargetVideoFormats);
// select the H264 video target video format
bstr = SysAllocString(L"{34363248-0000-0010-8000-00AA00389B71}");
pTargetVideoFormats->Find(bstr, &index);
SysFreeString(bstr);
if(index < 0)
{
// video target format isn't registered
pTargetFormat->Release();
pTargetVideoFormats->Release();
return E_FAIL;
}
pTargetVideoFormats->put_Selection(index);
pTargetVideoFormats->Release();
// get target audio formats
IltmfTargetAudioFormats* pTargetAudioFormats;
pTargetFormat->get_AudioFormats(&pTargetAudioFormats);
// select the AAC target audio format
bstr = SysAllocString(L"{00001610-0000-0010-8000-00AA00389B71}");
pTargetAudioFormats->Find(bstr, &index);
SysFreeString(bstr);
if(index < 0)
{
// audio target format isn't registered
pTargetFormat->Release();
pTargetAudioFormats->Release();
return E_FAIL;
}
pTargetAudioFormats->put_Selection(index);
pTargetAudioFormats->Release();
pTargetFormat->Release();
return 0;
break;
case ID_CONTROL_TARGETFORMAT_MP4:
// is target a file?
g_pCapture->get_TargetType(&l);
if(l == ltmfCapture_Target_File)
{
// rename it
bstr = SysAllocString(L"c:\\target.mp4");
g_pCapture->put_TargetFile(bstr);
SysFreeString(bstr);
}
g_pCapture->put_TargetFormat(ltmfCapture_TargetFormat_MP4);
return 0;
break;
case ID_CONTROL_TARGETFORMAT_WMV:
// is target a file?
g_pCapture->get_TargetType(&l);
if(l == ltmfCapture_Target_File)
{
// rename it
bstr = SysAllocString(L"c:\\target.wmv");
g_pCapture->put_TargetFile(bstr);
SysFreeString(bstr);
}
g_pCapture->put_TargetFormat(ltmfCapture_TargetFormat_WMV);
return 0;
break;
case ID_CONTROL_AUDIOPROCESSORS:
// edit audio processors
g_pCapture->ShowDialog(ltmfCapture_Dlg_AudioProcessors, (long) hwnd);
return 0;
break;
case ID_CONTROL_VIDEOPROCESSORS:
// edit video processors
g_pCapture->ShowDialog(ltmfCapture_Dlg_VideoProcessors, (long) hwnd);
return 0;
break;
case ID_CONTROL_PROPERTIESPREVIEW:
// toggle preview while editing properties
g_pCapture->get_ShowDialogPreview(&f);
g_pCapture->put_ShowDialogPreview(f ? VARIANT_FALSE : VARIANT_TRUE);
return 0;
break;
}
break;
case WM_LBUTTONDOWN:
g_pCapture->get_State(&l);
if(l != ltmfCapture_State_Pending || l != ltmfCapture_State_Running)
{
g_pCapture->get_VideoWindowLeft(&x);
g_pCapture->get_VideoWindowTop(&y);
g_pCapture->get_VideoWindowWidth(&cx);
g_pCapture->get_VideoWindowHeight(&cy);
SetRect(&rc, x, y, x + cx, y + cy);
pt.x = (short) LOWORD(lParam);
pt.y = (short) HIWORD(lParam);
if(PtInRect(&rc, pt))
{
// set target format properties
g_pCapture->ShowDialog(ltmfCapture_Dlg_TargetFormat, (long) hwnd);
}
}
return 0;
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HRESULT hr;
WNDCLASSEX wcex;
g_hInstance = hInstance;
// initialize COM library
hr = CoInitialize(NULL);
if(FAILED(hr))
goto error;
// register the video frame window class
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = CaptureWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = g_hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
wcex.lpszMenuName = (LPCWSTR)IDR_MENU;
wcex.lpszClassName = SZ_WNDCLASS_CAPTURE;
wcex.hIconSm = NULL;
if(!RegisterClassEx(&wcex))
goto error;
// create the capture object
hr = CoCreateInstance(CLSID_ltmfCapture, NULL, CLSCTX_INPROC_SERVER, IID_IltmfCapture, (void**) &g_pCapture);
if(FAILED(hr))
goto error;
// create the video frame window
if(!CreateWindow(SZ_WNDCLASS_CAPTURE, _T("Capture"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_hInstance, NULL))
goto error;
ShowWindow(g_hwndCapture, nCmdShow);
UpdateWindow(g_hwndCapture);
// process until done
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
error:
if(g_pCapture)
g_pCapture->Release();
CoUninitialize();
return 0;
}