📄 avicaptcl.cpp
字号:
// 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 + -