📄 capture.cpp
字号:
ASSERT(_avifile);
if (_avifile) {
_avifile->AddFrame(newdata,size,TimeFrame());
}
}
return NULL;
}
BOOL CCapture::BeginCompression() {
if (IsCompressed()) {
//if (!capSetVideoFormat(capHwnd,_compvars.lpbiOut,sizeof(BITMAPINFO))) {
// Debug("error capsetVideoFormat");
//}
if (ICSeqCompressFrameStart(&_compvars,_bmpInfo)) {
_compressionstarted=TRUE;
if (!_tcl_VideoStreamCb) {
if (!capSetCallbackOnVideoStream(capHwnd,CompressCallback)) {
return FALSE;
}
_VideoStreamCb=CompressCallback;
}
} else {
return FALSE;
}
}
return TRUE;
}
BOOL CCapture::EndCompression() {
if (_compressionstarted) {
ICSeqCompressFrameEnd(&_compvars);
_compressionstarted=FALSE;
if (!_tcl_VideoStreamCb)
capSetCallbackOnVideoStream(capHwnd,NULL);
_VideoStreamCb=NULL;
}
return TRUE;
}
BOOL CCapture::IsCompressed() {
DWORD value;
memcpy(&value,"DIB ",4);
if (_compvars.fccHandler==value) {
return FALSE;
}
return TRUE;
}
CCapture *CCapture::FindFromHwnd(HWND hwnd) {
CCapture::cell *cel=_allCaptures;
while (cel) {
if (cel->cap->capHwnd==hwnd) {
return cel->cap;
}
cel=cel->suiv;
}
return NULL;
}
BOOL CCapture::_getBITMAPINFO() {
int size=capGetVideoFormatSize(capHwnd);
if(!size) return FALSE;
if(_bmpInfo) {
delete _bmpInfo;
_bmpInfo=NULL;
}
_bmpInfo =(BITMAPINFO*)(new char[size]);
LPBITMAPINFOHEADER bmpIH=( LPBITMAPINFOHEADER )_bmpInfo;
bmpIH->biSize= sizeof BITMAPINFOHEADER;
return capGetVideoFormat(capHwnd,_bmpInfo,(WORD)size);
}
PCOMPVARS CCapture::GetCompressor() {
return &_compvars;
}
void CCapture::SetCompressor(PCOMPVARS compvars) {
memcpy(&_compvars,compvars,sizeof(COMPVARS));
}
LPVOID CCapture::Compress(LPVOID data,long *size,BOOL *isIndex) {
LPVOID res=ICSeqCompressFrame(&_compvars,0,data,isIndex,size);
return res;
}
BOOL CCapture::SetTclVideoStreamCallback(Tcl_Obj *o,int compressed) {
if (o) {
_tcl_VideoStreamCb=Tcl_DuplicateObj(o);
Tcl_IncrRefCount(_tcl_VideoStreamCb);
} else {
Tcl_DecrRefCount(_tcl_VideoStreamCb);
_tcl_VideoStreamCb=NULL;
}
_tcl_VideoStreamCbCompression=compressed;
if (o) {
return capSetCallbackOnVideoStream(capHwnd,TclVideoStreamCallback);
} else {
if (_compressionstarted)
return capSetCallbackOnVideoStream(capHwnd,CompressCallback);
else return capSetCallbackOnVideoStream(capHwnd,NULL);
}
}
BOOL CCapture::SetTclWaveStreamCallback(Tcl_Obj *o) {
if (o) {
_tcl_WaveStreamCb=Tcl_DuplicateObj(o);
Tcl_IncrRefCount(_tcl_WaveStreamCb);
} else {
Tcl_DecrRefCount(_tcl_WaveStreamCb);
_tcl_WaveStreamCb=NULL;
}
if (o) {
return capSetCallbackOnWaveStream(capHwnd,TclWaveStreamCallback);
} else {
return capSetCallbackOnWaveStream(capHwnd,NULL);
}
}
BOOL CCapture::SetTclYieldCallback(Tcl_Obj *o) {
if (o) {
_tcl_YieldCb=Tcl_DuplicateObj(o);
Tcl_IncrRefCount(_tcl_YieldCb);
} else {
Tcl_DecrRefCount(_tcl_YieldCb);
_tcl_YieldCb=NULL;
}
if (o) {
return capSetCallbackOnYield(capHwnd,TclYieldCallback);
} else {
return capSetCallbackOnYield(capHwnd,NULL);
}
}
BOOL CCapture::SetTclFrameCallback(Tcl_Obj *o,int compressed) {
if (o) {
_tcl_FrameCb=Tcl_DuplicateObj(o);
Tcl_IncrRefCount(_tcl_FrameCb);
} else {
Tcl_DecrRefCount(_tcl_FrameCb);
_tcl_FrameCb=NULL;
}
_tcl_FrameCbCompression=compressed;
if (o) {
return capSetCallbackOnFrame(capHwnd,TclFrameCallback);
} else {
return capSetCallbackOnFrame(capHwnd,NULL);
}
}
BOOL CCapture::SetTclErrorCallback(Tcl_Obj *o) {
if (o) {
_tcl_ErrorCb=Tcl_DuplicateObj(o);
Tcl_IncrRefCount(_tcl_ErrorCb);
} else {
Tcl_DecrRefCount(_tcl_ErrorCb);
_tcl_ErrorCb=NULL;
}
if (o) {
return capSetCallbackOnError(capHwnd,TclErrorCallback);
} else {
return capSetCallbackOnError(capHwnd,NULL);
}
}
BOOL CCapture::CompressionStarted() {
return _compressionstarted;
}
LPBITMAPINFO CCapture::GetBitmapInfo() {
CHECK_CX()
return _bmpInfo;
}
// Use this callback if capturing a compressed stream to a file
LRESULT PASCAL CompressCallback(HWND hWnd, LPVIDEOHDR lpVHdr) {
CCapture *cap=CCapture::FindFromHwnd(hWnd);
if (cap && cap->_avifile && cap->CompressionStarted()) {
cap->DefaultCompressCallbackAction(lpVHdr);
}
return (LRESULT) TRUE ;
}
LRESULT PASCAL TclVideoStreamCallback(HWND hWnd, LPVIDEOHDR lpVHdr) {
CCapture *cap=CCapture::FindFromHwnd(hWnd);
if (cap->_tcl_VideoStreamCb) {
long size;
LPVOID data;
BOOL compression=cap->_tcl_VideoStreamCbCompression!=TCL_CALLBK_NOTCOMPRESSED?TRUE:FALSE;
if (compression) {
BOOL isIndex;
data=cap->Compress(lpVHdr->lpData,&size,&isIndex);
if (cap->_avifile) {
cap->_avifile->AddFrame(data,size,cap->TimeFrame());
}
} else {
data=lpVHdr->lpData;
size=lpVHdr->dwBufferLength;
}
int nbargs=cap->_tcl_VideoStreamCbCompression==TCL_CALLBK_BOTH?7:5;
Tcl_Obj* args[7];
args[0]=cap->_tcl_VideoStreamCb;
args[1]=Tcl_NewStringObj((LPCTSTR)cap->tclname,-1);
args[2]=Tcl_NewByteArrayObj((unsigned char*)data,size);
args[3]=Tcl_NewIntObj(size);
args[4]=Tcl_NewByteArrayObj((unsigned char*)lpVHdr,sizeof(VIDEOHDR));
if (nbargs==7) {
args[5]=Tcl_NewByteArrayObj((unsigned char*)lpVHdr->lpData,lpVHdr->dwBufferLength);
args[6]=Tcl_NewIntObj(lpVHdr->dwBufferLength);
}
for (int i=1;i<nbargs;i++) {
Tcl_IncrRefCount(args[i]);
}
Tcl_EvalObjv(cap->tclinterp,nbargs,args,TCL_EVAL_GLOBAL);
for (i=1;i<nbargs;i++) {
Tcl_DecrRefCount(args[i]);
}
}
return (LRESULT) TRUE ;
}
LRESULT PASCAL TclWaveStreamCallback(HWND hWnd, LPWAVEHDR lpVHdr) {
CCapture *cap=CCapture::FindFromHwnd(hWnd);
if (cap->_tcl_WaveStreamCb) {
Tcl_Obj* args[5];
args[0]=cap->_tcl_WaveStreamCb;
args[1]=Tcl_NewStringObj((LPCTSTR)cap->tclname,-1);
args[2]=Tcl_NewByteArrayObj((unsigned char*)lpVHdr->lpData,lpVHdr->dwBufferLength);
args[3]=Tcl_NewIntObj(lpVHdr->dwBufferLength);
args[4]=Tcl_NewByteArrayObj((unsigned char*)lpVHdr,sizeof(WAVEHDR));
for (int i=1;i<5;i++) {
Tcl_IncrRefCount(args[i]);
}
Tcl_EvalObjv(cap->tclinterp,5,args,TCL_EVAL_GLOBAL);
for (i=1;i<5;i++) {
Tcl_DecrRefCount(args[i]);
}
}
return (LRESULT) TRUE ;
}
LRESULT CALLBACK TclYieldCallback(HWND hWnd) {
CCapture *cap=CCapture::FindFromHwnd(hWnd);
if (cap->_tcl_YieldCb) {
Tcl_Obj* args[2];
args[0]=cap->_tcl_YieldCb;
args[1]=Tcl_NewStringObj((LPCTSTR)cap->tclname,-1);
for (int i=1;i<2;i++) {
Tcl_IncrRefCount(args[i]);
}
Tcl_EvalObjv(cap->tclinterp,2,args,TCL_EVAL_GLOBAL);
for (i=1;i<2;i++) {
Tcl_DecrRefCount(args[i]);
}
}
return (LRESULT) TRUE ;
}
LRESULT PASCAL TclFrameCallback(HWND hWnd, LPVIDEOHDR lpVHdr) {
CCapture *cap=CCapture::FindFromHwnd(hWnd);
if (cap->_tcl_FrameCb) {
long size;
LPVOID data;
BOOL compression=cap->_tcl_FrameCbCompression!=TCL_CALLBK_NOTCOMPRESSED?TRUE:FALSE;
if (compression) {
BOOL isIndex;
data=cap->Compress(lpVHdr->lpData,&size,&isIndex);
} else {
data=lpVHdr->lpData;
size=lpVHdr->dwBufferLength;
}
int nbargs=cap->_tcl_FrameCbCompression==TCL_CALLBK_BOTH?7:5;
Tcl_Obj* args[7];
args[0]=cap->_tcl_FrameCb;
args[1]=Tcl_NewStringObj((LPCTSTR)cap->tclname,-1);
args[2]=Tcl_NewByteArrayObj((unsigned char*)data,size);
args[3]=Tcl_NewIntObj(size);
args[4]=Tcl_NewByteArrayObj((unsigned char*)lpVHdr,sizeof(VIDEOHDR));
if (nbargs==7) {
args[5]=Tcl_NewByteArrayObj((unsigned char*)lpVHdr->lpData,lpVHdr->dwBufferLength);
args[6]=Tcl_NewIntObj(lpVHdr->dwBufferLength);
}
for (int i=1;i<nbargs;i++) {
Tcl_IncrRefCount(args[i]);
}
Tcl_EvalObjv(cap->tclinterp,nbargs,args,TCL_EVAL_GLOBAL);
for (i=1;i<nbargs;i++) {
Tcl_DecrRefCount(args[i]);
}
}
return (LRESULT) TRUE ;
}
LRESULT CALLBACK TclErrorCallback(HWND hWnd,int nID,LPCSTR lpsz) {
CCapture *cap=CCapture::FindFromHwnd(hWnd);
if (cap->_tcl_ErrorCb) {
Tcl_Obj* args[4];
args[0]=cap->_tcl_ErrorCb;
args[1]=Tcl_NewStringObj((LPCTSTR)cap->tclname,-1);
args[2]=Tcl_NewIntObj(nID);
args[3]=Tcl_NewStringObj(lpsz,-1);
for (int i=1;i<4;i++) {
Tcl_IncrRefCount(args[i]);
}
Tcl_EvalObjv(cap->tclinterp,4,args,TCL_EVAL_GLOBAL);
for (i=1;i<4;i++) {
Tcl_DecrRefCount(args[i]);
}
}
return (LRESULT) TRUE ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -