Files
Work/vidcap/BMPCAP.CPP
2024-08-07 09:16:27 -04:00

185 lines
6.0 KiB
C++

#include <vidcap/bmpcap.hpp>
#include <vidcap/vidreg.hpp>
#include <common/bitmap.hpp>
#include <common/purepal.hpp>
#include <common/systime.hpp>
#include <jpeg-6b/bmpjpg.hpp>
BmpCap::BmpCap()
: mSequence(0), mSaveFrames(0), mUseSequence(false)
{
}
BmpCap::BmpCap(HWND hParentWnd,DWORD driverIndex)
: mSequence(0), mSaveFrames(false), mUseSequence(false)
{
initialize(hParentWnd,driverIndex);
}
BmpCap::~BmpCap()
{
// mVideoCodec.driverEnable(false);
}
void BmpCap::initialize(HWND hParentWnd,DWORD driverIndex)
{
DWORD previewWidth;
DWORD previewHeight;
DriverCaps driverCaps;
ICMOpen icmOpen;
VidReg vidReg;
mUseSequence=vidReg.getSequencing();
mCaptureWidth=vidReg.getCaptureWidth();
mCaptureHeight=vidReg.getCaptureHeight();
mCaptureFile=vidReg.getCaptureFile();
mQuality=vidReg.getQuality();
previewWidth=vidReg.getPreviewWidth();
previewHeight=vidReg.getPreviewHeight();
create(hParentWnd,vidReg.getPreviewWidth(),vidReg.getPreviewHeight());
connect(driverIndex);
if(!isConnected())return;
getDriverCaps(driverCaps);
getVideoFormat(mBitmapInfo);
mBitmapInfo.width(previewWidth);
mBitmapInfo.height(previewHeight);
setVideoFormat(mBitmapInfo);
if(mVideoCodec.openDriver(mBitmapInfo.compression()))message("[BmpCap::initialize]Failed to open decompressor.");
icmOpen.fccType(FOURCC("vidc"));
icmOpen.fccHandler(mBitmapInfo.compression());
icmOpen.flags(ICMOpen::DeCompress);
icmOpen.version(0);
if(!mVideoCodec.driverProc(icmOpen)){message("[BmpCap::initialize]ICMOpen failed");return;};
if(!mVideoCodec.driverEnable()){message("[BmpCap::initialize]DriverEnable failed");return;}
getVideoFormat(mBitmapInfo);
}
// virtuals
#if 0
void BmpCap::frameHandler(VIDEOHDR &videoHeader)
{
if(!saveFrames())return;
MovieData movieData(MovieData::DIBCompressed);
MovieData dstMovieData;
DiskInfo diskInfo;
String srcPathFileName;
String dstPathFileName;
String dstPathFileTempName;
String strTime;
SystemTime systemTime;
strTime.reserve(512);
::sprintf(strTime,"%04d%02d%02d%02d%02d%02d%02d",
systemTime.year(),systemTime.month(),systemTime.day(),
systemTime.hour(),systemTime.minute(),systemTime.second(),
systemTime.milliseconds());
srcPathFileName=strTime+".bmp";
dstPathFileTempName=strTime+"tmp.jpg";
if(mUseSequence)dstPathFileName=mCaptureFile.betweenString(0,'.')+String().fromInt(mSequence++)+String(".jpg");
else dstPathFileName=mCaptureFile;
movieData.size(videoHeader.dwBufferLength);
::memcpy((BYTE*)&movieData[0],videoHeader.lpData,videoHeader.dwBufferLength);
if(!mVideoCodec.getFormat(mBitmapInfo,mDstBitmapInfo))return;
mDstBitmapInfo.width(mCaptureWidth);
mDstBitmapInfo.height(mCaptureHeight);
if(!mVideoCodec.decompressFrame(mBitmapInfo,mDstBitmapInfo,movieData,dstMovieData))
{
if(!mVideoCodec.decompressFrame(mBitmapInfo,movieData,dstMovieData))return;
if(!mVideoCodec.getFormat(mBitmapInfo,mDstBitmapInfo))return;
}
Bitmap frameBitmap(srcPathFileName,mDstBitmapInfo,dstMovieData);
if(BitmapInfo::Bit8==mDstBitmapInfo.bitCount())
{
PurePalette purePalette(mCaptureStatus.currentPalette());
frameBitmap.setPalette(purePalette.getPalette(),FALSE);
}
frameBitmap.saveBitmap();
ImageConverter::convert(srcPathFileName,dstPathFileTempName,mQuality);
diskInfo.rename(dstPathFileTempName,dstPathFileName);
diskInfo.unlink(srcPathFileName);
}
#endif
void BmpCap::frameHandler(VIDEOHDR &videoHeader)
{
if(!saveFrames())return;
MovieData movieData(MovieData::DIBCompressed);
MovieData dstMovieData;
DiskInfo diskInfo;
String srcPathFileName;
String dstPathFileName;
String dstPathFileTempName;
String strTime;
SystemTime systemTime;
DWORD elapsedTime;
String strMessage;
strMessage.reserve(512);
elapsedTime=::GetTickCount();
strTime.reserve(512);
::sprintf(strTime,"%04d%02d%02d%02d%02d%02d%02d",
systemTime.year(),systemTime.month(),systemTime.day(),
systemTime.hour(),systemTime.minute(),systemTime.second(),
systemTime.milliseconds());
srcPathFileName=strTime+".bmp";
dstPathFileTempName=strTime+"tmp.jpg";
if(mUseSequence)dstPathFileName=mCaptureFile.betweenString(0,'.')+String().fromInt(mSequence++)+String(".jpg");
else dstPathFileName=mCaptureFile;
movieData.size(videoHeader.dwBufferLength);
::memcpy((BYTE*)&movieData[0],videoHeader.lpData,videoHeader.dwBufferLength);
// if(!mVideoCodec.getFormat(mBitmapInfo,mDstBitmapInfo))return;
if(!(ICERR_OK==mVideoCodec.getFormat(mBitmapInfo,mDstBitmapInfo)))return;
mDstBitmapInfo.width(mCaptureWidth);
mDstBitmapInfo.height(mCaptureHeight);
elapsedTime=::GetTickCount()-elapsedTime;
::sprintf(strMessage,"[BmpCap::frameHandler] Prologue took (ms) "+String().fromInt(elapsedTime));
message(strMessage);
elapsedTime=::GetTickCount();
if(ICERR_OK!=mVideoCodec.decompressFrame(mBitmapInfo,mDstBitmapInfo,movieData,dstMovieData))
{
if(ICERR_OK!=mVideoCodec.decompressFrame(mBitmapInfo,movieData,dstMovieData))return;
if(ICERR_OK!=mVideoCodec.getFormat(mBitmapInfo,mDstBitmapInfo))return;
}
elapsedTime=::GetTickCount()-elapsedTime;
::sprintf(strMessage,"[BmpCap::frameHandler] Decompress frame took (ms) "+String().fromInt(elapsedTime));
message(strMessage);
elapsedTime=::GetTickCount();
Bitmap frameBitmap(srcPathFileName,mDstBitmapInfo,dstMovieData);
if(BitmapInfo::Bit8==mDstBitmapInfo.bitCount())
{
PurePalette purePalette(mCaptureStatus.currentPalette());
frameBitmap.setPalette(purePalette.getPalette(),FALSE);
}
frameBitmap.saveBitmap();
elapsedTime=::GetTickCount()-elapsedTime;
::sprintf(strMessage,"[BmpCap::frameHandler] Save bitmap took (ms) "+String().fromInt(elapsedTime));
message(strMessage);
elapsedTime=::GetTickCount();
ImageConverter::convert(srcPathFileName,dstPathFileTempName,mQuality);
elapsedTime=::GetTickCount()-elapsedTime;
::sprintf(strMessage,"[BmpCap::frameHandler] Convert to jpeg took (ms) "+String().fromInt(elapsedTime));
message(strMessage);
diskInfo.rename(dstPathFileTempName,dstPathFileName);
diskInfo.unlink(srcPathFileName);
}
void BmpCap::message(const String &message)
{
return;
}