Products | Support | Send comments on this topic. | Email a link to this topic. | Back to Getting Started | Help Version 18.0.10.24
LEADTOOLS Multimedia API Help

Splitting an AVI File into Multiple Bitmaps Using ltmmSampleTarget for C++

Show in webframe

The following code utilizes ltmmSampleTarget and ltmmConvert to generate multiple device independent bitmaps from an AVI file.

#define MAKE_MEDIA_PATH(pFileName) (TEXT("C:\\LEADTOOLS 18\\Media\\")TEXT(pFileName))


#include "stdafx.h"
// include the LEAD Multimedia TOOLKIT header
#include "ltmm.h"
// include amvideo.h for VIDEOINFOHEADER, available in the Visual Studio 6.0 or the DirectX SDK
#include <amvideo.h>
// includes for string handling
#include <tchar.h>
#include <wchar.h>
#include <string.h>
#include <stdio.h>
/////////////////////////////////////////////////////////////////
// SaveBMP24
// saves a bitmap to a file (supports only 24 BPP)
// pszFile - output file name
// pHeader - BITMAPINFOHEADER
// pBits - bitmap image data
//
BOOL SaveBMP24(LPCWSTR pszFile, BITMAPINFOHEADER* pHeader, void* pBits)
{
   HANDLE hFile;
   TCHAR szFile[MAX_PATH];
   BITMAPFILEHEADER bfh;
   DWORD nWritten;
#if defined(_UNICODE)
   wcscpy(szFile, pszFile);
#else
   WideCharToMultiByte(CP_ACP, 0, pszFile, -1, szFile, MAX_PATH, NULL, NULL);
#endif
   hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   if(hFile == INVALID_HANDLE_VALUE)
      return FALSE;
   bfh.bfType = 0x4D42;
   bfh.bfOffBits = sizeof(bfh) + pHeader->biSize;
   bfh.bfSize = bfh.bfOffBits + pHeader->biSizeImage;
   bfh.bfReserved1 = 0;
   bfh.bfReserved2 = 0;
   if(!WriteFile(hFile, &bfh, sizeof(bfh), &nWritten, NULL) || nWritten != sizeof(bfh))
   {
      CloseHandle(hFile);
      return FALSE;
   }
   if(!WriteFile(hFile, pHeader, pHeader->biSize, &nWritten, NULL) || nWritten != pHeader->biSize)
   {
      CloseHandle(hFile);
      return FALSE;
   }
   if(!WriteFile(hFile, pBits, pHeader->biSizeImage, &nWritten, NULL) || nWritten != pHeader->biSizeImage)
   {
      CloseHandle(hFile);
      return FALSE;
   }
   CloseHandle(hFile);
   return TRUE;
}
/////////////////////////////////////////////////////////////////
// SplitAvi
// splits an avi file into individual BMP files
// pszAviFile - source file name
// pszOutputDir - directory of output BMP files (split?.bmp)
// nMaxFrames - maximum number of BMP files (frames) to generate
//
HRESULT SplitAvi(LPCWSTR pszAviFile, LPCWSTR pszOutputDir, int nMaxFrames)
{
   HRESULT hr;
   IltmmConvert* pConvert = NULL;
   IltmmSampleTarget* pSampleTarget = NULL;
   IltmmMediaTypeDisp* pMediaType = NULL;
   IltmmMediaSampleDisp* pMediaSample;
   VARIANT varFormat;
   VARIANT varBuffer;
   VIDEOINFOHEADER* pVIH;
   void* pBuffer;
   BSTR bstr;
   int n;
   WCHAR szFile[MAX_PATH];
   // 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**) &pConvert);
   if(FAILED(hr))
      goto error;
   // create the target object
   hr = CoCreateInstance(CLSID_ltmmSampleTarget, NULL, CLSCTX_INPROC_SERVER, IID_IltmmSampleTarget, (void**) &pSampleTarget);
   if(FAILED(hr))
      goto error;
   // create the media type object
   hr = CoCreateInstance(CLSID_ltmmMediaType, NULL, CLSCTX_INPROC_SERVER, IID_IltmmMediaTypeDisp, (void**) &pMediaType);
   if(FAILED(hr))
      goto error;
   // set type to MEDIATYPE_Video
   bstr = SysAllocString(L"{73646976-0000-0010-8000-00AA00389B71}");
   hr = pMediaType->put_Type(bstr);
   SysFreeString(bstr);
   if(FAILED(hr))
      goto error;
   // set subtype to MEDIASUBTYPE_RGB24
   bstr = SysAllocString(L"{e436eb7d-524f-11ce-9f53-0020af0ba770}");
   hr = pMediaType->put_Subtype(bstr);
   SysFreeString(bstr);
   if(FAILED(hr))
      goto error;
   //   set the accepted media type
   hr = pSampleTarget->SetAcceptedMediaType(pMediaType);
   if(FAILED(hr))
      goto error;

   hr = pSampleTarget->put_TargetFormat((long)ltmmSampleTarget_TargetFormat_Undefined); // pass a value here that matches the expect output format, or undefined to accept default

   pMediaType->Release();
   pMediaType = NULL;
#ifdef _DEBUG
   // get it back for debugging
   hr = pSampleTarget->GetAcceptedMediaType(&pMediaType);
   if(FAILED(hr))
      goto error;
   pMediaType->Release();
   pMediaType = NULL;
#endif
   // set the convert input file name
   bstr = SysAllocString(pszAviFile);
   hr = pConvert->put_SourceFile(bstr);
   SysFreeString(bstr);
   if(FAILED(hr))
      goto error;
   // set the convert object target
   hr = pConvert->put_TargetObject(pSampleTarget);
   if(FAILED(hr))
      goto error;
   // start the conversion
   hr = pConvert->StartConvert();
   if(FAILED(hr))
      goto error;
   // get the connected media type
   hr = pSampleTarget->GetConnectedMediaType(&pMediaType);
   if(FAILED(hr))
      goto error;
   // get the VIDEOINFOHEADER
   hr = pMediaType->get_Format(&varFormat);
   if(FAILED(hr))
      goto error;
   hr = SafeArrayAccessData(V_ARRAY(&varFormat), (void**) &pVIH);
   if(FAILED(hr))
   {
      VariantClear(&varFormat);
      goto error;
   }
   for(n = 0; n < nMaxFrames; n++)
   {
      // fetch a sample
      hr = pSampleTarget->GetSample(1000, &pMediaSample);
      if(FAILED(hr) || !pMediaSample)
         break;
      // access the image bits
      hr = pMediaSample->get_Buffer(&varBuffer);
      if(FAILED(hr))
      {
         pMediaSample->Release();
         goto converterror;
      }
      hr = SafeArrayAccessData(V_ARRAY(&varBuffer), &pBuffer);
      if(FAILED(hr))
      {
         VariantClear(&varBuffer);
         pMediaSample->Release();
         goto converterror;
      }
      // save the image
      swprintf(szFile, L"%ssplit%u.bmp", pszOutputDir, n + 1);
      if(!SaveBMP24(szFile, &pVIH->bmiHeader, pBuffer))
      {
         SafeArrayUnaccessData(V_ARRAY(&varBuffer));
         VariantClear(&varBuffer);
         pMediaSample->Release();
         hr = E_FAIL;
         goto error;
      }
      SafeArrayUnaccessData(V_ARRAY(&varBuffer));
      VariantClear(&varBuffer);
      pMediaSample->Release();
   }
   // stop
   hr = pConvert->StopConvert();
   if(FAILED(hr))
      goto converterror;
   // cleanup and exit
   hr = S_OK;converterror:
   SafeArrayUnaccessData(V_ARRAY(&varFormat));
   VariantClear(&varFormat);

error:
   if(pConvert)
      pConvert->Release();
   if(pSampleTarget)
      pSampleTarget->Release();
   if(pMediaType)
      pMediaType->Release();
   CoUninitialize();
   return hr;
}
int main(int argc, char* argv[])
{
   SplitAvi((OLECHAR*)MAKE_MEDIA_PATH("count.avi"), (OLECHAR*)MAKE_MEDIA_PATH(""), 10);
   return 0;
}
Products | Support | Contact Us | Copyright Notices
© 2006-2014 All Rights Reserved. LEAD Technologies, Inc.