Files
Work/avifile/hold/MAIN.CPP
2024-08-07 09:12:07 -04:00

287 lines
9.2 KiB
C++

#include <common/bitmap.hpp>
#include <common/file.hpp>
#include <jpgimg/jpgimg.hpp>
#include <avifile/avifile.hpp>
#include <avifile/mainhdr.hpp>
#include <avifile/vidc.hpp>
#include <avifile/riffhdr.hpp>
bool proto1(void);
bool proto2(const String &pathAVIFile);
bool createAVIFile(const String &pathAVIFile,Block<Bitmap> &images);
bool createAVIFile(const String &pathAVIFile,Block<SmartPointer<JPGImage> >&images);
bool createAVI(const String &pathAVIFile);
int PASCAL WinMain(HINSTANCE /*hInstance*/,HINSTANCE /*hPrevInstance*/,LPSTR lpszCmdLine,int /*nCmdShow*/)
{
Block<SmartPointer<JPGImage> > images;
images.insert(&SmartPointer<JPGImage>());
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<Bitmap> 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<SmartPointer<JPGImage> >&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<images.size();index++)
{
JPGImage &image=*images[index];
GlobalData<BYTE> 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<Bitmap> &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;index<images.size();index++)
{
Bitmap &bitmap=images[index];
hResult=AVIStreamWrite(pStream,index,1,
bitmap.ptrData(),
bitmap.getInfoPtr()->bmiHeader.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<DriverName> driverNames;
videoCodec.enumerateDrivers(driverNames);
for(int index=0;index<driverNames.size();index++)
{
::OutputDebugString(driverNames[index].driverName()+String("\n"));
}
if(!(VideoCodec::OkResult==videoCodec.openDriver(driverName)))return false;
icmOpen.fccType(aviStreamData[0].fccType());
icmOpen.fccHandler(aviStreamData[0].fccHandler());
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<streamCount;streamIndex++)
{
if(!StreamType::Video==aviStreamData[streamIndex].streamType())continue;
AVIBitmap &aviBitmap=aviStreamData[streamIndex].getBitmap();
AVIBitmap dstBitmap(aviBitmap);
dstBitmap.compression(BI_RGB);
dstBitmap.sizeImage(dstBitmap.width()*dstBitmap.height());
dstBitmap.colorUsed(aviBitmap.colorUsed());
if(VideoCodec::FailResult==videoCodec.canDecompress(aviBitmap))continue;
WORD movieCount(((AVIMovieHeader&)aviFile).size());
for(short movieIndex=0;movieIndex<movieCount;movieIndex++)
{
MovieData &srcMovieData=((AVIMovieHeader&)aviFile)[movieIndex];
if(!((srcMovieData.streamNumber()==streamIndex)&&
(MovieData::DIBCompressed==srcMovieData.dataType()||
MovieData::IV==srcMovieData.dataType()||
MovieData::DIBUnCompressed==srcMovieData.dataType())))continue;
String pathFileName;
MovieData dstMovieData;
dstMovieData.dataType(srcMovieData.dataType());
dstMovieData.streamNumber(srcMovieData.streamNumber());
::sprintf(pathFileName,"FRM%05d.BMP",frameCount++);
if(VideoCodec::OkResult!=videoCodec.decompressFrame(aviBitmap,dstBitmap,srcMovieData,dstMovieData))
{
::printf("Error decompressing frame\n");
continue;
}
Bitmap imageBitmap(pathFileName,(BitmapInfo&)dstBitmap,(GlobalData<BYTE>&)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<streamCount;streamIndex++)
{
if(!StreamType::Video==aviStreamData[streamIndex].streamType())continue;
AVIBitmap &aviBitmap=(AVIBitmap&)(aviStreamData[streamIndex]);
AVIBitmap dstBitmap(aviBitmap);
dstBitmap.compression(BI_RGB);
dstBitmap.sizeImage(dstBitmap.width()*dstBitmap.height());
dstBitmap.colorUsed(0);
// if(VideoCodec::FailResult==videoCodec.canDecompress(aviBitmap))continue;
WORD movieCount(((AVIMovieHeader&)aviFile).size());
for(short movieIndex=0;movieIndex<movieCount;movieIndex++)
{
MovieData &srcMovieData=((AVIMovieHeader&)aviFile)[movieIndex];
if(!((srcMovieData.streamNumber()==streamIndex)&&
(MovieData::DIBCompressed==srcMovieData.dataType()||
MovieData::IV==srcMovieData.dataType()||
MovieData::DIBUnCompressed==srcMovieData.dataType())))continue;
File outfile;
outfile.open("d:\\frame.dvsd","wb");
outfile.write((char*)&srcMovieData[0],srcMovieData.size());
String pathFileName;
MovieData dstMovieData;
dstMovieData.dataType(srcMovieData.dataType());
dstMovieData.streamNumber(srcMovieData.streamNumber());
::sprintf(pathFileName,"FRM%05d.BMP",frameCount++);
Bitmap imageBitmap(pathFileName,(BitmapInfo&)aviBitmap,(GlobalData<BYTE>&)srcMovieData);
imageBitmap.saveBitmap();
if(VideoCodec::OkResult!=videoCodec.decompressFrame(aviBitmap,dstBitmap,srcMovieData,dstMovieData))
{
::printf("Error decompressing frame\n");
continue;
}
// Bitmap imageBitmap(pathFileName,(BitmapInfo&)dstBitmap,(GlobalData<BYTE>&)dstMovieData);
// imageBitmap.saveBitmap();
}
}
videoCodec.closeDriver();
return FALSE;
}