📄 avicaptcl.cpp
字号:
if (!cap->BeginCompression()) {
Tcl_SetResult(interp,"avicap:compression initialization error",TCL_STATIC);
return TCL_ERROR;
}
return TCL_OK;
}
int avicapCmdEndCompression(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (!cap->EndCompression()) {
Tcl_SetResult(interp,"avicap:compression finalization error",TCL_STATIC);
return TCL_ERROR;
}
return TCL_OK;
}
int avicapCmdCompressor(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (argc==2) {
PCOMPVARS pc=cap->GetCompressor();
Tcl_Obj *res=Tcl_NewByteArrayObj((unsigned char *)pc,sizeof(COMPVARS));
Tcl_SetObjResult(interp,res);
return TCL_OK;
} else if (argc==3) {
int size;
PCOMPVARS pc;
pc=(PCOMPVARS)Tcl_GetByteArrayFromObj(argv[2],&size);
if (size!=sizeof(COMPVARS)) {
Tcl_SetResult(interp,"avicap: not a valid compressor",TCL_STATIC);
return TCL_ERROR;
}
cap->SetCompressor(pc);
return TCL_OK;
} else {
Tcl_SetResult(interp,"syntax: avipathname compressor ?newcompressor?",TCL_STATIC);
return TCL_ERROR;
}
}
int avicapCbOnVideoStream(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (argc<3) {
Tcl_SetResult(interp,"syntax: avipathname cbkonvideostream function_name ?compression?",TCL_STATIC);
return TCL_ERROR;
}
int compressed=1;
if (argc>=4) {
if (Tcl_GetIntFromObj(interp,argv[3],&compressed)!=TCL_OK) {
compressed=1;
}
}
if (strcmp(Tcl_GetString(argv[2]),"")==0) {
//remove callback
if (!cap->SetTclVideoStreamCallback(NULL,compressed)) {
Tcl_SetResult(interp,"Cannot remove callback function",TCL_STATIC);
return TCL_ERROR;
}
} else {
if (!cap->SetTclVideoStreamCallback(argv[2],compressed)) {
Tcl_SetResult(interp,"Error initializing callback function",TCL_STATIC);
return TCL_ERROR;
}
}
return TCL_OK;
}
int avicapCbOnWaveStream(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (argc<3) {
Tcl_SetResult(interp,"syntax: avipathname cbkonwavestream function_name",TCL_STATIC);
return TCL_ERROR;
}
if (strcmp(Tcl_GetString(argv[2]),"")==0) {
//remove callback
if (!cap->SetTclWaveStreamCallback(NULL)) {
Tcl_SetResult(interp,"Cannot remove callback function",TCL_STATIC);
return TCL_ERROR;
}
} else {
if (!cap->SetTclWaveStreamCallback(argv[2])) {
Tcl_SetResult(interp,"Error initializing callback function",TCL_STATIC);
return TCL_ERROR;
}
}
return TCL_OK;
}
int avicapCbOnYield(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (argc<3) {
Tcl_SetResult(interp,"syntax: avipathname cbkonyield function_name",TCL_STATIC);
return TCL_ERROR;
}
if (strcmp(Tcl_GetString(argv[2]),"")==0) {
//remove callback
if (!cap->SetTclYieldCallback(NULL)) {
Tcl_SetResult(interp,"Cannot remove callback function",TCL_STATIC);
return TCL_ERROR;
}
} else {
if (!cap->SetTclYieldCallback(argv[2])) {
Tcl_SetResult(interp,"Error initializing callback function",TCL_STATIC);
return TCL_ERROR;
}
}
return TCL_OK;
}
int avicapCbOnFrame(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (argc<3) {
Tcl_SetResult(interp,"syntax: avipathname cbkonframe function_name ?compression?",TCL_STATIC);
return TCL_ERROR;
}
int compressed;
if (Tcl_GetIntFromObj(interp,argv[3],&compressed)!=TCL_OK) {
compressed=1;
}
if (strcmp(Tcl_GetString(argv[2]),"")==0) {
//remove callback
if (!cap->SetTclFrameCallback(NULL,compressed)) {
Tcl_SetResult(interp,"Cannot remove callback function",TCL_STATIC);
return TCL_ERROR;
}
} else {
if (!cap->SetTclFrameCallback(argv[2],compressed)) {
Tcl_SetResult(interp,"Error initializing callback function",TCL_STATIC);
return TCL_ERROR;
}
}
return TCL_OK;
}
int avicapCbOnError(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (argc<3) {
Tcl_SetResult(interp,"syntax: avipathname cbkonerror function_name",TCL_STATIC);
return TCL_ERROR;
}
if (strcmp(Tcl_GetString(argv[2]),"")==0) {
//remove callback
if (!cap->SetTclErrorCallback(NULL)) {
Tcl_SetResult(interp,"Cannot remove callback function",TCL_STATIC);
return TCL_ERROR;
}
} else {
if (!cap->SetTclErrorCallback(argv[2])) {
Tcl_SetResult(interp,"Error initializing callback function",TCL_STATIC);
return TCL_ERROR;
}
}
return TCL_OK;
}
int avicapGetBmpInfo(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
if (argc!=3) {
Tcl_SetResult(interp,"syntax: avipathname getbmpinfo compressed",TCL_STATIC);
return TCL_ERROR;
}
int compressed;
EXTRACT_TCL_INT(argv[2],&compressed);
if (compressed) {
if (!cap->GetCompressor()||!cap->GetCompressor()->lpbiOut) {
Tcl_SetResult(interp,"No compressor initialized (use begincompression)",TCL_STATIC);
return TCL_ERROR;
}
}
LPBITMAPINFO lpbi=compressed?cap->GetCompressor()->lpbiOut:cap->GetBitmapInfo();
Tcl_Obj *res=Tcl_NewByteArrayObj((unsigned char*)lpbi,sizeof(*lpbi));
Tcl_SetObjResult(interp,res);
return TCL_OK;
}
////////////////////////////////////////////////////////
// Capture setup manipulation functions
////////////////////////////////////////////////////////
typedef enum {t_UINT,t_BOOL,t_DWORD} t_type;
typedef struct {
char * name;
void *def;
t_type type;
} t_options;
static CAPTUREPARMS dum;
static const t_options setup_options[]= {
{"-frame",(void *)(&dum.dwRequestMicroSecPerFrame),t_DWORD},
{"-prompt",(void *)(&dum.fMakeUserHitOKToCapture),t_BOOL},
{"-toleratederror",(void *)(&dum.wPercentDropForError),t_UINT},
{"-thread",(void *)(&dum.fYield),t_BOOL},
{"-indexsize",(void *)(&dum.dwIndexSize),t_DWORD},
{"-chunksize",(void *)(&dum.wChunkGranularity ),t_UINT},
{"-numvideorequest",(void *)(&dum.wNumVideoRequested),t_UINT},
{"-captureaudio",(void *)(&dum.fCaptureAudio),t_BOOL},
{"-numaudiobuffer",(void *)(&dum.wNumAudioRequested),t_UINT},
{"-abortkey",(void *)(&dum.vKeyAbort),t_DWORD},
{"-obsoletedosMem",(void *)(&dum.fUsingDOSMemory),t_BOOL},
{"-leftbuttonaborts",(void *)(&dum.fAbortLeftMouse),t_BOOL},
{"-rightbuttonaborts",(void *)(&dum.fAbortRightMouse),t_BOOL},
{"-istimelimit",(void *)(&dum.fLimitEnabled),t_BOOL},
{"-timelimit",(void *)(&dum.wTimeLimit),t_UINT},
{"-MCIcontrol",(void *)(&dum.fMCIControl),t_BOOL},
{"-stepMCIdevice",(void *)(&dum.fStepMCIDevice),t_BOOL},
{"-MCIstarttime",(void *)(&dum.dwMCIStartTime),t_DWORD},
{"-MCIstoptime",(void *)(&dum.dwMCIStopTime),t_DWORD},
{"-x2",(void *)(&dum.fStepCaptureAt2x),t_BOOL},
{"-averageframes",(void *)(&dum.wStepCaptureAverageFrames),t_UINT},
{"-audiobuffersize",(void *)(&dum.dwAudioBufferSize),t_DWORD},
{"-disablewritecache",(void *)(&dum.fDisableWriteCache),t_BOOL},
{"-syncmaster",(void *)(&dum.AVStreamMaster),t_UINT}
};
int SearchSetupOption(const char *str) {
for (int j=0;j<sizeof(setup_options)/sizeof(setup_options[0]);j++) {
if (strcmp(str,setup_options[j].name)==0) {
return j;
}
}
return -1;
}
int CreateSetupErrorMsg(Tcl_Interp *interp) {
static char msg[1024];
memset(msg,0,1024);
strcat(msg,"avicap: bad option, valid options are");
for (int i=0;i<sizeof(setup_options)/sizeof(setup_options[0]);i++) {
strcat(msg," ");
strcat(msg,setup_options[i].name);
}
Tcl_SetResult(interp,msg,TCL_STATIC);
return TCL_ERROR;
}
int avicapCmdSetSetup(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
cap->GetCaptureSetup(&dum);
int dummy;
if (argc%2) {
Tcl_SetResult(interp,"avicap:bad number of arguments",TCL_STATIC);
return TCL_ERROR;
}
for (int i=2;i<argc-1;i+=2) {
int p=SearchSetupOption(Tcl_GetString(argv[i]));
if (p==-1) {
return CreateSetupErrorMsg(interp);
}
EXTRACT_TCL_INT(argv[i+1],&dummy);
switch (setup_options[p].type) {
case t_BOOL:(*((BOOL*)setup_options[p].def))=(BOOL)dummy;break;
case t_UINT:(*((UINT*)setup_options[p].def))=(UINT)dummy;break;
case t_DWORD:(*((DWORD*)setup_options[p].def))=(DWORD)dummy;break;
}
}
if (!cap->SetCaptureSetup(&dum)) {
Tcl_SetResult(interp,"avicap:cannot setup capture",TCL_STATIC);
return TCL_ERROR;
}
return TCL_OK;
}
void CreateStringResultForSetup(char *res,int p) {
switch (setup_options[p].type) {
case t_BOOL:strcat(res,Tcl_GetString(Tcl_NewIntObj(*((BOOL*)setup_options[p].def))));break;
case t_UINT:strcat(res,Tcl_GetString(Tcl_NewIntObj(*((UINT*)setup_options[p].def))));break;
case t_DWORD:strcat(res,Tcl_GetString(Tcl_NewIntObj(*((DWORD*)setup_options[p].def))));break;
}
}
int avicapCmdGetSetup(ClientData clientData, Tcl_Interp *interp,
int argc, Tcl_Obj *CONST argv[]) {
CCapture *cap=(CCapture*)clientData;
cap->GetCaptureSetup(&dum);
if (argc==3) {
char *res=Tcl_Alloc(256);
int p=SearchSetupOption(Tcl_GetString(argv[2]));
if (p==-1) {
return CreateSetupErrorMsg(interp);
}
memset(res,0,256);
CreateStringResultForSetup(res,p);
Tcl_SetResult(interp,res,TCL_DYNAMIC);
} else if (argc==2) {
char res[256];
for (int j=0;j<sizeof(setup_options)/sizeof(setup_options[0]);j++) {
memset(res,0,256);
Tcl_AppendElement(interp,setup_options[j].name);
CreateStringResultForSetup(res,j);
Tcl_AppendElement(interp,res);
}
} else {
return CreateSetupErrorMsg(interp);
}
return TCL_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -