#include #include #include #include #include #include #include bool proto1(void); bool proto2(const String &pathAVIFile); bool createAVIFile(const String &pathAVIFile,Block &images); bool createAVIFile(const String &pathAVIFile,Block >&images); bool createAVI(const String &pathAVIFile); int PASCAL WinMain(HINSTANCE /*hInstance*/,HINSTANCE /*hPrevInstance*/,LPSTR lpszCmdLine,int /*nCmdShow*/) { Block > images; images.insert(&SmartPointer()); images[0]=new JPGImage(); images[0].disposition(PointerDisposition::Delete); images[0]->decode("d:\\im000256.jpg"); createAVIFile("d:\\foo.avi",images); // return proto2("c:\\winnt\\clock.avi"); // return proto2("d:\\foo.avi"); // return proto2("d:\\avi\\capture2.avi"); // return createAVI("d:\\foo.avi"); return 0; } bool createAVI(const String &pathAVIFile) { Block bitmaps; bitmaps.insert(&Bitmap()); Bitmap &bitmap=bitmaps[0]; bitmap="d:\\work\\avifile\\frm00011.bmp"; // return createAVIFile(pathAVIFile,bitmaps); return createAVIFile(pathAVIFile,bitmaps); } bool createAVIFile(const String &pathAVIFile,Block >&images) { PAVIFILE pFile; PAVISTREAM pStream; AVISTREAMINFO aviStreamInfo; HRESULT hResult; pFile=0; pStream=0; AVIFileInit(); hResult=AVIFileOpen(&pFile,pathAVIFile,OF_WRITE|OF_CREATE,NULL); if(hResult!=AVIERR_OK)return false; JPGImage &image=*images[0]; ::memset(&aviStreamInfo,0,sizeof(AVISTREAMINFO)); aviStreamInfo.fccType=streamtypeVIDEO; aviStreamInfo.fccHandler=0; aviStreamInfo.dwScale=1; aviStreamInfo.dwRate=1; aviStreamInfo.dwSuggestedBufferSize=image.getBitmapInfo().sizeImage(); SetRect(&aviStreamInfo.rcFrame,0,0,image.width(),image.height()); hResult=AVIFileCreateStream(pFile,&pStream,&aviStreamInfo); if(hResult==AVIERR_OK) { hResult=AVIStreamSetFormat(pStream,0,&image.getBitmapInfo().getBITMAPINFOHEADER(), image.getBitmapInfo().getBITMAPINFOHEADER().biSize+(image.getBitmapInfo().getBITMAPINFOHEADER().biClrUsed*sizeof(RGBQUAD))); if(hResult==AVIERR_OK) { for(int index=0;index rawData; image.getRawData(rawData); hResult=AVIStreamWrite(pStream,index,1, &rawData[0], rawData.size(), AVIIF_KEYFRAME,0,0); if(hResult!=AVIERR_OK)break; } } } if(pStream)AVIStreamClose(pStream); if(pFile)AVIFileClose(pFile); AVIFileExit(); return true; } bool createAVIFile(const String &pathAVIFile,Block &images) { PAVIFILE pFile; PAVISTREAM pStream; AVISTREAMINFO aviStreamInfo; HRESULT hResult; pFile=0; pStream=0; AVIFileInit(); hResult=AVIFileOpen(&pFile,pathAVIFile,OF_WRITE|OF_CREATE,NULL); if(hResult!=AVIERR_OK)return false; Bitmap bitmap=images[0]; ::memset(&aviStreamInfo,0,sizeof(AVISTREAMINFO)); aviStreamInfo.fccType=streamtypeVIDEO; aviStreamInfo.fccHandler=0; aviStreamInfo.dwScale=1; aviStreamInfo.dwRate=1; aviStreamInfo.dwSuggestedBufferSize=bitmap.getInfoPtr()->bmiHeader.biSizeImage; SetRect(&aviStreamInfo.rcFrame,0,0,bitmap.width(),bitmap.height()); hResult=AVIFileCreateStream(pFile,&pStream,&aviStreamInfo); if(hResult==AVIERR_OK) { hResult=AVIStreamSetFormat(pStream,0,&bitmap.getInfoPtr()->bmiHeader,bitmap.getInfoPtr()->bmiHeader.biSize+(bitmap.getInfoPtr()->bmiHeader.biClrUsed*sizeof(RGBQUAD))); if(hResult==AVIERR_OK) { for(int index=0;indexbmiHeader.biSizeImage, AVIIF_KEYFRAME,0,0); if(hResult!=AVIERR_OK)break; } } } if(pStream)AVIStreamClose(pStream); if(pFile)AVIFileClose(pFile); AVIFileExit(); return true; } bool proto2(const String &pathAVIFile) { VideoCodec videoCodec; ICMOpen icmOpen; ICMInfo icmInfo; ICMDecompress icmDecompress; WORD streamCount; WORD frameCount(0); AVIFile aviFile(pathAVIFile); AVIStreamData &aviStreamData=(AVIStreamData&)aviFile; if(0==(streamCount=aviStreamData.size()))return FALSE; ::OutputDebugString(String("FCCType:")+aviStreamData[0].fccType().toString()+String("\n")); ::OutputDebugString(String("FCCHandler:")+aviStreamData[0].fccHandler().toString()+String("\n")); FOURCC driverName("mrle"); Block driverNames; videoCodec.enumerateDrivers(driverNames); for(int index=0;index&)dstMovieData); imageBitmap.saveBitmap(); } } videoCodec.closeDriver(); return FALSE; } bool proto1(void) { VideoCodec videoCodec; ICMOpen icmOpen; ICMInfo icmInfo; ICMDecompress icmDecompress; WORD streamCount; WORD frameCount(0); String commandLine; // if(!(VideoCodec::OkResult==videoCodec.openDriver(FOURCC("I420"))))return FALSE; // lpszCmdLine="D:\\CAPTURE1.AVI"; commandLine="D:\\CAPTURE2.AVI"; // commandLine="c:\\winnt\\clock.avi"; AVIFile aviFile(commandLine); AVIStreamData &aviStreamData=(AVIStreamData&)aviFile; if(0==(streamCount=aviStreamData.size()))return FALSE; ::OutputDebugString(String("FCCType:")+aviStreamData[0].fccType().toString()+String("\n")); ::OutputDebugString(String("FCCHandler:")+aviStreamData[0].fccHandler().toString()+String("\n")); icmOpen.fccType(aviStreamData[0].fccType()); // icmOpen.fccType(FOURCC("vidc")); icmOpen.fccHandler(aviStreamData[0].fccHandler()); // icmOpen.fccType(aviStreamData[0].fccType()); // icmOpen.fccHandler(FOURCC("DIVX")); icmOpen.flags(ICMOpen::DeCompress); icmOpen.version(1); videoCodec.driverLoad(); videoCodec.driverEnable(); videoCodec.driverProc(icmOpen); videoCodec.driverProc(icmInfo); // videoCodec.icmConfigure(::GetFocus()); for(short streamIndex=0;streamIndex&)srcMovieData); imageBitmap.saveBitmap(); if(VideoCodec::OkResult!=videoCodec.decompressFrame(aviBitmap,dstBitmap,srcMovieData,dstMovieData)) { ::printf("Error decompressing frame\n"); continue; } // Bitmap imageBitmap(pathFileName,(BitmapInfo&)dstBitmap,(GlobalData&)dstMovieData); // imageBitmap.saveBitmap(); } } videoCodec.closeDriver(); return FALSE; }