Use ltmmMemory for Memory Conversion Example for C
1. |
Create a convert object, source and target objects: |
#define WM_CONVERTNOTIFY (WM_USER+1) IltmmConvert *g_pConvert; IltmmMemory *g_pSource; IltmmMemory *g_pTarget; HRESULT SetAVIRecompression(HWND hwndParent); L_MULTIMEDIATEX_API void UseltmmMemoryForMemoryConversion_Example (HWND hWnd) { {//1. Create a convert object, g_pSource and g_pTarget objects: // create a convert object, g_pSource and g_pTarget memory objects CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &g_pConvert); CoCreateInstance(&CLSID_ltmmMemory, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmMemory, (void**) &g_pSource); CoCreateInstance(&CLSID_ltmmMemory, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmMemory, (void**) &g_pTarget); }//1. Create a convert object, g_pSource and g_pTarget objects: // set notify window IltmmConvert_SetNotifyWindow(g_pConvert, (long)hWnd, WM_CONVERTNOTIFY); {//2. Setup the g_pSource object, pre-load it with data: SAFEARRAY sa; VARIANT var; UCHAR arr [100]; long fl = 100; // Set the buffer size IltmmMemory_put_BufferSize (g_pSource, fl); // pass data from the arr BYTE array... memset(&sa, 0, sizeof(sa)); sa.cbElements = sizeof(unsigned char); sa.cDims = 1; sa.fFeatures = (FADF_AUTO | FADF_FIXEDSIZE); sa.pvData = arr; //data to fill sa.rgsabound[0].cElements = fl; VariantInit(&var); V_VT(&var) = (VT_ARRAY | VT_UI1); V_ARRAY(&var) = &sa; IltmmMemory_SetData (g_pSource, 0, fl, var); }//2. Setup the g_pSource object, preload it with data: // Set input memory object IltmmConvert_put_SourceStream(g_pConvert, g_pSource); // Set output memory object IltmmConvert_put_TargetStream(g_pConvert, g_pTarget); // Set recompression SetAVIRecompression(NULL); // Start conversion IltmmConvert_StartConvert (g_pConvert); } // // 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 IltmmConvert_get_VideoCompressors(g_pConvert, &pCompressors); bstr = SysAllocString(L"@device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\\LEAD MCMP/MJPEG Codec (2.0)"); IltmmCompressors_Find (pCompressors , bstr, &index); SysFreeString(bstr); if(index < 0) { // compressor isn't registered IltmmCompressors_Release (pCompressors); return E_FAIL; } IltmmCompressors_put_Selection (pCompressors, index); IltmmCompressors_Release(pCompressors); // select the MP3 audio video compressor IltmmConvert_get_AudioCompressors(g_pConvert, &pCompressors); bstr = SysAllocString(L"@device:cm:{33D9A761-90C8-11D0-BD43-00A0C911CE86}\\85MPEG Layer-3"); IltmmCompressors_Find(pCompressors, bstr, &index); SysFreeString(bstr); if(index < 0) { // compressor isn't registered IltmmCompressors_Release (pCompressors); return E_FAIL; } IltmmCompressors_put_Selection (pCompressors, index); IltmmCompressors_Release(pCompressors); // set output format to AVI IltmmConvert_put_TargetFormat (g_pConvert, ltmmConvert_TargetFormat_Avi); // set video compressor properties IltmmConvert_HasDialog(g_pConvert, ltmmConvert_Dlg_VideoCompressor, &f); if(f) IltmmConvert_ShowDialog (g_pConvert, ltmmConvert_Dlg_VideoCompressor, (long) hwndParent); // set audio compressor properties IltmmConvert_HasDialog(g_pConvert, ltmmConvert_Dlg_AudioCompressor, &f); if(f) IltmmConvert_ShowDialog(g_pConvert, ltmmConvert_Dlg_AudioCompressor, (long) hwndParent); return S_OK; } //3. Handle the notification window to plot the data and save it to a file: LRESULT OnConvertNotify(WPARAM wParam, LPARAM lParam) { lParam = lParam ; switch(wParam) { case ltmmConvert_Notify_Complete: { // Indicates a successful completion of the conversion process. HANDLE hFile = NULL; long fl = 0; unsigned long lBytesWritten; IltmmMemory *pTarget = NULL; VARIANT varData; unsigned char *pBuffer = NULL; SAFEARRAY sa; // write the data to a file hFile = CreateFile( "C:\\Target.avi", // open file name GENERIC_WRITE, // open for writing FILE_SHARE_READ, // share for reading NULL, // no security CREATE_ALWAYS, // re-create the file FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. template IltmmConvert_get_TargetStream(g_pConvert, (IUnknown**)&pTarget); if(!pTarget) break; IltmmMemory_get_BufferSize(pTarget, &fl); VariantInit(&varData); // pass data memset(&sa, 0, sizeof(sa)); sa.cbElements = sizeof(unsigned char); sa.cDims = 1; sa.fFeatures = (FADF_AUTO | FADF_FIXEDSIZE); sa.pvData = (UCHAR*) malloc(fl*sizeof (UCHAR)); sa.rgsabound[0].cElements = fl; V_VT(&varData) = (VT_ARRAY | VT_UI1); V_ARRAY(&varData) = &sa; // // To lock the buffer for synchronization, use the following // line instead of the line below : // IltmmMemory_LockBuffer (pTarget, &varData); // or // IltmmMemory_LockRegion (pTarget, 0, fl, &varData); // You may also use the IltmmMemory_GetData() function // To get the data without allocating a SAFEARRAY : // IltmmMemory_GetData (pTarget, 0, fl, &varData); // IltmmMemory_CopyData(pTarget, 0, fl, &varData); SafeArrayAccessData(V_ARRAY(&varData), (void**)&pBuffer); WriteFile(hFile, pBuffer, fl, &lBytesWritten, NULL); {// Plot data on screen char dataPlot[255]; char data[20]; short sData; int i; dataPlot[0] = '\0' ; for(i=0; i<fl ; i++) { IltmmMemory_GetByte (pTarget, i, &sData); strcat (dataPlot,"0x"); strcat (dataPlot,ltoa(sData, data, 16)); strcat (dataPlot," "); } printf ("%s", dataPlot); }// Plot data on screen // if IltmmMemory_LockBuffer() or // IltmmMemory_LockRegion() is used, // IltmmMemory_Unloack() must be called : // IltmmMemory_Unlock (pTarget); SafeArrayUnaccessData(V_ARRAY(&varData)); VariantClear(&varData); CloseHandle(hFile); IltmmMemory_Release(pTarget); } break; } return 0; }