mexDDGrab.cpp
上传用户:limilano
上传日期:2013-07-02
资源大小:19k
文件大小:6k
源码类别:

视频捕捉/采集

开发平台:

Matlab

  1. /***************************************************
  2. This is the matlab interface code to the grabber code.
  3. It just wraps the grabber functions and does some error
  4. conversion.
  5. Written by Micah Richert.
  6. 07/14/2005
  7. **************************************************/
  8. #include "mex.h"
  9. #include "DDGrab.h"
  10. TCHAR str[200]; // 
  11. TCHAR* message(HRESULT hr)
  12. {
  13. if (hr == S_OK)
  14. {
  15. return "";
  16. } else {
  17. if (AMGetErrorText(hr,str,200) != 0) return str;
  18. return "Unknown error";
  19. }
  20. }
  21. DDGrabber DDG;
  22. void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
  23. {
  24. if (nrhs < 1 || !mxIsChar(prhs[0])) mexErrMsgTxt("First parameter must be the command (a string)");
  25. char cmd[100];
  26. mxGetString(prhs[0],cmd,100);
  27. if (!_stricmp("buildGraph",cmd))
  28. {
  29. if (nrhs < 2 || !mxIsChar(prhs[1])) mexErrMsgTxt("buildGraph: second parameter must be the filename (as a string)");
  30. if (nlhs > 0) mexErrMsgTxt("buildGraph: there are no outputs");
  31. int filenamelen = mxGetN(prhs[1])+1;
  32. char* filename = new char[filenamelen];
  33. if (!filename) mexErrMsgTxt("buildGraph: out of memory");
  34. mxGetString(prhs[1],filename,filenamelen);
  35. char* errmsg =  message(DDG.buildGraph(filename));
  36. free(filename);
  37. if (strcmp("",errmsg)) mexErrMsgTxt(errmsg);
  38. plhs[0] = NULL;
  39. } else if (!_stricmp("doCapture",cmd)) {
  40. if (nlhs > 0) mexErrMsgTxt("doCapture: there are no outputs");
  41. char* errmsg =  message(DDG.doCapture());
  42. if (strcmp("",errmsg)) mexErrMsgTxt(errmsg);
  43. plhs[0] = NULL;
  44. } else if (!_stricmp("getVideoInfo",cmd)) {
  45. if (nrhs < 2 || !mxIsNumeric(prhs[1])) mexErrMsgTxt("getVideoInfo: second parameter must be the video stream id (as a number)");
  46. if (nlhs > 4) mexErrMsgTxt("getVideoInfo: there are only 4 output values: widht, height, nrFramesCaptured, nrFramesTotal");
  47. unsigned int id = mxGetScalar(prhs[1]);
  48. int width,height,nrFramesCaptured,nrFramesTotal;
  49. char* errmsg =  message(DDG.getVideoInfo(id, &width, &height, &nrFramesCaptured, &nrFramesTotal));
  50. if (strcmp("",errmsg)) mexErrMsgTxt(errmsg);
  51. if (nlhs >= 1) {plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[0])[0] = width; }
  52. if (nlhs >= 2) {plhs[1] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[1])[0] = height; }
  53. if (nlhs >= 3) {plhs[2] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[2])[0] = nrFramesCaptured; }
  54. if (nlhs >= 4) {plhs[3] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[3])[0] = nrFramesTotal; }
  55. } else if (!_stricmp("getAudioInfo",cmd)) {
  56. if (nrhs < 2 || !mxIsNumeric(prhs[1])) mexErrMsgTxt("getAudioInfo: second parameter must be the audio stream id (as a number)");
  57. if (nlhs > 5) mexErrMsgTxt("getAudioInfo: there are only 5 output values: nrChannels, rate, bits, nrFramesCaptured, nrFramesTotal");
  58. unsigned int id = mxGetScalar(prhs[1]);
  59. int nrChannels,rate,bits,nrFramesCaptured,nrFramesTotal;
  60. char* errmsg =  message(DDG.getAudioInfo(id, &nrChannels, &rate, &bits, &nrFramesCaptured, &nrFramesTotal));
  61. if (strcmp("",errmsg)) mexErrMsgTxt(errmsg);
  62. if (nlhs >= 1) {plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[0])[0] = nrChannels; }
  63. if (nlhs >= 2) {plhs[1] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[1])[0] = rate; }
  64. if (nlhs >= 3) {plhs[2] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[2])[0] = bits; }
  65. if (nlhs >= 4) {plhs[3] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[3])[0] = nrFramesCaptured; }
  66. if (nlhs >= 5) {plhs[4] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[4])[0] = nrFramesTotal; }
  67. } else if (!_stricmp("getCaptureInfo",cmd)) {
  68. if (nlhs > 2) mexErrMsgTxt("getCaptureInfo: there are only 2 output values: nrVideo, nrAudio");
  69. int nrVideo, nrAudio;
  70. DDG.getCaptureInfo(&nrVideo, &nrAudio);
  71. if (nlhs >= 1) {plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[0])[0] = nrVideo; }
  72. if (nlhs >= 2) {plhs[1] = mxCreateDoubleMatrix(1,1,mxREAL); mxGetPr(plhs[1])[0] = nrAudio; }
  73. } else if (!_stricmp("getVideoFrame",cmd)) {
  74. if (nrhs < 3 || !mxIsNumeric(prhs[1]) || !mxIsNumeric(prhs[2])) mexErrMsgTxt("getVideoFrame: second parameter must be the audio stream id (as a number) and third parameter must be the frame number");
  75. if (nlhs > 1) mexErrMsgTxt("getVideoFrame: there are only 1 output value: data");
  76. unsigned int id = mxGetScalar(prhs[1]);
  77. int frameNr = mxGetScalar(prhs[2]);
  78. char* data;
  79. int nrBytes;
  80. int dims[] = {1,1};
  81. char* errmsg =  message(DDG.getVideoFrame(id, frameNr, &data, &nrBytes));
  82. if (strcmp("",errmsg)) mexErrMsgTxt(errmsg);
  83. dims[0] = nrBytes;
  84. plhs[0] = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL); // empty 2d matrix
  85. memcpy(mxGetPr(plhs[0]),data,nrBytes);
  86. free(data);
  87. } else if (!_stricmp("getAudioFrame",cmd)) {
  88. if (nrhs < 3 || !mxIsNumeric(prhs[1]) || !mxIsNumeric(prhs[2])) mexErrMsgTxt("getAudioFrame: second parameter must be the audio stream id (as a number) and third parameter must be the frame number");
  89. if (nlhs > 1) mexErrMsgTxt("getAudioFrame: there are only 1 output value: data");
  90. unsigned int id = mxGetScalar(prhs[1]);
  91. int frameNr = mxGetScalar(prhs[2]);
  92. char* data;
  93. int nrBytes;
  94. int dims[] = {1,1};
  95. char* errmsg =  message(DDG.getAudioFrame(id, frameNr, &data, &nrBytes));
  96. if (strcmp("",errmsg)) mexErrMsgTxt(errmsg);
  97. dims[0] = nrBytes;
  98. plhs[0] = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL); // empty 2d matrix
  99. memcpy(mxGetPr(plhs[0]),data,nrBytes);
  100. free(data);
  101. } else if (!_stricmp("setFrames",cmd)) {
  102. if (nrhs < 2 || !mxIsDouble(prhs[1])) mexErrMsgTxt("setFrames: second parameter must be the frame numbers (as doubles)");
  103. if (nlhs > 0) mexErrMsgTxt("setFrames: there are no outputs");
  104. int nrFrames = mxGetN(prhs[1]) * mxGetM(prhs[1]);
  105. int* frameNrs = new int[nrFrames];
  106. if (!frameNrs) mexErrMsgTxt("setFrames: out of memory");
  107. double* data = mxGetPr(prhs[1]);
  108. for (int i=0; i<nrFrames; i++) frameNrs[i] = data[i];
  109. DDG.setFrames(frameNrs, nrFrames);
  110. plhs[0] = NULL;
  111. } else if (!_stricmp("disableVideo",cmd)) {
  112. if (nlhs > 0) mexErrMsgTxt("disableVideo: there are no outputs");
  113. DDG.disableVideo();
  114. plhs[0] = NULL;
  115. } else if (!_stricmp("disableAudio",cmd)) {
  116. if (nlhs > 0) mexErrMsgTxt("disableAudio: there are no outputs");
  117. DDG.disableAudio();
  118. plhs[0] = NULL;
  119. } else if (!_stricmp("cleanUp",cmd)) {
  120. if (nlhs > 0) mexErrMsgTxt("cleanUp: there are no outputs");
  121. DDG.cleanUp();
  122. plhs[0] = NULL;
  123. }
  124. }