210 lines
11 KiB
Plaintext
210 lines
11 KiB
Plaintext
#define capSetCallbackOnError(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_ERROR, 0, (LPARAM)(LPVOID)(fpProc)))
|
|
#define capSetCallbackOnStatus(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, (LPARAM)(LPVOID)(fpProc)))
|
|
#define capSetCallbackOnYield(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_YIELD, 0, (LPARAM)(LPVOID)(fpProc)))
|
|
#define capSetCallbackOnFrame(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_FRAME, 0, (LPARAM)(LPVOID)(fpProc)))
|
|
#define capSetCallbackOnVideoStream(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, (LPARAM)(LPVOID)(fpProc)))
|
|
#define capSetCallbackOnWaveStream(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, (LPARAM)(LPVOID)(fpProc)))
|
|
#define capSetCallbackOnCapControl(hwnd, fpProc) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, (LPARAM)(LPVOID)(fpProc)))
|
|
|
|
#define capSetUserData(hwnd, lUser) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_USER_DATA, 0, (LPARAM)lUser))
|
|
#define capGetUserData(hwnd) (AVICapSM(hwnd, WM_CAP_GET_USER_DATA, 0, 0))
|
|
|
|
#define capDriverConnect(hwnd, i) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_CONNECT, (WPARAM)(i), 0L))
|
|
#define capDriverDisconnect(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_DISCONNECT, (WPARAM)0, 0L))
|
|
#define capDriverGetName(hwnd, szName, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_NAME, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
#define capDriverGetVersion(hwnd, szVer, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_VERSION, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szVer)))
|
|
#define capDriverGetCaps(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_DRIVER_GET_CAPS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPDRIVERCAPS)(s)))
|
|
|
|
#define capFileSetCaptureFile(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
#define capFileGetCaptureFile(hwnd, szName, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_GET_CAPTURE_FILE, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
#define capFileAlloc(hwnd, dwSize) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_ALLOCATE, 0, (LPARAM)(DWORD)(dwSize)))
|
|
#define capFileSaveAs(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SAVEAS, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
#define capFileSetInfoChunk(hwnd, lpInfoChunk) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SET_INFOCHUNK, (WPARAM)0, (LPARAM)(LPCAPINFOCHUNK)(lpInfoChunk)))
|
|
#define capFileSaveDIB(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_FILE_SAVEDIB, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
|
|
#define capEditCopy(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_EDIT_COPY, 0, 0L))
|
|
|
|
#define capSetAudioFormat(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_AUDIOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPWAVEFORMATEX)(s)))
|
|
#define capGetAudioFormat(hwnd, s, wSize) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPWAVEFORMATEX)(s)))
|
|
#define capGetAudioFormatSize(hwnd) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, (WPARAM)0, (LPARAM)0L))
|
|
|
|
#define capDlgVideoFormat(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0L))
|
|
#define capDlgVideoSource(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0L))
|
|
#define capDlgVideoDisplay(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0L))
|
|
#define capDlgVideoCompression(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0L))
|
|
|
|
#define capGetVideoFormat(hwnd, s, wSize) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(s)))
|
|
#define capGetVideoFormatSize(hwnd) ((DWORD)AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0L))
|
|
#define capSetVideoFormat(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_VIDEOFORMAT, (WPARAM)(wSize), (LPARAM)(LPVOID)(s)))
|
|
|
|
|
|
#define capOverlay(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_OVERLAY, (WPARAM)(BOOL)(f), 0L))
|
|
#define capPreviewScale(hwnd, f) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCALE, (WPARAM)(BOOL)f, 0L))
|
|
#define capGetStatus(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_GET_STATUS, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPSTATUS)(s)))
|
|
#define capSetScrollPos(hwnd, lpP) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SCROLL, (WPARAM)0, (LPARAM)(LPPOINT)(lpP)))
|
|
|
|
#define capGrabFrame(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME, (WPARAM)0, (LPARAM)0L))
|
|
#define capGrabFrameNoStop(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME_NOSTOP, (WPARAM)0, (LPARAM)0L))
|
|
|
|
#define capCaptureSequence(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SEQUENCE, (WPARAM)0, (LPARAM)0L))
|
|
#define capCaptureSequenceNoFile(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SEQUENCE_NOFILE, (WPARAM)0, (LPARAM)0L))
|
|
#define capCaptureStop(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_STOP, (WPARAM)0, (LPARAM)0L))
|
|
#define capCaptureAbort(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_ABORT, (WPARAM)0, (LPARAM)0L))
|
|
|
|
#define capCaptureSingleFrameOpen(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_OPEN, (WPARAM)0, (LPARAM)0L))
|
|
#define capCaptureSingleFrameClose(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_CLOSE, (WPARAM)0, (LPARAM)0L))
|
|
#define capCaptureSingleFrame(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_SINGLE_FRAME, (WPARAM)0, (LPARAM)0L))
|
|
|
|
#define capCaptureGetSetup(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_GET_SEQUENCE_SETUP, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPTUREPARMS)(s)))
|
|
#define capCaptureSetSetup(hwnd, s, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_SEQUENCE_SETUP, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPCAPTUREPARMS)(s)))
|
|
|
|
#define capSetMCIDeviceName(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_SET_MCI_DEVICE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
#define capGetMCIDeviceName(hwnd, szName, wSize) ((BOOL)AVICapSM(hwnd, WM_CAP_GET_MCI_DEVICE, (WPARAM)(wSize), (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
|
|
#define capPaletteOpen(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_OPEN, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
#define capPaletteSave(hwnd, szName) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_SAVE, 0, (LPARAM)(LPVOID)(LPTSTR)(szName)))
|
|
#define capPalettePaste(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_PASTE, (WPARAM) 0, (LPARAM)0L))
|
|
#define capPaletteAuto(hwnd, iFrames, iColors) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_AUTOCREATE, (WPARAM)(iFrames), (LPARAM)(DWORD)(iColors)))
|
|
#define capPaletteManual(hwnd, fGrab, iColors) ((BOOL)AVICapSM(hwnd, WM_CAP_PAL_MANUALCREATE, (WPARAM)(fGrab), (LPARAM)(DWORD)(iColors)))
|
|
|
|
|
|
#if 0
|
|
if(mhCaptureWnd)
|
|
{
|
|
::SendMessage(mhCaptureWnd,WM_CAP_STOP,0,0L);
|
|
::SendMessage(mhCaptureWnd,WM_CAP_DRIVER_DISCONNECT,0,0L);
|
|
::DestroyWindow(mhCaptureWnd);
|
|
}
|
|
mhCaptureWnd=capCreateCaptureWindow("My Capture Window",WS_CHILD|WS_VISIBLE,0,0,160,120,*this,101);
|
|
::SendMessage(mhCaptureWnd,WM_CAP_DRIVER_CONNECT,0,0L);
|
|
::SendMessage(mhCaptureWnd,WM_CAP_SEQUENCE_NOFILE,0,0L);
|
|
::SendMessage(mhCaptureWnd,WM_CAP_SEQUENCE,0,0L);
|
|
|
|
#define capGrabFrame(hwnd) ((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME, (WPARAM)0, (LPARAM)0L))
|
|
|
|
#endif
|
|
|
|
|
|
#if 0
|
|
BITMAPINFOHEADER bitmapInfoHeader;
|
|
bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
|
|
bitmapInfoHeader.biCompression = BI_RGB;
|
|
bitmapInfoHeader.biWidth = 160;
|
|
bitmapInfoHeader.biHeight = 120;
|
|
bitmapInfoHeader.biPlanes = 1;
|
|
bitmapInfoHeader.biBitCount = 8;
|
|
bitmapInfoHeader.biSizeImage = bitmapInfoHeader.biWidth * bitmapInfoHeader.biHeight *
|
|
bitmapInfoHeader.biPlanes * bitmapInfoHeader.biBitCount / 8;
|
|
bitmapInfoHeader.biXPelsPerMeter = 0;
|
|
bitmapInfoHeader.biYPelsPerMeter = 0;
|
|
bitmapInfoHeader.biClrUsed = 0;
|
|
bitmapInfoHeader.biClrImportant = 0;
|
|
return ::SendMessage(mhCaptureWnd,WM_CAP_SET_VIDEOFORMAT,(WPARAM)sizeof(BITMAPINFOHEADER),(LPARAM)&bitmapInfoHeader);
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
BmpCap::BmpCap(HWND hParentWnd)
|
|
: mSequence(0)
|
|
{
|
|
ICMOpen icmOpen;
|
|
create(hParentWnd,320,200);
|
|
connect(0);
|
|
getVideoFormat(mBitmapInfo);
|
|
if(!mVideoCodec.openDriver(mBitmapInfo.compression()))::OutputDebugString("Failed to open decompressor\n");
|
|
icmOpen.fccType(CFOURCC("vidc"));
|
|
icmOpen.fccHandler(mBitmapInfo.compression());
|
|
icmOpen.flags(ICMOpen::DeCompress);
|
|
icmOpen.version(0);
|
|
if(!mVideoCodec.driverProc(icmOpen)){::OutputDebugString("ICMOpen failed\n");return;};
|
|
// if(!mVideoCodec.driverLoad())::OutputDebugString("Failed to load driver\n");
|
|
if(!mVideoCodec.driverEnable(true)){::OutputDebugString("DriverEnable failed\n");return;}
|
|
getVideoFormat(mBitmapInfo);
|
|
// setPreviewRate(500);
|
|
// preview(true);
|
|
}
|
|
|
|
|
|
|
|
STRINGTABLE DISCARDABLE
|
|
BEGIN
|
|
STRING_OPTIONS "OPTIONS"
|
|
STRING_RATE "RATE"
|
|
STRING_SAVE "SAVE"
|
|
STRING_SITES "SITES"
|
|
STRING_NAME "NAME"
|
|
STRING_USER "USER"
|
|
STRING_PASSWORD "PASSWORD"
|
|
STRING_DIRECTORY "DIRECTORY"
|
|
STRING_INIFILENAME "BMPCAP.INI"
|
|
STRING_UNSET "UNSET"
|
|
STRING_DEFAULTRATE "50"
|
|
END
|
|
|
|
|
|
#define STRING_OPTIONS 101
|
|
#define STRING_RATE 102
|
|
#define STRING_SAVE 103
|
|
#define STRING_SITES 104
|
|
#define STRING_NAME 105
|
|
#define STRING_USER 106
|
|
#define STRING_PASSWORD 107
|
|
#define STRING_DIRECTORY 108
|
|
#define STRING_INIFILENAME 109
|
|
#define STRING_UNSET 110
|
|
#define STRING_DEFAULTRATE 111
|
|
#define STRING_DEFAULTSAVEFILE 112
|
|
|
|
|
|
|
|
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);
|
|
// srcPathFileName.reserve(1024);
|
|
::sprintf(strTime,"%04d%02d%02d%02d%02d%02d%02d",
|
|
systemTime.year(),systemTime.month(),systemTime.day(),
|
|
systemTime.hour(),systemTime.minute(),systemTime.second(),
|
|
systemTime.milliseconds());
|
|
// ::sprintf(srcPathFileName,"%04d%02d%02d%02d%02d%02d%02d.BMP",
|
|
// 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,dstPathFileName,mQuality);
|
|
ImageConverter::convert(srcPathFileName,dstPathFileTempName,mQuality);
|
|
diskInfo.rename(dstPathFileTempName,dstPathFileName);
|
|
diskInfo.unlink(srcPathFileName);
|
|
}
|