Recompressing an AVI File to a DV Device for C
The following code demonstrates how to recompress an AVI file to a DV device:
// define helper macros for using interfaces under C
#define COBJMACROS
// include the LEAD Multimedia TOOLKIT header
#include "ltmm.h"
#include "resource.h"
#include <tchar.h>
#include <stdio.h>
#include <assert.h>
HINSTANCE g_hInstance; // application instance handle
IltmmConvert* g_pConvert; // convert object's interface pointer
// user defined message id used for conversion events
#define WM_CONVERTNOTIFY (WM_USER + 1000)
//
// ConvertDlgProc
// starts the conversion process and provides status feedback
//
// controls:
// IDC_CONVERTSTATUS - static control used for status messages
// IDC_CONVERTPROGRESS - static control used for conversion progress
// IDC_USERABORT - button control used to abort the conversion or exit the dialog
BOOL CALLBACK ConvertDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
TCHAR sz[256];
BSTR bstr1;
BSTR bstr2;
HRESULT hr;
long state;
long type;
long streams;
IltmmVCRControl* pVCR;
switch (msg)
{
case WM_INITDIALOG:
// assign the notification window
IltmmConvert_SetNotifyWindow (g_pConvert, (long) hwnd, WM_CONVERTNOTIFY);
// set the abort button text
SetDlgItemText(hwnd, IDC_USERABORT, _T("Abort"));
// uncomment the following line to view the the graph in DirectShow GraphEdit
// IltmmConvert_EditGraph(g_pConvert);
IltmmConvert_get_UnrenderedStreams(g_pConvert, &streams);
if(streams != 0)
MessageBox(hwnd, _T("Not all the streams could be rendered."), _T("Convert"), MB_ICONEXCLAMATION | MB_OK);
IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR);
hr = IltmmVCRControl_Record(pVCR);
IUnknown_Release(pVCR);
if(SUCCEEDED(hr))
Sleep(2000);
// start the conversion
hr = IltmmConvert_StartConvert (g_pConvert);
if(FAILED(hr))
{
_stprintf(sz, _T("conversion error 0x%.8X"), lParam);
SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz);
UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS));
SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit"));
MessageBeep(0);
// stop, if VCR
IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR);
IltmmVCRControl_Stop (pVCR);
IUnknown_Release(pVCR);
}
return TRUE;
break;
case WM_DESTROY:
// reset the notification window
IltmmConvert_SetNotifyWindow (g_pConvert, (long) NULL, 0);
#ifdef _DEBUG
{
long state, err, pc;
double start, end, dur;
TCHAR sz[1024];
// get the current state
IltmmConvert_get_State (g_pConvert, &state);
// get the current state
IltmmConvert_get_ConvertError(g_pConvert, &err);
// get the amount converted
IltmmConvert_get_PercentComplete(g_pConvert, &pc);
// get the start
IltmmConvert_get_SelectionStart (g_pConvert, &start);
// get the end
IltmmConvert_get_SelectionEnd(g_pConvert, &end);
// get the duration
IltmmConvert_get_Duration(g_pConvert, &dur);
_stprintf(sz, _T("state = %d, error = 0x%.8X, complete = %d%%, start = %g, end = %g, duration = %g"), state, err, pc, start, end, dur);
MessageBox(NULL, sz, _T("debug"), MB_OK);
}
#endif
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_USERABORT:
// user abort... stop conversion
IltmmConvert_get_State (g_pConvert, &state);
if(state == ltmmConvert_State_Running)
IltmmConvert_StopConvert(g_pConvert);
else
{
IltmmConvert_get_ConvertError(g_pConvert, (long*) &hr);
EndDialog(hwnd, (long) hr);
}
return TRUE;
break;
}
break;
case WM_CONVERTNOTIFY:
switch(wParam)
{
case ltmmConvert_Notify_Started:
// indicate conversion has started
IltmmConvert_get_SourceType(g_pConvert, &type);
switch(type)
{
case ltmmConvert_Source_File:
IltmmConvert_get_SourceFile (g_pConvert, &bstr1);
break;
case ltmmConvert_Source_HGlobal:
bstr1 = SysAllocString(L"[hglobal]");
break;
case ltmmConvert_Source_Array:
bstr1 = SysAllocString(L"[array]");
break;
case ltmmConvert_Source_Object:
bstr1 = SysAllocString(L"[object]");
break;
}
IltmmConvert_get_TargetType(g_pConvert, &type);
switch(type)
{
case ltmmConvert_Target_File:
IltmmConvert_get_TargetFile(g_pConvert, &bstr2);
break;
case ltmmConvert_Target_Array:
bstr2 = SysAllocString(L"[array]");
break;
case ltmmConvert_Target_Object:
bstr2 = SysAllocString(L"[object]");
break;
case ltmmConvert_Target_Device:
bstr2 = SysAllocString(L"[device]");
break;
}
IltmmConvert_get_RenderedStreams(g_pConvert, &streams);
if((streams & ltmmConvert_Stream_Audio) & !(streams & ltmmConvert_Stream_Video))
_stprintf(sz, _T("recompressing audio from '%ls' to '%ls'..."), bstr1, bstr2);
else if(!(streams & ltmmConvert_Stream_Audio) & (streams & ltmmConvert_Stream_Video))
_stprintf(sz, _T("recompressing video from '%ls' to '%ls'..."), bstr1, bstr2);
else
_stprintf(sz, _T("recompressing '%ls' to '%ls'..."), bstr1, bstr2);
SysFreeString(bstr1);
SysFreeString(bstr2);
SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz);
UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS));
break;
case ltmmConvert_Notify_Complete:
// indicate an conversion complete
_stprintf(sz, _T("conversion complete"));
SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz);
UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS));
SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit"));
// stop, if VCR
IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR);
IltmmVCRControl_Stop (pVCR);
IUnknown_Release(pVCR);
break;
case ltmmConvert_Notify_ErrorAbort:
// indicate an error
_stprintf(sz, _T("conversion error 0x%.8X"), lParam);
SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz);
UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS));
SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit"));
MessageBeep(0);
// stop, if VCR
IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR);
IltmmVCRControl_Stop (pVCR);
IUnknown_Release(pVCR);
break;
case ltmmConvert_Notify_UserAbort:
// indicate user abort
_stprintf(sz, _T("conversion aborted\n"));
SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz);
UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS));
SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit"));
// stop, if VCR
IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR);
IltmmVCRControl_Stop (pVCR);
IUnknown_Release(pVCR);
MessageBeep(0);
break;
case ltmmConvert_Notify_Progress:
// indicate conversion progress
_stprintf(sz, _T("%3d%% complete"), lParam);
SetDlgItemText(hwnd, IDC_CONVERTPROGRESS, sz);
UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTPROGRESS));
break;
}
return TRUE;
break;
}
return FALSE;
}
//
// RecompressFileToDVDevice
// recompresses file to DV device
//
// pszSource = source file path
//
HRESULT RecompressFileToDVDevice(LPCTSTR pszSource)
{
HRESULT hr;
BSTR bstr;
#ifndef _UNICODE
WCHAR wsz[MAX_PATH];
#endif
IltmmTargetDevices* pDevices;
IltmmCompressors* pCompressors;
// set source file
#ifdef _UNICODE
bstr = SysAllocString(pszSource);
#else
swprintf(wsz, L"%hs", pszSource);
bstr = SysAllocString(wsz);
#endif
hr = IltmmConvert__put_SourceFile(g_pConvert, bstr);
SysFreeString(bstr);
if(FAILED(hr))
return hr;
// set target device
hr = IltmmConvert__put_TargetFormat(g_pConvert, ltmmConvert_TargetFormat_dvsd);
if(FAILED(hr))
return hr;
IltmmConvert_get_AudioCompressors(g_pConvert, &pCompressors);
hr = IltmmCompressors_put_Selection(pCompressors, -1);
IUnknown_Release(pCompressors);
if(FAILED(hr))
return hr;
IltmmConvert_get_VideoCompressors(g_pConvert,&pCompressors);
hr = IltmmCompressors_put_Selection(pCompressors, -1);
IUnknown_Release(pCompressors);
if(FAILED(hr))
return hr;
IltmmConvert_get_TargetDevices(g_pConvert, &pDevices);
hr = IltmmTargetDevices_put_Selection(pDevices, 0);
IUnknown_Release(pDevices);
if(FAILED(hr))
return hr;
// do conversion
hr = (HRESULT) DialogBox(g_hInstance, (LPCTSTR)IDD_CONVERTDLG, NULL, ConvertDlgProc);
return hr;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HRESULT hr;
g_hInstance = hInstance;
// initialize COM library
hr = CoInitialize(NULL);
if(FAILED(hr))
goto error;
// create the convert object
hr = CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &g_pConvert);
if(FAILED(hr))
goto error;
hr = RecompressFileToDVDevice(_T("c:\\source.avi"));
if(FAILED(hr))
goto error;
error:
// cleanup
if(g_pConvert)
IUnknown_Release(g_pConvert);
CoUninitialize();
return 0;
}
The following code demonstrates how to recompress an AVI file to a DV device:
// define helper macros for using interfaces under C #ifndef COBJMACROS #define COBJMACROS #endif // include the LEAD Multimedia TOOLKIT header #include "ltmm.h" #include "resource.h" #include <tchar.h> #include <stdio.h> #include <assert.h> IltmmConvert* g_pConvert; // convert object's interface pointer // user defined message id used for conversion events #define WM_CONVERTNOTIFY (WM_USER + 1000) // // ConvertDlgProc // starts the conversion process and provides status feedback // // controls: // IDC_CONVERTSTATUS - static control used for status messages // IDC_CONVERTPROGRESS - static control used for conversion progress // IDC_USERABORT - button control used to abort the conversion or exit the dialog BOOL CALLBACK ConvertDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { TCHAR sz[256]; BSTR bstr1 = NULL; BSTR bstr2 = NULL; HRESULT hr; long state; long type; long streams; IltmmVCRControl* pVCR; switch (msg) { case WM_INITDIALOG: // assign the notification window IltmmConvert_SetNotifyWindow (g_pConvert, (long) hwnd, WM_CONVERTNOTIFY); // set the abort button text SetDlgItemText(hwnd, IDC_USERABORT, _T("Abort")); // uncomment the following line to view the the graph in DirectShow GraphEdit // IltmmConvert_EditGraph(g_pConvert); IltmmConvert_get_UnrenderedStreams(g_pConvert, &streams); if(streams != 0) MessageBox(hwnd, _T("Not all the streams could be rendered."), _T("Convert"), MB_ICONEXCLAMATION | MB_OK); IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR); hr = IltmmVCRControl_Record(pVCR); IUnknown_Release(pVCR); if(SUCCEEDED(hr)) Sleep(2000); // start the conversion hr = IltmmConvert_StartConvert (g_pConvert); if(FAILED(hr)) { _stprintf(sz, _T("conversion error 0x%.8X"), lParam); SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz); UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS)); SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit")); MessageBeep(0); // stop, if VCR IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR); IltmmVCRControl_Stop (pVCR); IUnknown_Release(pVCR); } return TRUE; break; case WM_DESTROY: // reset the notification window IltmmConvert_SetNotifyWindow (g_pConvert, (long) NULL, 0); #ifdef _DEBUG { long state, err, pc; double start, end, dur; TCHAR sz[1024]; // get the current state IltmmConvert_get_State (g_pConvert, &state); // get the current state IltmmConvert_get_ConvertError(g_pConvert, &err); // get the amount converted IltmmConvert_get_PercentComplete(g_pConvert, &pc); // get the start IltmmConvert_get_SelectionStart (g_pConvert, &start); // get the end IltmmConvert_get_SelectionEnd(g_pConvert, &end); // get the duration IltmmConvert_get_Duration(g_pConvert, &dur); _stprintf(sz, _T("state = %d, error = 0x%.8X, complete = %d%%, start = %g, end = %g, duration = %g"), state, err, pc, start, end, dur); MessageBox(NULL, sz, _T("debug"), MB_OK); } #endif break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_USERABORT: // user abort... stop conversion IltmmConvert_get_State (g_pConvert, &state); if(state == ltmmConvert_State_Running) IltmmConvert_StopConvert(g_pConvert); else { IltmmConvert_get_ConvertError(g_pConvert, (long*) &hr); EndDialog(hwnd, (long) hr); } return TRUE; break; } break; case WM_CONVERTNOTIFY: switch(wParam) { case ltmmConvert_Notify_Started: // indicate conversion has started IltmmConvert_get_SourceType(g_pConvert, &type); switch(type) { case ltmmConvert_Source_File: IltmmConvert_get_SourceFile (g_pConvert, &bstr1); break; case ltmmConvert_Source_HGlobal: bstr1 = SysAllocString(L"[hglobal]"); break; case ltmmConvert_Source_Array: bstr1 = SysAllocString(L"[array]"); break; case ltmmConvert_Source_Object: bstr1 = SysAllocString(L"[object]"); break; } IltmmConvert_get_TargetType(g_pConvert, &type); switch(type) { case ltmmConvert_Target_File: IltmmConvert_get_TargetFile(g_pConvert, &bstr2); break; case ltmmConvert_Target_Array: bstr2 = SysAllocString(L"[array]"); break; case ltmmConvert_Target_Object: bstr2 = SysAllocString(L"[object]"); break; case ltmmConvert_Target_Device: bstr2 = SysAllocString(L"[device]"); break; } IltmmConvert_get_RenderedStreams(g_pConvert, &streams); if((streams & ltmmConvert_Stream_Audio) & !(streams & ltmmConvert_Stream_Video)) _stprintf(sz, _T("recompressing audio from '%ls' to '%ls'..."), bstr1, bstr2); else if(!(streams & ltmmConvert_Stream_Audio) & (streams & ltmmConvert_Stream_Video)) _stprintf(sz, _T("recompressing video from '%ls' to '%ls'..."), bstr1, bstr2); else _stprintf(sz, _T("recompressing '%ls' to '%ls'..."), bstr1, bstr2); SysFreeString(bstr1); SysFreeString(bstr2); SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz); UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS)); break; case ltmmConvert_Notify_Complete: // indicate an conversion complete _stprintf(sz, _T("conversion complete")); SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz); UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS)); SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit")); // stop, if VCR IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR); IltmmVCRControl_Stop (pVCR); IUnknown_Release(pVCR); break; case ltmmConvert_Notify_ErrorAbort: // indicate an error _stprintf(sz, _T("conversion error 0x%.8X"), lParam); SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz); UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS)); SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit")); MessageBeep(0); // stop, if VCR IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR); IltmmVCRControl_Stop (pVCR); IUnknown_Release(pVCR); break; case ltmmConvert_Notify_UserAbort: // indicate user abort _stprintf(sz, _T("conversion aborted\n")); SetDlgItemText(hwnd, IDC_CONVERTSTATUS, sz); UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTSTATUS)); SetDlgItemText(hwnd, IDC_USERABORT, _T("Exit")); // stop, if VCR IltmmConvert_get_TargetVCRControl(g_pConvert, &pVCR); IltmmVCRControl_Stop (pVCR); IUnknown_Release(pVCR); MessageBeep(0); break; case ltmmConvert_Notify_Progress: // indicate conversion progress _stprintf(sz, _T("%3d%% complete"), lParam); SetDlgItemText(hwnd, IDC_CONVERTPROGRESS, sz); UpdateWindow(GetDlgItem(hwnd, IDC_CONVERTPROGRESS)); break; } return TRUE; break; } return FALSE; } // // RecompressFileToDVDevice // recompresses file to DV device // // pszSource = source file path // HRESULT RecompressFileToDVDevice(LPCTSTR pszSource, HINSTANCE hInstance) { HRESULT hr; BSTR bstr; #ifndef _UNICODE WCHAR wsz[MAX_PATH]; #endif IltmmTargetDevices* pDevices; IltmmCompressors* pCompressors; // set source file #ifdef _UNICODE bstr = SysAllocString(pszSource); #else swprintf(wsz, L"%hs", pszSource); bstr = SysAllocString(wsz); #endif hr = IltmmConvert_put_SourceFile(g_pConvert, bstr); SysFreeString(bstr); if(FAILED(hr)) return hr; // set target device hr = IltmmConvert_put_TargetFormat(g_pConvert, ltmmConvert_TargetFormat_dvsd); if(FAILED(hr)) return hr; IltmmConvert_get_AudioCompressors(g_pConvert, &pCompressors); hr = IltmmCompressors_put_Selection(pCompressors, -1); IUnknown_Release(pCompressors); if(FAILED(hr)) return hr; IltmmConvert_get_VideoCompressors(g_pConvert,&pCompressors); hr = IltmmCompressors_put_Selection(pCompressors, -1); IUnknown_Release(pCompressors); if(FAILED(hr)) return hr; IltmmConvert_get_TargetDevices(g_pConvert, &pDevices); hr = IltmmTargetDevices_put_Selection(pDevices, 0); IUnknown_Release(pDevices); if(FAILED(hr)) return hr; // do conversion hr = (HRESULT) DialogBox(hInstance, (LPCTSTR)IDD_CONVERTDLG, NULL, ConvertDlgProc); return hr; } L_MULTIMEDIATEX_API void RecompressingAVIFileToDVDevice_Example ( HINSTANCE hInstance /*application instance handle*/ ) { HRESULT hr; // initialize COM library hr = CoInitialize(NULL); if(FAILED(hr)) goto error; // create the convert object hr = CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &g_pConvert); if(FAILED(hr)) goto error; hr = RecompressFileToDVDevice(_T("c:\\source.avi"), hInstance); if(FAILED(hr)) goto error; error: // cleanup if(g_pConvert) IUnknown_Release(g_pConvert); CoUninitialize(); }