⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 capture.cpp

📁 G729语音压缩的很好的离子和示范 大家来下载吧
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -