The following code demonstrates how to recompress an AVI file to a DV
device:
// 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
g_pConvert->SetNotifyWindow((long) hwnd, WM_CONVERTNOTIFY);
// set the abort button text
SetDlgItemText(hwnd, IDC_USERABORT, _T("Abort"));
// uncomment the following line to view the graph in DirectShow GraphEdit
// g_pConvert->EditGraph();
g_pConvert->get_UnrenderedStreams(&streams);
if(streams != 0)
MessageBox(hwnd, _T("Not all the streams could be rendered."), _T("Convert"), MB_ICONEXCLAMATION | MB_OK);
g_pConvert->get_TargetVCRControl(&pVCR);
hr = pVCR->Record();
pVCR->Release();
if(SUCCEEDED(hr))
Sleep(2000);
// start the conversion
hr = g_pConvert->StartConvert();
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
g_pConvert->get_TargetVCRControl(&pVCR);
pVCR->Stop();
pVCR->Release();
}
return TRUE;
break;
case WM_DESTROY:
// reset the notification window
g_pConvert->SetNotifyWindow((long) NULL, 0);
#ifdef _DEBUG
{
long state, err, pc;
double start, end, dur;
TCHAR sz[1024];
// get the current state
g_pConvert->get_State(&state);
// get the current state
g_pConvert->get_ConvertError(&err);
// get the amount converted
g_pConvert->get_PercentComplete(&pc);
// get the start
g_pConvert->get_SelectionStart(&start);
// get the end
g_pConvert->get_SelectionEnd(&end);
// get the duration
g_pConvert->get_Duration(&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
g_pConvert->get_State(&state);
if(state == ltmmConvert_State_Running)
g_pConvert->StopConvert();
else
{
g_pConvert->get_ConvertError((long*) &hr);
EndDialog(hwnd, (long) hr);
}
return TRUE;
break;
}
break;
case WM_CONVERTNOTIFY:
switch(wParam)
{
case ltmmConvert_Notify_Started:
// indicate conversion has started
g_pConvert->get_SourceType(&type);
switch(type)
{
case ltmmConvert_Source_File:
g_pConvert->get_SourceFile(&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;
}
g_pConvert->get_TargetType(&type);
switch(type)
{
case ltmmConvert_Target_File:
g_pConvert->get_TargetFile(&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;
}
g_pConvert->get_RenderedStreams(&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
g_pConvert->get_TargetVCRControl(&pVCR);
pVCR->Stop();
pVCR->Release();
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
g_pConvert->get_TargetVCRControl(&pVCR);
pVCR->Stop();
pVCR->Release();
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"));
MessageBeep(0);
// stop, if vcr
g_pConvert->get_TargetVCRControl(&pVCR);
pVCR->Stop();
pVCR->Release();
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;
}
//
// SetAVIRecompression
// sets up LEAD video compression, MP3 audio compression, and AVI file output
//
// hwndParent = parent window for compressor property dialog boxes
//
HRESULT SetAVIRecompression(HWND hwndParent)
{
IltmmCompressors* pCompressors;
long index;
VARIANT_BOOL f;
BSTR bstr;
// select the LEAD video compressor
g_pConvert->get_VideoCompressors(&pCompressors);
bstr = SysAllocString(L"@device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\\LEAD MCMP/MJPEG Codec (2.0)");
pCompressors->Find(bstr, &index);
SysFreeString(bstr);
if(index < 0)
{
// compressor isn't registered
pCompressors->Release();
return E_FAIL;
}
pCompressors->put_Selection(index);
pCompressors->Release();
// select the MP3 audio video compressor
g_pConvert->get_AudioCompressors(&pCompressors);
bstr = SysAllocString(L"@device:cm:{33D9A761-90C8-11D0-BD43-00A0C911CE86}\\85MPEG Layer-3");
pCompressors->Find(bstr, &index);
SysFreeString(bstr);
if(index < 0)
{
// compressor isn't registered
pCompressors->Release();
return E_FAIL;
}
pCompressors->put_Selection(index);
pCompressors->Release();
// set output format to AVI
g_pConvert->put_TargetFormat(ltmmConvert_TargetFormat_Avi);
#ifdef _DEBUG
{
long v;
g_pConvert->get_TargetFormat(&v);
assert(v == ltmmConvert_TargetFormat_Avi);
}
#endif
// set video compressor properties
g_pConvert->HasDialog(ltmmConvert_Dlg_VideoCompressor, &f);
if(f)
g_pConvert->ShowDialog(ltmmConvert_Dlg_VideoCompressor, (long) hwndParent);
// set audio compressor properties
g_pConvert->HasDialog(ltmmConvert_Dlg_AudioCompressor, &f);
if(f)
g_pConvert->ShowDialog(ltmmConvert_Dlg_AudioCompressor, (long) hwndParent);
return S_OK;
}
// 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 = g_pConvert->put_SourceFile(bstr);
SysFreeString(bstr);
if(FAILED(hr))
return hr;
// set target device
hr = g_pConvert->put_TargetFormat(ltmmConvert_TargetFormat_dvsd);
if(FAILED(hr))
return hr;
g_pConvert->get_AudioCompressors(&pCompressors);
hr = pCompressors->put_Selection(-1);
pCompressors->Release();
if(FAILED(hr))
return hr;
g_pConvert->get_VideoCompressors(&pCompressors);
hr = pCompressors->put_Selection(-1);
pCompressors->Release();
if(FAILED(hr))
return hr;
g_pConvert->get_TargetDevices(&pDevices);
hr = pDevices->put_Selection(0);
pDevices->Release();
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(MAKE_MEDIA_PATH("source.avi"));
if(FAILED(hr))
goto error;
error:
// cleanup
if(g_pConvert)
g_pConvert->Release();
CoUninitialize();
return 0;
}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
Your email has been sent to support! Someone should be in touch! If your matter is urgent please come back into chat.
Chat Hours:
Monday - Friday, 8:30am to 6pm ET
Thank you for your feedback!
Please fill out the form again to start a new chat.
All agents are currently offline.
Chat Hours:
Monday - Friday
8:30AM - 6PM EST
To contact us please fill out this form and we will contact you via email.