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

📄 avicaptcl.cpp

📁 G729语音压缩的很好的离子和示范 大家来下载吧
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// avicaptcl.cpp
// Emmanuel Grolleau (c) 2002
// This file is a part of AviCapTcl
// Describes the interface between the class CCapture and tcl/tk

// Version 1.0.0.0
// Last modification 01/07/2002

#include "avicaptcl.h"
#include "capture.h"

#define EXTRACT_TCL_INT(obj,intptr) if (Tcl_GetIntFromObj(interp,obj,intptr)==TCL_ERROR) {return TCL_ERROR;}

// Internal functions prototypes/////////////////////////////////////////////////////////////////
int avicapDispatch(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdConnect(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdDestroy(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdDisconnect(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdPreview(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdOverlay(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdCompressDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdVideoDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdFormatDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdSourceDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdSetSetup(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdGetSetup(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdCapture(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapStopCapture(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdIsCompressed(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdBeginCompression(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdEndCompression(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCmdCompressor(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCbOnVideoStream(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCbOnWaveStream(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCbOnYield(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCbOnFrame(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapCbOnError(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int avicapGetBmpInfo(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
/////////////////////////////////////////////////////////////////////////////////////////////////

// Command names
static const char * CmdNames[]= {
	"connect","destroy","disconnect","preview","overlay","compressdlg",
	"videodlg","formatdlg","sourcedlg","setcapturesetup","getcapturesetup",
	"capture","stopcapture","iscompressed","begincompression","endcompression",
	"compressor","cbkonvideostream","cbkonwavestream","cbkonyield","cbkonframe",
	"cbkonerror","getbmpinfo"
};
static const Tcl_ObjCmdProc * CmdProcs[]= {
	avicapCmdConnect,avicapCmdDestroy,avicapCmdDisconnect,avicapCmdPreview,avicapCmdOverlay,avicapCmdCompressDlg,
	avicapCmdVideoDlg,avicapCmdFormatDlg,avicapCmdSourceDlg,avicapCmdSetSetup,avicapCmdGetSetup,
	avicapCmdCapture,avicapStopCapture,avicapCmdIsCompressed,avicapCmdBeginCompression,avicapCmdEndCompression,
	avicapCmdCompressor,avicapCbOnVideoStream,avicapCbOnWaveStream,avicapCbOnYield,avicapCbOnFrame,
	avicapCbOnError,avicapGetBmpInfo
};

static Tcl_HashTable avicapCommands;
// HashTable containing the avicap command names and associated functions

// Implementation
void avicapInit() {
	Tcl_InitHashTable(&avicapCommands, TCL_STRING_KEYS);
	int ok;
	for (int i=0;i<sizeof(CmdProcs)/sizeof(CmdProcs[0]);i++) {
		Tcl_HashEntry * entry=Tcl_CreateHashEntry(&avicapCommands, CmdNames[i], &ok);
		Tcl_SetHashValue(entry, (ClientData)CmdProcs[i]);
	}
}

int aviSourcesCmd(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CStringArray names;
	CCapture::GetDriversList(names);
	Tcl_Obj *res=Tcl_NewListObj(0,0);
	for (int i=0;i<names.GetSize();i++) {
		Tcl_Obj *tmp=Tcl_NewStringObj(LPSTR(LPCTSTR(names.GetAt(i))),-1);
		Tcl_ListObjAppendElement(interp,res,tmp);
	}
	Tcl_SetObjResult(interp,res);
	return TCL_OK;
}

int avicapCmd(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	// Creates a new avicap widget
	if (argc==1) {
		Tcl_SetResult(interp,"syntax:avicap pathname ?width height?",TCL_STATIC);
		return TCL_ERROR;
	}
	Tcl_CmdInfo cmdinfo;
	if (Tcl_GetCommandInfo(interp, Tcl_GetString(argv[1]), &cmdinfo)) {
		Tcl_SetResult(interp,"avicap:widget already exists",TCL_STATIC);
		return TCL_ERROR;
	}
	CCapture *cap;
	BOOL ok;
	if (argc>=3) {
		int w,h;
		EXTRACT_TCL_INT(argv[2],&w);
		EXTRACT_TCL_INT(argv[3],&h);
		cap=new CCapture(Tcl_GetString(argv[1]),interp,ok,w,h);
	} else {
		cap=new CCapture(Tcl_GetString(argv[1]),interp,ok);
	}
	if (!ok) {
		delete cap;
		Tcl_SetResult(interp,"avicap: error while creating window",TCL_STATIC);
		return TCL_ERROR;
	}
	Tcl_CreateObjCommand(interp, Tcl_GetString(argv[1]),avicapDispatch,(ClientData)cap, (Tcl_CmdDeleteProc *)NULL);
	Tcl_SetObjResult(interp,argv[1]);
	return TCL_OK;
}

int avicapDispatch(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	// Calls the right function depending on the tcl command
	if (argc==1) {
		Tcl_SetResult(interp,"avicap: no command given",TCL_STATIC);
		return TCL_ERROR;
	}
	CCapture *cap=(CCapture *)clientData;
	Tcl_HashEntry * entry=Tcl_FindHashEntry(&avicapCommands, Tcl_GetString(argv[1]));
	if (entry==NULL) {
		// bad command
		static char msg[1024];
		memset(msg,0,1024);
		strcat(msg,"avicap: bad option ");
		strcat(msg,Tcl_GetString(argv[1]));
		strcat(msg," must be:");
		for (int i=0;i<sizeof(CmdProcs)/sizeof(CmdProcs[0]);i++) {
			strcat(msg," ");
			strcat(msg,CmdNames[i]);
		}
		Tcl_SetResult(interp,msg,TCL_STATIC);
		return TCL_ERROR;

	}
	Tcl_ObjCmdProc *proc=(Tcl_ObjCmdProc*)Tcl_GetHashValue(entry);
	return (*proc)(clientData,interp,argc,argv);
}

int avicapCmdConnect(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	// Deletes the avicap widget
	if (argc!=3) {
		Tcl_SetResult(interp,"syntax: avipathname connect sourceindex",TCL_STATIC);
		return TCL_ERROR;
	}
	int indx;
	EXTRACT_TCL_INT(argv[2],&indx);
	CCapture *cap=(CCapture *)clientData;
	if (!cap->Connect(indx)) {
		Tcl_SetResult(interp,"avicap: cannot connect to source driver",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}

int avicapCmdDestroy(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	// Deletes the avicap widget
	delete (CCapture *)clientData;
	Tcl_DeleteCommand(interp,Tcl_GetString(argv[0]));
	return TCL_OK;
}

int avicapCmdDisconnect(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CCapture *cap=(CCapture *)clientData;
	if (!cap->Disconnect()) {
		Tcl_SetResult(interp,"avicap: not connected to source driver",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}

int avicapCmdPreview(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	int rate;
	if (argc!=3) {
		Tcl_SetResult(interp,"syntax: avipathname preview rate",TCL_STATIC);
		return TCL_ERROR;
	}
	EXTRACT_TCL_INT(argv[2],&rate);
	CCapture *cap=(CCapture *)clientData;
	if (!cap->Preview(rate)) {
		Tcl_SetResult(interp,"avicap: error while starting or stopping preview",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}

int avicapCmdOverlay(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	int onoff=1;
	if (argc==3) {
		EXTRACT_TCL_INT(argv[2],&onoff);
	}
	CCapture *cap=(CCapture *)clientData;
	if (!cap->Overlay(onoff)) {
		Tcl_SetResult(interp,"avicap: error while starting or stopping overlay",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}

int avicapCmdCompressDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CCapture *cap=(CCapture *)clientData;
	static char fccHandler[4];
	memset(fccHandler,0,4);
	cap->CompressDlg(fccHandler);
	Tcl_SetResult(interp,fccHandler,TCL_STATIC);
	return TCL_OK;
}
int avicapCmdVideoDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CCapture *cap=(CCapture *)clientData;
	if (!cap->DisplayDlg()) {
		Tcl_SetResult(interp,"avicap: error displaying video display dialog",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}
int avicapCmdFormatDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CCapture *cap=(CCapture *)clientData;
	if (!cap->FormatDlg()) {
		Tcl_SetResult(interp,"avicap: error displaying video format dialog",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}
int avicapCmdSourceDlg(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CCapture *cap=(CCapture *)clientData;
	if (!cap->VSourceDlg()) {
		Tcl_SetResult(interp,"avicap: error displaying video source dialog",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}

int avicapCmdCapture(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=2 && argc!=3) {
		Tcl_SetResult(interp,"syntax: avipathname capture ?filename?",TCL_STATIC);
		return TCL_ERROR;
	}
	CCapture *cap=(CCapture*)clientData;
	if (argc==3) {
		// Capture in a file
		Tcl_DString path;
		Tcl_TranslateFileName(interp, Tcl_GetString(argv[2]), &path);
		if (!cap->SetCaptureFile(Tcl_DStringValue(&path))) {
			Tcl_DStringFree(&path);
			Tcl_SetResult(interp,"avicap:capture file error",TCL_STATIC);
			return TCL_ERROR;
		}
		Tcl_DStringFree(&path);
		if (!cap->StartCapture()) {
			Tcl_SetResult(interp,"avicap:error in capture",TCL_STATIC);
			return TCL_ERROR;
		}
	} else {
		if (!cap->StartSeq()) {
			Tcl_SetResult(interp,"avicap:error in capture",TCL_STATIC);
			return TCL_ERROR;
		}
	}
	return TCL_OK;
}
int avicapStopCapture(ClientData clientData, Tcl_Interp *interp,
					 int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=2) {
		Tcl_SetResult(interp,"syntax: avipathname stopcapture",TCL_STATIC);
		return TCL_ERROR;
	}
	CCapture *cap=(CCapture*)clientData;
	cap->StopCapture();
	return TCL_OK;
}
int avicapCmdIsCompressed(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CCapture *cap=(CCapture*)clientData;
	if (cap->IsCompressed()) {
		Tcl_SetResult(interp,"1",TCL_STATIC);
	} else {
		Tcl_SetResult(interp,"0",TCL_STATIC);
	}
	return TCL_OK;
}
int avicapCmdBeginCompression(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	CCapture *cap=(CCapture*)clientData;
	if (!cap->IsCompressed()) {
		Tcl_SetResult(interp,"avicap:no compression format",TCL_STATIC);
		return TCL_ERROR;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -