omxcameratest.c

Go to the documentation of this file.
00001 
00036 #include <stdio.h>
00037 #include <unistd.h>
00038 #include <stdlib.h>
00039 #include <string.h>
00040 
00041 #include <OMX_Core.h>
00042 #include <OMX_Component.h>
00043 #include <OMX_Types.h>
00044 
00045 #include "omxcameratest.h"
00046 
00047 
00048 
00049 /* Callbacks for camera component */
00050 OMX_CALLBACKTYPE camera_source_callbacks = {
00051   .EventHandler = camera_sourceEventHandler,
00052   .EmptyBufferDone = NULL,
00053   .FillBufferDone = camera_sourceFillBufferDone
00054 };
00055 
00056 /* Callbacks for color converter component */
00057 OMX_CALLBACKTYPE colorconv_callbacks = {
00058   .EventHandler = colorconvEventHandler,
00059   .EmptyBufferDone = colorconvEmptyBufferDone,
00060   .FillBufferDone = colorconvFillBufferDone
00061 };
00062 
00063 /* Callbacks for fbsink component */
00064 OMX_CALLBACKTYPE fbsink_callbacks = {
00065   .EventHandler = fbsinkEventHandler,
00066   .EmptyBufferDone = fbsinkEmptyBufferDone,
00067   .FillBufferDone = NULL
00068 };
00069 
00070 appPrivateType* appPriv = NULL;
00071 
00072 OMX_PORTBUFFERCTXT sCameraPortBufferList[NUM_CAMERAPORTS];
00073 
00074 FILE* fCapture = NULL;
00075 char g_DefaultCaptureFileName[] = "capture.yuv";
00076 FILE* fThumbnail = NULL;
00077 char g_DefaultThumbnailFileName[] = "thumbnail.yuv";
00078 
00079 
00081 OMX_ERRORTYPE camera_sourceEventHandler(
00082   OMX_OUT OMX_HANDLETYPE hComponent,
00083   OMX_OUT OMX_PTR pAppData,
00084   OMX_OUT OMX_EVENTTYPE eEvent,
00085   OMX_OUT OMX_U32 Data1,
00086   OMX_OUT OMX_U32 Data2,
00087   OMX_OUT OMX_PTR pEventData) {
00088 
00089   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for camera component\n",__func__);
00090 
00091   DEBUG(DEB_LEV_SIMPLE_SEQ, "Hi there, I am in the %s callback\n", __func__);
00092   DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: event type code (eEvent)=%d\n", __func__, eEvent);
00093   if(eEvent == OMX_EventCmdComplete) {
00094     if (Data1 == OMX_CommandStateSet) {
00095       DEBUG(DEB_LEV_SIMPLE_SEQ, "Set state to ");
00096       switch ((int)Data2) {
00097         case OMX_StateInvalid:
00098           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateInvalid\n");
00099           break;
00100         case OMX_StateLoaded:
00101           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateLoaded\n");
00102           break;
00103         case OMX_StateIdle:
00104           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateIdle\n");
00105           break;
00106         case OMX_StateExecuting:
00107           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateExecuting\n");
00108           break;
00109         case OMX_StatePause:
00110           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StatePause\n");
00111           break;
00112         case OMX_StateWaitForResources:
00113           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateWaitForResources\n");
00114           break;
00115       }    
00116       tsem_up(appPriv->cameraSourceEventSem);
00117     }
00118   }
00119 
00120   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for camera component, return code: 0x%X\n",__func__, OMX_ErrorNone);
00121   return OMX_ErrorNone;
00122 }
00123 
00124 
00125 OMX_ERRORTYPE camera_sourceFillBufferDone(
00126   OMX_OUT OMX_HANDLETYPE hComponent,
00127   OMX_OUT OMX_PTR pAppData,
00128   OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer) {
00129 
00130   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for camera component\n",__func__);
00131 
00132   DEBUG(DEB_LEV_FULL_SEQ, "%s: Get returned buffer (0x%lX) from port[%ld], nFilledLen=%ld\n", __func__, (OMX_U32)pBuffer, pBuffer->nOutputPortIndex, pBuffer->nFilledLen);
00133 
00134   if (pBuffer->nOutputPortIndex == OMX_CAMPORT_INDEX_CP) {
00135     if ((pBuffer->nFlags & OMX_BUFFERFLAG_STARTTIME) != 0) {
00136       DEBUG(DEB_LEV_FULL_SEQ, "%s: Get buffer flag OMX_BUFFERFLAG_STARTTIME!\n", __func__);
00137       pBuffer->nFlags = 0;
00138     }
00139     /* Print time stamp of each buffer */
00140 #ifndef OMX_SKIP64BIT
00141     DEBUG(DEB_LEV_FULL_SEQ, "%s: buffer[0x%lX] time stamp: 0x%016llX\n", __func__, (OMX_U32)pBuffer, pBuffer->nTimeStamp);
00142 #else
00143     DEBUG(DEB_LEV_FULL_SEQ, "%s: buffer[0x%lX] time stamp: 0x%08lX%08lX\n", __func__, (OMX_U32)pBuffer, pBuffer->nTimeStamp.nHighPart, pBuffer->nTimeStamp.nLowPart);
00144 #endif
00145   }
00146 
00147   if (pBuffer->nOutputPortIndex == OMX_CAMPORT_INDEX_CP &&  fCapture != NULL) {
00148     DEBUG(DEB_LEV_FULL_SEQ, "%s: writing to file",__func__);
00149     fwrite(pBuffer->pBuffer + pBuffer->nOffset, 1, pBuffer->nFilledLen, fCapture);
00150     pBuffer->nFilledLen = 0;
00151     pBuffer->nOffset = 0;
00152     OMX_FillThisBuffer(appPriv->camerahandle, pBuffer);
00153   }
00154   else if (pBuffer->nOutputPortIndex == OMX_CAMPORT_INDEX_CP_T &&  fThumbnail != NULL) {
00155     fwrite(pBuffer->pBuffer + pBuffer->nOffset, 1, pBuffer->nFilledLen, fThumbnail);
00156     pBuffer->nFilledLen = 0;
00157     pBuffer->nOffset = 0;
00158     OMX_FillThisBuffer(appPriv->camerahandle, pBuffer);
00159   }
00160 
00161   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for camera component, return code: 0x%X\n",__func__, OMX_ErrorNone);
00162   return OMX_ErrorNone;
00163 }
00164 
00166 OMX_ERRORTYPE colorconvEventHandler(
00167   OMX_OUT OMX_HANDLETYPE hComponent,
00168   OMX_OUT OMX_PTR pAppData,
00169   OMX_OUT OMX_EVENTTYPE eEvent,
00170   OMX_OUT OMX_U32 Data1,
00171   OMX_OUT OMX_U32 Data2,
00172   OMX_OUT OMX_PTR pEventData) {
00173 
00174   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n",__func__);
00175 
00176   DEBUG(DEB_LEV_SIMPLE_SEQ, "Hi there, I am in the %s callback\n", __func__);
00177   DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: event type code (eEvent)=%d\n", __func__, eEvent);
00178   if(eEvent == OMX_EventCmdComplete) {
00179     if (Data1 == OMX_CommandStateSet) {
00180       DEBUG(DEB_LEV_SIMPLE_SEQ, "Set state to ");
00181       switch ((int)Data2) {
00182         case OMX_StateInvalid:
00183           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateInvalid\n");
00184           break;
00185         case OMX_StateLoaded:
00186           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateLoaded\n");
00187           break;
00188         case OMX_StateIdle:
00189           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateIdle\n");
00190           break;
00191         case OMX_StateExecuting:
00192           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateExecuting\n");
00193           break;
00194         case OMX_StatePause:
00195           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StatePause\n");
00196           break;
00197         case OMX_StateWaitForResources:
00198           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateWaitForResources\n");
00199           break;
00200       }    
00201       tsem_up(appPriv->colorconvEventSem);
00202     }
00203   }
00204 
00205   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s, return code: 0x%X\n",__func__, OMX_ErrorNone);
00206   return OMX_ErrorNone;
00207 }
00208 
00209 
00210 OMX_ERRORTYPE colorconvEmptyBufferDone(
00211   OMX_OUT OMX_HANDLETYPE hComponent,
00212   OMX_OUT OMX_PTR pAppData,
00213   OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer) {
00214 
00215   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n",__func__);
00216 
00217   DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: Get returned buffer (0x%lX) from colorconv input port, nFilledLen=%ld\n", __func__, (OMX_U32)pBuffer, pBuffer->nFilledLen);
00218 
00219 
00220   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s, return code: 0x%X\n",__func__, OMX_ErrorNone);
00221   return OMX_ErrorNone;
00222 }
00223 
00224 OMX_ERRORTYPE colorconvFillBufferDone(
00225   OMX_OUT OMX_HANDLETYPE hComponent,
00226   OMX_OUT OMX_PTR pAppData,
00227   OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer) {
00228 
00229   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n",__func__);
00230 
00231   DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: Get returned buffer (0x%lX) from colorconv output port, nFilledLen=%ld\n", __func__, (OMX_U32)pBuffer, pBuffer->nFilledLen);
00232 
00233 
00234   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s, return code: 0x%X\n",__func__, OMX_ErrorNone);
00235   return OMX_ErrorNone;
00236 }
00237 
00239 OMX_ERRORTYPE fbsinkEventHandler(
00240   OMX_OUT OMX_HANDLETYPE hComponent,
00241   OMX_OUT OMX_PTR pAppData,
00242   OMX_OUT OMX_EVENTTYPE eEvent,
00243   OMX_OUT OMX_U32 Data1,
00244   OMX_OUT OMX_U32 Data2,
00245   OMX_OUT OMX_PTR pEventData) {
00246 
00247   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n",__func__);
00248 
00249   DEBUG(DEB_LEV_SIMPLE_SEQ, "Hi there, I am in the %s callback\n", __func__);
00250   DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: event type code (eEvent)=%d\n", __func__, eEvent);
00251   if(eEvent == OMX_EventCmdComplete) {
00252     if (Data1 == OMX_CommandStateSet) {
00253       DEBUG(DEB_LEV_SIMPLE_SEQ, "Set state to ");
00254       switch ((int)Data2) {
00255         case OMX_StateInvalid:
00256           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateInvalid\n");
00257           break;
00258         case OMX_StateLoaded:
00259           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateLoaded\n");
00260           break;
00261         case OMX_StateIdle:
00262           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateIdle\n");
00263           break;
00264         case OMX_StateExecuting:
00265           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateExecuting\n");
00266           break;
00267         case OMX_StatePause:
00268           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StatePause\n");
00269           break;
00270         case OMX_StateWaitForResources:
00271           DEBUG(DEB_LEV_SIMPLE_SEQ, "OMX_StateWaitForResources\n");
00272           break;
00273       }    
00274       tsem_up(appPriv->fbsinkEventSem);
00275     } else if (OMX_CommandPortEnable || OMX_CommandPortDisable) {
00276       DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s Received Port Enable/Disable Event\n",__func__);
00277       tsem_up(appPriv->fbsinkEventSem);
00278     } 
00279   }
00280 
00281   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s, return code: 0x%X\n",__func__, OMX_ErrorNone);
00282   return OMX_ErrorNone;
00283 }
00284 
00285 
00286 OMX_ERRORTYPE fbsinkEmptyBufferDone(
00287   OMX_OUT OMX_HANDLETYPE hComponent,
00288   OMX_OUT OMX_PTR pAppData,
00289   OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer) {
00290 
00291   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n",__func__);
00292 
00293   DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: Get returned buffer (0x%lX) from fbsink input port, nFilledLen=%ld\n", __func__, (OMX_U32)pBuffer, pBuffer->nFilledLen);
00294 
00295 
00296   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s, return code: 0x%X\n",__func__, OMX_ErrorNone);
00297   return OMX_ErrorNone;
00298 }
00299 
00300 
00301 OMX_ERRORTYPE setHeader(OMX_PTR header, OMX_U32 size) {
00302   OMX_VERSIONTYPE* ver = (OMX_VERSIONTYPE*)(header + sizeof(OMX_U32));
00303   *((OMX_U32*)header) = size;
00304 
00305   ver->s.nVersionMajor = VERSIONMAJOR;
00306   ver->s.nVersionMinor = VERSIONMINOR;
00307   ver->s.nRevision = VERSIONREVISION;
00308   ver->s.nStep = VERSIONSTEP;
00309 
00310   return OMX_ErrorNone;
00311 }
00312 
00313 
00314 OMX_ERRORTYPE setCameraParameters(OMX_BOOL bCameraStillImageMode) {
00315   OMX_ERRORTYPE errRet = OMX_ErrorNone;
00316   OMX_ERRORTYPE err = OMX_ErrorNone;
00317   OMX_PARAM_SENSORMODETYPE sOmxSensorMode;
00318   OMX_PARAM_PORTDEFINITIONTYPE sOmxPortDefinition;
00319 
00320   /* set sensor mode */
00321   setHeader(&sOmxSensorMode, sizeof(OMX_PARAM_SENSORMODETYPE));
00322   sOmxSensorMode.nPortIndex = 0;
00323   setHeader(&sOmxSensorMode.sFrameSize, sizeof(OMX_FRAMESIZETYPE));
00324   sOmxSensorMode.sFrameSize.nPortIndex = 0;
00325   if ((err = OMX_GetParameter(appPriv->camerahandle, OMX_IndexParamCommonSensorMode, &sOmxSensorMode)) != OMX_ErrorNone) {
00326     errRet = err;
00327   }
00328   else {
00329     sOmxSensorMode.nFrameRate = DEFAULT_FRAME_RATE;
00330     sOmxSensorMode.bOneShot = bCameraStillImageMode;
00331     sOmxSensorMode.sFrameSize.nWidth = DEFAULT_FRAME_WIDTH;
00332     sOmxSensorMode.sFrameSize.nHeight = DEFAULT_FRAME_HEIGHT;
00333     if ((err = OMX_SetParameter(appPriv->camerahandle, OMX_IndexParamCommonSensorMode, &sOmxSensorMode)) != OMX_ErrorNone) {
00334       errRet = err;
00335     }
00336   }
00337 
00338   /* set preview port */
00339   setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00340   sOmxPortDefinition.nPortIndex = OMX_CAMPORT_INDEX_VF;
00341   if ((err = OMX_GetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00342     errRet = err;
00343   }
00344   else {
00345     sOmxPortDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
00346     sOmxPortDefinition.format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
00347     sOmxPortDefinition.format.video.nStride = DEFAULT_FRAME_WIDTH;
00348     sOmxPortDefinition.format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
00349     sOmxPortDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
00350     sOmxPortDefinition.format.video.eColorFormat = DEFAULT_CAMERA_COLOR_FORMAT;
00351     sOmxPortDefinition.nBufferSize = sOmxPortDefinition.format.video.nStride * sOmxPortDefinition.format.video.nFrameHeight * 3;
00352     if ((err = OMX_SetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00353       errRet = err;
00354     }
00355   }
00356 
00357   /* set capture port */
00358   setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00359   sOmxPortDefinition.nPortIndex = OMX_CAMPORT_INDEX_CP;
00360   if ((err = OMX_GetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00361     errRet = err;
00362   }
00363   else {
00364     sOmxPortDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
00365     sOmxPortDefinition.format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
00366     sOmxPortDefinition.format.video.nStride = DEFAULT_FRAME_WIDTH;
00367     sOmxPortDefinition.format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
00368     sOmxPortDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
00369     sOmxPortDefinition.format.video.eColorFormat = DEFAULT_CAMERA_COLOR_FORMAT;
00370     sOmxPortDefinition.nBufferSize = sOmxPortDefinition.format.video.nStride * sOmxPortDefinition.format.video.nFrameHeight * 3;
00371     if ((err = OMX_SetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00372       errRet = err;
00373     }
00374   }
00375 
00376   /* set thumbnail port */
00377   setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00378   sOmxPortDefinition.nPortIndex = OMX_CAMPORT_INDEX_CP_T;
00379   if ((err = OMX_GetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00380     errRet = err;
00381   }
00382   else {
00383     sOmxPortDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
00384     sOmxPortDefinition.format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
00385     sOmxPortDefinition.format.video.nStride = DEFAULT_FRAME_WIDTH;
00386     sOmxPortDefinition.format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
00387     sOmxPortDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
00388     sOmxPortDefinition.format.video.eColorFormat = DEFAULT_CAMERA_COLOR_FORMAT;
00389     sOmxPortDefinition.nBufferSize = sOmxPortDefinition.format.video.nStride * sOmxPortDefinition.format.video.nFrameHeight * 3;
00390     if ((err = OMX_SetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00391       errRet = err;
00392     }
00393   }
00394 
00395 
00396   return errRet;
00397 }
00398 
00399 OMX_ERRORTYPE setColorConvParameters() {
00400   OMX_ERRORTYPE errRet = OMX_ErrorNone;
00401   OMX_ERRORTYPE err = OMX_ErrorNone;
00402   OMX_VIDEO_PARAM_PORTFORMATTYPE sVideoPortFormat;
00403   OMX_PARAM_PORTDEFINITIONTYPE sOmxPortDefinition;
00404 
00405   /* set input port */
00406   setHeader(&sVideoPortFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
00407   sVideoPortFormat.nPortIndex = 0;
00408   sVideoPortFormat.nIndex = 0;
00409   if ((err = OMX_GetParameter(appPriv->colorconvhandle, OMX_IndexParamVideoPortFormat, &sVideoPortFormat)) != OMX_ErrorNone) {
00410     DEBUG(DEB_LEV_ERR, "Getting colorconv input port video format failed!\n");
00411     errRet = err;
00412   }
00413   else {
00414     sVideoPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
00415     sVideoPortFormat.eColorFormat = DEFAULT_CAMERA_COLOR_FORMAT; 
00416     sVideoPortFormat.xFramerate = 0;
00417     if ((err = OMX_SetParameter(appPriv->colorconvhandle, OMX_IndexParamVideoPortFormat, &sVideoPortFormat)) != OMX_ErrorNone) {
00418       DEBUG(DEB_LEV_ERR, "Setting colorconv input port video format failed!\n");
00419       errRet = err;
00420     }
00421   }
00422 
00423   setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00424   sOmxPortDefinition.nPortIndex = 0;
00425   if ((err = OMX_GetParameter(appPriv->colorconvhandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00426     DEBUG(DEB_LEV_ERR, "Getting colorconv input port parameters failed!\n");
00427     errRet = err;
00428   }
00429   else {
00430     sOmxPortDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
00431     sOmxPortDefinition.format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
00432     sOmxPortDefinition.format.video.nStride = DEFAULT_FRAME_WIDTH;
00433     sOmxPortDefinition.format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
00434     sOmxPortDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
00435     sOmxPortDefinition.format.video.eColorFormat = DEFAULT_CAMERA_COLOR_FORMAT; 
00436     sOmxPortDefinition.nBufferSize = sOmxPortDefinition.format.video.nStride * sOmxPortDefinition.format.video.nFrameHeight * 3;
00437     if ((err = OMX_SetParameter(appPriv->colorconvhandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00438       DEBUG(DEB_LEV_ERR, "Setting colorconv input port parameters failed!\n");
00439       errRet = err;
00440     }
00441   }
00442 
00443   /* set output port */
00444   setHeader(&sVideoPortFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
00445   sVideoPortFormat.nPortIndex = 1;
00446   sVideoPortFormat.nIndex = 0;
00447   if ((err = OMX_GetParameter(appPriv->colorconvhandle, OMX_IndexParamVideoPortFormat, &sVideoPortFormat)) != OMX_ErrorNone) {
00448     DEBUG(DEB_LEV_ERR, "Getting colorconv input port video format failed!\n");
00449     errRet = err;
00450   }
00451   else {
00452     sVideoPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
00453     sVideoPortFormat.eColorFormat = DEFAULT_FBSINK_COLOR_FORMAT; 
00454     sVideoPortFormat.xFramerate = 0;
00455     if ((err = OMX_SetParameter(appPriv->colorconvhandle, OMX_IndexParamVideoPortFormat, &sVideoPortFormat)) != OMX_ErrorNone) {
00456       DEBUG(DEB_LEV_ERR, "Setting colorconv input port video format failed!\n");
00457       errRet = err;
00458     }
00459   }
00460 
00461   setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00462   sOmxPortDefinition.nPortIndex = 1;
00463   if ((err = OMX_GetParameter(appPriv->colorconvhandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00464     DEBUG(DEB_LEV_ERR, "Getting colorconv input port parameters failed!\n");
00465     errRet = err;
00466   }
00467   else {
00468     sOmxPortDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
00469     sOmxPortDefinition.format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
00470     sOmxPortDefinition.format.video.nStride = DEFAULT_FRAME_WIDTH;
00471     sOmxPortDefinition.format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
00472     sOmxPortDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
00473     sOmxPortDefinition.format.video.eColorFormat = DEFAULT_FBSINK_COLOR_FORMAT; 
00474     sOmxPortDefinition.nBufferSize = sOmxPortDefinition.format.video.nStride * sOmxPortDefinition.format.video.nFrameHeight * 3;
00475     if ((err = OMX_SetParameter(appPriv->colorconvhandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00476       DEBUG(DEB_LEV_ERR, "Setting colorconv input port parameters failed!\n");
00477       errRet = err;
00478     }
00479   }
00480 
00481   
00482 
00483   return errRet;
00484 }
00485 
00486 
00487 
00488 OMX_ERRORTYPE setFbsinkParameters() {
00489   OMX_ERRORTYPE errRet = OMX_ErrorNone;
00490   OMX_ERRORTYPE err = OMX_ErrorNone;
00491   OMX_VIDEO_PARAM_PORTFORMATTYPE sVideoPortFormat;
00492   OMX_PARAM_PORTDEFINITIONTYPE sOmxPortDefinition;
00493   OMX_CONFIG_RECTTYPE sConfigCrop;
00494   OMX_CONFIG_POINTTYPE sConfigOutputPosition;
00495 
00496   /* set input port */
00497   setHeader(&sVideoPortFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
00498   sVideoPortFormat.nPortIndex = 0;
00499   sVideoPortFormat.nIndex = 0;
00500   if ((err = OMX_GetParameter(appPriv->fbsinkhandle, OMX_IndexParamVideoPortFormat, &sVideoPortFormat)) != OMX_ErrorNone) {
00501     DEBUG(DEB_LEV_ERR, "Getting fbsink input port video format failed!\n");
00502     errRet = err;
00503   }
00504   else {
00505     sVideoPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
00506     sVideoPortFormat.eColorFormat = DEFAULT_FBSINK_COLOR_FORMAT;
00507     sVideoPortFormat.xFramerate = 0;
00508     if ((err = OMX_SetParameter(appPriv->fbsinkhandle, OMX_IndexParamVideoPortFormat, &sVideoPortFormat)) != OMX_ErrorNone) {
00509       DEBUG(DEB_LEV_ERR, "Setting fbsink input port video format failed!\n");
00510       errRet = err;
00511     }
00512   }
00513 
00514   setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00515   sOmxPortDefinition.nPortIndex = 0;
00516   if ((err = OMX_GetParameter(appPriv->fbsinkhandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00517     DEBUG(DEB_LEV_ERR, "Getting fbsink input port parameters failed!\n");
00518     errRet = err;
00519   }
00520   else {
00521     sOmxPortDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
00522     sOmxPortDefinition.format.video.nFrameHeight = DEFAULT_FRAME_HEIGHT;
00523     sOmxPortDefinition.format.video.nStride = DEFAULT_FRAME_WIDTH;
00524     sOmxPortDefinition.format.video.nSliceHeight = DEFAULT_FRAME_HEIGHT;
00525     sOmxPortDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
00526     sOmxPortDefinition.format.video.eColorFormat = DEFAULT_FBSINK_COLOR_FORMAT;
00527     sOmxPortDefinition.nBufferSize = sOmxPortDefinition.format.video.nStride * sOmxPortDefinition.format.video.nFrameHeight * 3;
00528     if ((err = OMX_SetParameter(appPriv->fbsinkhandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00529       DEBUG(DEB_LEV_ERR, "Setting fbsink input port parameters failed!\n");
00530       errRet = err;
00531     }
00532   }
00533 
00534   
00535   setHeader(&sConfigCrop, sizeof(OMX_CONFIG_RECTTYPE));
00536   sConfigCrop.nPortIndex = 0;
00537   if ((err = OMX_GetConfig(appPriv->fbsinkhandle, OMX_IndexConfigCommonInputCrop, &sConfigCrop)) != OMX_ErrorNone) {
00538     DEBUG(DEB_LEV_ERR, "Getting fbsink input port Crop config failed!\n");
00539     errRet = err;
00540   }
00541   else {
00542     sConfigCrop.nLeft = 0;
00543     sConfigCrop.nTop = 0;
00544     sConfigCrop.nWidth = DEFAULT_FRAME_WIDTH;
00545     sConfigCrop.nHeight = DEFAULT_FRAME_HEIGHT;
00546     if ((err = OMX_SetConfig(appPriv->fbsinkhandle, OMX_IndexConfigCommonInputCrop, &sConfigCrop)) != OMX_ErrorNone) {
00547       DEBUG(DEB_LEV_ERR, "Setting fbsink input port Crop config failed!\n");
00548       errRet = err;
00549     }
00550   }
00551   
00552 
00553   /* set display position (x, y) */
00554   setHeader(&sConfigOutputPosition, sizeof(OMX_CONFIG_POINTTYPE));
00555   sConfigOutputPosition.nPortIndex = 0;
00556   if ((err = OMX_GetConfig(appPriv->fbsinkhandle, OMX_IndexConfigCommonOutputPosition, &sConfigOutputPosition)) != OMX_ErrorNone) {
00557     DEBUG(DEB_LEV_ERR, "Getting fbsink output port Position config failed!\n");
00558     errRet = err;
00559   }
00560   else {
00561     sConfigOutputPosition.nX = 0;
00562     sConfigOutputPosition.nY = 0;
00563     if ((err = OMX_SetConfig(appPriv->fbsinkhandle, OMX_IndexConfigCommonOutputPosition, &sConfigOutputPosition)) != OMX_ErrorNone) {
00564       DEBUG(DEB_LEV_ERR, "Setting fbsink output port Position config failed!\n");
00565       errRet = err;
00566     }
00567   }
00568   
00569 
00570   return errRet;
00571 }
00572 
00573 
00574 void display_help(char* cSelfName) {
00575   fprintf(stdout, "\n");
00576   fprintf(stdout, "Usage: %s [-h] [-i] [-p] [-t preview_time] [-s capture_time] [-c capture_file] [-m thumbnail_file] [-n run_count]\n", cSelfName);
00577   fprintf(stdout, "\n");
00578   fprintf(stdout, "    -i: If this option is specified, the camera will be running in still image capture mode\n");
00579   fprintf(stdout, "        Else, the camera will be running in video capture mode by default\n");
00580   fprintf(stdout, "\n");
00581   fprintf(stdout, "    -p: If this option is specified, the camera will be running in autopause mode\n");
00582   fprintf(stdout, "        Else, the camera will not be in autopause mode by default\n");
00583   fprintf(stdout, "\n");
00584   fprintf(stdout, "    -t preview_time: If this option is specified, the camera will stay in preview state for \"preview_time\" seconds\n");
00585   fprintf(stdout, "                     Else, the camera will preview for 5 seconds by default\n");
00586   fprintf(stdout, "\n");
00587   fprintf(stdout, "    -s capture_time: After preview, the camera will start capturing videos\n");
00588   fprintf(stdout, "                     If this option is specified, the camera will stay in video-capture state for \"capture_time\" seconds\n");
00589   fprintf(stdout, "                     Else, the camera will capture videos for 5 seconds by default\n");
00590   fprintf(stdout, "\n");
00591   fprintf(stdout, "    -c capture_file: If this option is specified, the camera captured videos will be saved in file \"capture_file\"\n");
00592   fprintf(stdout, "                     Else, captured videos will be saved in file \"%s\" by default\n", g_DefaultCaptureFileName);
00593   fprintf(stdout, "\n");
00594   fprintf(stdout, "    -m thumbnail_file: If this option is specified, the camera thumbnail/snapshot image will be saved in file \"thumbnail_file\"\n");
00595   fprintf(stdout, "                     Else, thumbnail image will be saved in file \"%s\" by default\n", g_DefaultThumbnailFileName);
00596   fprintf(stdout, "\n");
00597   fprintf(stdout, "    -n run_count: If this option is specified, this test app will run for \"run_count\" times\n");
00598   fprintf(stdout, "                     Else, run only once by default\n");
00599   fprintf(stdout, "\n");
00600   fprintf(stdout, "    -h: Displays this help\n");
00601   fprintf(stdout, "\n");
00602 }
00603 
00604 
00605 int main(int argc, char** argv) {
00606   OMX_ERRORTYPE err = OMX_ErrorNone;
00607   OMX_BOOL bOmxInitialized = OMX_FALSE;
00608   OMX_PARAM_PORTDEFINITIONTYPE sOmxPortDefinition;
00609   OMX_CONFIG_BOOLEANTYPE sOmxCapturing;
00610   OMX_CONFIG_BOOLEANTYPE sOmxAutoPause;
00611   OMX_STATETYPE sOmxState;
00612   OMX_U32 nBufferCount;
00613   OMX_U32 nBufferSize;
00614   OMX_U32 nPortIndex;
00615   OMX_U32 i;
00616   unsigned int nPreviewTime = 5;/* By default, running for 5 sec for preview */
00617   unsigned int nCaptureTime = 5;/* By default, running for 5 sec for video capture */
00618   char *cCaptureFileName = g_DefaultCaptureFileName;
00619   char *cThumbnailFileName = g_DefaultThumbnailFileName;
00620   OMX_BOOL bCameraStillImageMode = OMX_FALSE; /* By default, the camera is running in video capture mode */
00621   OMX_BOOL bCameraAutoPause = OMX_FALSE; /* By default, the camera is not running in autopause mode */
00622   unsigned int nMaxRunCount = 1;/* By default, running once */
00623   unsigned int nRunCount = 0;
00624 
00625   /* Parse arguments */
00626   for ( i = 1; i < argc && argv[i][0] == '-'; i++) {
00627     switch (argv[i][1]) {
00628       case 'i':
00629         bCameraStillImageMode = OMX_TRUE;
00630         break;
00631 
00632       case 'p':
00633         bCameraAutoPause = OMX_TRUE;
00634         break;
00635 
00636       case 't':
00637         i++;
00638         if (i>=argc ||argv[i][0] == '-') {
00639           DEBUG(DEB_LEV_ERR, "preview_time expected!\n");
00640           display_help(argv[0]);
00641           exit(-1);
00642         }
00643         nPreviewTime = (unsigned int)atoi(argv[i]);
00644         break;
00645 
00646       case 's':
00647         i++;
00648         if (i>=argc ||argv[i][0] == '-') {
00649           DEBUG(DEB_LEV_ERR, "capture_time expected!\n");
00650           display_help(argv[0]);
00651           exit(-1);
00652         }
00653         nCaptureTime = (unsigned int)atoi(argv[i]);
00654         break;
00655 
00656       case 'c':
00657         i++;
00658         if (i>=argc ||argv[i][0] == '-') {
00659           DEBUG(DEB_LEV_ERR, "capture_file expected!\n");
00660           display_help(argv[0]);
00661           exit(-1);
00662         }
00663         cCaptureFileName = argv[i];
00664         break;
00665 
00666       case 'm':
00667         i++;
00668         if (i>=argc ||argv[i][0] == '-') {
00669           DEBUG(DEB_LEV_ERR, "thumbnail_file expected!\n");
00670           display_help(argv[0]);
00671           exit(-1);
00672         }
00673         cThumbnailFileName = argv[i];
00674         break;
00675 
00676       case 'n':
00677         i++;
00678         if (i>=argc ||argv[i][0] == '-') {
00679           DEBUG(DEB_LEV_ERR, "run_count expected!\n");
00680           display_help(argv[0]);
00681           exit(-1);
00682         }
00683         nMaxRunCount = (unsigned int)atoi(argv[i]);
00684         break;
00685 
00686       case 'h':
00687         display_help(argv[0]);
00688         exit(0);
00689         break;
00690 
00691       default:
00692         DEBUG(DEB_LEV_ERR, "Unrecognized option -%c!\n", argv[i][1]);
00693         display_help(argv[0]);
00694         exit(-1);
00695       }
00696    }
00697 
00698 
00699   /* Init the Omx core */
00700   DEBUG(DEB_LEV_SIMPLE_SEQ, "Init the OMX core\n");
00701   if ((err = OMX_Init()) != OMX_ErrorNone) {
00702     DEBUG(DEB_LEV_ERR, "The OpenMAX core can not be initialized. Exiting...\n");
00703     goto EXIT;
00704   }
00705   bOmxInitialized =  OMX_TRUE;
00706 
00707   /* Initialize application private data */
00708   appPriv = (appPrivateType *)malloc(sizeof(appPrivateType));
00709   if (appPriv == NULL) {
00710     DEBUG(DEB_LEV_ERR, "Allocate app private data failed!Exiting...\n");
00711     err = OMX_ErrorInsufficientResources;
00712     goto EXIT;
00713   }
00714   memset(appPriv, 0, sizeof(appPrivateType));
00715 
00716   memset(&sCameraPortBufferList, 0, NUM_CAMERAPORTS*sizeof(OMX_PORTBUFFERCTXT));
00717 
00718   /* Open output file for camera capture and thumbnail port */
00719   fCapture=fopen(cCaptureFileName, "wb");
00720   fThumbnail=fopen(cThumbnailFileName, "wb");
00721 
00722 
00723   /* Getting camera component handle */
00724   if ((err = OMX_GetHandle(&appPriv->camerahandle, "OMX.st.v4l.camera_source", appPriv, &camera_source_callbacks)) != OMX_ErrorNone) {
00725     DEBUG(DEB_LEV_ERR, "Getting camera component handle failed!Exiting...\n");
00726     goto EXIT;
00727   }
00728 
00729   /* Getting fbsink component handle */
00730   if ((err = OMX_GetHandle(&appPriv->colorconvhandle, "OMX.st.video_colorconv.ffmpeg", appPriv, &colorconv_callbacks)) != OMX_ErrorNone) {
00731     DEBUG(DEB_LEV_ERR, "Getting color conv component handle failed!Exiting...\n");
00732     goto EXIT;
00733   }
00734 
00735   /* Getting fbsink component handle */
00736   if ((err = OMX_GetHandle(&appPriv->fbsinkhandle, "OMX.st.fbdev.fbdev_sink", appPriv, &fbsink_callbacks)) != OMX_ErrorNone) {
00737     DEBUG(DEB_LEV_ERR, "Getting fbsink component handle failed!Exiting...\n");
00738     goto EXIT;
00739   }
00740 
00741   /* Setting parameters for camera component */
00742   if ((err = setCameraParameters(bCameraStillImageMode)) != OMX_ErrorNone) {
00743     DEBUG(DEB_LEV_ERR, "Set camera parameters failed! Use default settings...\n");
00744     /* Do not exit! */
00745   }
00746 
00747   /* Setting parameters for color converter component */
00748   if ((err = setColorConvParameters()) != OMX_ErrorNone) {
00749     DEBUG(DEB_LEV_ERR, "Set fbsink parameters failed! Use default settings...\n");
00750     /* Do not exit! */
00751   }
00752 
00753 
00754   /* Setting parameters for fbsink component */
00755   if ((err = setFbsinkParameters()) != OMX_ErrorNone) {
00756     DEBUG(DEB_LEV_ERR, "Set fbsink parameters failed! Use default settings...\n");
00757     /* Do not exit! */
00758   }
00759 
00760   /* Allocate and init semaphores */
00761   appPriv->cameraSourceEventSem = (tsem_t *)malloc(sizeof(tsem_t));
00762   if (appPriv->cameraSourceEventSem == NULL) {
00763     DEBUG(DEB_LEV_ERR, "Allocate camera event semaphore failed!Exiting...\n");
00764     err = OMX_ErrorInsufficientResources;
00765     goto EXIT;
00766   }
00767   tsem_init(appPriv->cameraSourceEventSem, 0);
00768 
00769   appPriv->fbsinkEventSem = (tsem_t *)malloc(sizeof(tsem_t));
00770   if (appPriv->fbsinkEventSem == NULL) {
00771     DEBUG(DEB_LEV_ERR, "Allocate fbsink event semaphore failed!Exiting...\n");
00772     err = OMX_ErrorInsufficientResources;
00773     goto EXIT;
00774   }
00775   tsem_init(appPriv->fbsinkEventSem, 0);
00776 
00777   appPriv->colorconvEventSem = (tsem_t *)malloc(sizeof(tsem_t));
00778   if (appPriv->colorconvEventSem == NULL) {
00779     DEBUG(DEB_LEV_ERR, "Allocate colorconv event semaphore failed!Exiting...\n");
00780     err = OMX_ErrorInsufficientResources;
00781     goto EXIT;
00782   }
00783   tsem_init(appPriv->colorconvEventSem, 0);
00784 
00785   /* Setup tunnel between camera preview port, color converter and fbsink */
00786   if ((err = OMX_SetupTunnel(appPriv->camerahandle, OMX_CAMPORT_INDEX_VF, appPriv->colorconvhandle, 0)) != OMX_ErrorNone) {
00787     DEBUG(DEB_LEV_ERR, "Setup tunnel between camera preview port and color converter failed!Exiting...\n");
00788     goto EXIT;
00789   }
00790   if ((err = OMX_SetupTunnel(appPriv->colorconvhandle, 1, appPriv->fbsinkhandle, 0)) != OMX_ErrorNone) {
00791     DEBUG(DEB_LEV_ERR, "Setup tunnel between color conv port and fbsink failed!Exiting...\n");
00792     goto EXIT;
00793   }
00794 
00795   /* disable the clock port of the video sink */
00796   err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandPortDisable, 1, NULL);
00797   if(err != OMX_ErrorNone) {
00798     DEBUG(DEB_LEV_ERR,"video sink clock port disable failed err=%x \n",err);
00799     exit(1);
00800   }
00801   tsem_down(appPriv->fbsinkEventSem); /* video sink clock port disabled */
00802   DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s Video Sink Clock Port Disabled\n", __func__);
00803 
00804 RUN_AGAIN:
00805 
00806   /* Transition camera component Loaded-->Idle */
00807   if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
00808     DEBUG(DEB_LEV_ERR, "Camera Loaded-->Idle failed!Exiting...\n");
00809     goto EXIT;
00810   }
00811 
00812   /* Transition color conv component Loaded-->Idle */
00813   if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
00814     DEBUG(DEB_LEV_ERR, "Color Conv Loaded-->Idle failed!Exiting...\n");
00815     goto EXIT;
00816   }
00817 
00818   /* Transition fbsink component Loaded-->Idle */
00819   if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
00820     DEBUG(DEB_LEV_ERR, "Fbsink Loaded-->Idle failed!Exiting...\n");
00821     goto EXIT;
00822   }
00823 
00824   /* Allocate port buffers for camera component */
00825   for (nPortIndex = OMX_CAMPORT_INDEX_CP; nPortIndex <= OMX_CAMPORT_INDEX_CP_T; nPortIndex++) {
00826     setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00827     sOmxPortDefinition.nPortIndex = nPortIndex;
00828     if ((err = OMX_GetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) {
00829       DEBUG(DEB_LEV_ERR, "OMX_GetParameter for camera on OMX_IndexParamPortDefinition index failed!Exiting...\n");
00830       goto EXIT;
00831     }
00832     nBufferCount = sOmxPortDefinition.nBufferCountActual;
00833     nBufferSize = sOmxPortDefinition.nBufferSize;
00834     DEBUG(DEB_LEV_SIMPLE_SEQ, "Camera port[%ld] needs %ld buffers each of which is %ld bytes\n", nPortIndex, nBufferCount, nBufferSize);
00835 
00836     for (i = 0; i < nBufferCount; i++) {
00837       if ((err = OMX_AllocateBuffer(appPriv->camerahandle, &sCameraPortBufferList[nPortIndex].pBufHeaderList[i], nPortIndex, NULL, nBufferSize)) != OMX_ErrorNone) {
00838         DEBUG(DEB_LEV_ERR, "Allocate port buffer for camera failed!Exiting...\n");
00839         goto EXIT;
00840       }
00841       sCameraPortBufferList[nPortIndex].nBufferCountActual++;
00842     }
00843   }
00844 
00845   /* Wait camera (Loaded-->Idle) to complete */
00846   tsem_down(appPriv->cameraSourceEventSem);
00847   /* Wait fbsink (Loaded-->Idle) to complete */
00848   tsem_down(appPriv->colorconvEventSem);
00849   /* Wait fbsink (Loaded-->Idle) to complete */
00850   tsem_down(appPriv->fbsinkEventSem);
00851 
00852 
00853 
00854   /* Transition camera component Idle-->Exec */
00855   if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) {
00856     DEBUG(DEB_LEV_ERR, "Camera Idle-->Exec failed!Exiting...\n");
00857     goto EXIT;
00858   }
00859 
00860   /* Transition color conv component Idle-->Exec */
00861   if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) {
00862     DEBUG(DEB_LEV_ERR, "Colorconv Idle-->Exec failed!Exiting...\n");
00863     goto EXIT;
00864   }
00865 
00866   /* Transition fbsink component Idle-->Exec */
00867   if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) {
00868     DEBUG(DEB_LEV_ERR, "Fbsink Idle-->Exec failed!Exiting...\n");
00869     goto EXIT;
00870   }
00871 
00872   /* Wait camera (Idle-->Exec) to complete */
00873   tsem_down(appPriv->cameraSourceEventSem);
00874   /* Wait color conv (Idle-->Exec) to complete */
00875   tsem_down(appPriv->colorconvEventSem);
00876   /* Wait fbsink (Idle-->Exec) to complete */
00877   tsem_down(appPriv->fbsinkEventSem);
00878 
00879 
00880   fprintf(stdout, "Start preview, for %d sec...\n", nPreviewTime);
00881   sleep(nPreviewTime);
00882 
00883   /* Fill buffers to camera capture port */
00884   for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].nBufferCountActual; i++) {
00885     sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nFilledLen = 0;
00886     sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nOffset = 0;
00887     if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i])) != OMX_ErrorNone) {
00888       DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n");
00889       goto EXIT;
00890     }
00891     DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32)sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]);
00892   }
00893 
00894   /* Fill buffers to camera thumbnail port */
00895   for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].nBufferCountActual; i++) {
00896     sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i]->nFilledLen = 0;
00897     sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i]->nOffset = 0;
00898     if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i])) != OMX_ErrorNone) {
00899       DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n");
00900       goto EXIT;
00901     }
00902     DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32)sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i]);
00903   }
00904 
00905   /* Set up autopause mode */
00906   setHeader(&sOmxAutoPause, sizeof(OMX_CONFIG_BOOLEANTYPE));
00907   sOmxAutoPause.bEnabled = bCameraAutoPause;
00908   if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexAutoPauseAfterCapture, &sOmxAutoPause)) != OMX_ErrorNone) {
00909     DEBUG(DEB_LEV_ERR, "Set autopause mode failed!Use default settings...\n");
00910     /* Do not exit */
00911   }
00912 
00913   /*  Start capturing */
00914   setHeader(&sOmxCapturing, sizeof(OMX_CONFIG_BOOLEANTYPE));
00915   sOmxCapturing.bEnabled = OMX_TRUE;
00916   if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexConfigCapturing, &sOmxCapturing)) != OMX_ErrorNone) {
00917     DEBUG(DEB_LEV_ERR, "Start capturing failed!Exiting...\n");
00918     goto EXIT;
00919   }
00920 
00921   fprintf(stdout, "Start capturing, for %d sec...\n", nCaptureTime);
00922   sleep(nCaptureTime);
00923 
00924   /*  Stop capturing */
00925   if (!bCameraStillImageMode) {
00926     setHeader(&sOmxCapturing, sizeof(OMX_CONFIG_BOOLEANTYPE));
00927     sOmxCapturing.bEnabled = OMX_FALSE;
00928     if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexConfigCapturing, &sOmxCapturing)) != OMX_ErrorNone) {
00929       DEBUG(DEB_LEV_ERR, "Stop capturing failed!Exiting...\n");
00930       goto EXIT;
00931     }
00932     fprintf(stdout, "Stop capturing...\n");
00933   }
00934 
00935   /* If in autopause mode, stay for a while before exit */ 
00936   if (bCameraAutoPause) {
00937     fprintf(stdout, "Now the camera is in autopause mode, wait for %d sec before out of this mode...\n", 5);
00938     sleep(5);
00939     /* Stop autopause mode */
00940     if ((err = OMX_GetState(appPriv->camerahandle,&sOmxState)) != OMX_ErrorNone) {
00941       DEBUG(DEB_LEV_ERR, "Get camera state failed!Exiting...\n");
00942       goto EXIT;
00943     }
00944     if (sOmxState == OMX_StatePause) {
00945       if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet,
00946                                                       OMX_StateExecuting, 0 )) != OMX_ErrorNone ) {
00947         DEBUG(DEB_LEV_ERR, "Pause-->Exec failed!Exiting...\n");
00948         goto EXIT;
00949       }
00950       /* Wait camera (Pause-->Exec) to complete */
00951       tsem_down(appPriv->cameraSourceEventSem);
00952       fprintf(stdout, "Now the camera is out of autopause mode, wait for %d sec before exit...\n", 5);
00953       sleep(5);
00954     }
00955     else {
00956       DEBUG(DEB_LEV_ERR, "The camera is not in Pause state in autopause mode, ignore...\n");
00957     }
00958   }
00959 
00960   /* Transition camera component Exec-->Idle */
00961   if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
00962     DEBUG(DEB_LEV_ERR, "Camera Exec-->Idle failed!Exiting...\n");
00963     goto EXIT;
00964   }
00965 
00966   /* Transition colorconv component Exec-->Idle */
00967   if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
00968     DEBUG(DEB_LEV_ERR, "Color conv Exec-->Idle failed!Exiting...\n");
00969     goto EXIT;
00970   }
00971 
00972   /* Transition fbsink component Exec-->Idle */
00973   if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
00974     DEBUG(DEB_LEV_ERR, "Fbsink Exec-->Idle failed!Exiting...\n");
00975     goto EXIT;
00976   }
00977 
00978   /* Wait camera (Exec-->Idle) to complete */
00979   tsem_down(appPriv->cameraSourceEventSem);
00980   /* Wait color conv (Exec-->Idle) to complete */
00981   tsem_down(appPriv->colorconvEventSem);
00982   /* Wait fbsink (Exec-->Idle) to complete */
00983   tsem_down(appPriv->fbsinkEventSem);
00984   
00985 
00986   /* Transition camera component Idle-->Exec */
00987   if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) {
00988     DEBUG(DEB_LEV_ERR, "Camera Idle-->Exec failed!Exiting...\n");
00989     goto EXIT;
00990   }
00991 
00992   /* Transition color conv component Idle-->Exec */
00993   if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) {
00994     DEBUG(DEB_LEV_ERR, "Colorconv Idle-->Exec failed!Exiting...\n");
00995     goto EXIT;
00996   }
00997 
00998   /* Transition fbsink component Idle-->Exec */
00999   if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) {
01000     DEBUG(DEB_LEV_ERR, "Fbsink Idle-->Exec failed!Exiting...\n");
01001     goto EXIT;
01002   }
01003 
01004   /* Wait camera (Idle-->Exec) to complete */
01005   tsem_down(appPriv->cameraSourceEventSem);
01006   /* Wait color conv (Exec-->Idle) to complete */
01007   tsem_down(appPriv->colorconvEventSem);
01008   /* Wait fbsink (Idle-->Exec) to complete */
01009   tsem_down(appPriv->fbsinkEventSem);
01010 
01011   fprintf(stdout, "Continue to preview, for %d sec...\n", nPreviewTime);
01012   sleep(nPreviewTime);
01013 
01014   /* Transition camera component Exec-->Idle */
01015   if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
01016     DEBUG(DEB_LEV_ERR, "Camera Exec-->Idle failed!Exiting...\n");
01017     goto EXIT;
01018   }
01019 
01020   /* Transition color conv component Exec-->Idle */
01021   if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
01022     DEBUG(DEB_LEV_ERR, "Color conv Exec-->Idle failed!Exiting...\n");
01023     goto EXIT;
01024   }
01025 
01026   /* Transition fbsink component Exec-->Idle */
01027   if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) {
01028     DEBUG(DEB_LEV_ERR, "Fbsink Exec-->Idle failed!Exiting...\n");
01029     goto EXIT;
01030   }
01031 
01032 
01033   /* Wait camera (Exec-->Idle) to complete */
01034   tsem_down(appPriv->cameraSourceEventSem);
01035   /* Wait color conv (Exec-->Idle) to complete */
01036   tsem_down(appPriv->colorconvEventSem);
01037   /* Wait fbsink (Exec-->Idle) to complete */
01038   tsem_down(appPriv->fbsinkEventSem);
01039 
01040 
01041   /* Transition camera component Idle-->Loaded */
01042   if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) {
01043     DEBUG(DEB_LEV_ERR, "Camera Idle-->Loaded failed!Exiting...\n");
01044     goto EXIT;
01045   }
01046 
01047   /* Transition color conv component Idle-->Loaded */
01048   if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) {
01049     DEBUG(DEB_LEV_ERR, "Color conv Exec-->Idle failed!Exiting...\n");
01050     goto EXIT;
01051   }
01052 
01053   /* Transition fbsink component Idle-->Loaded */
01054   if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) {
01055     DEBUG(DEB_LEV_ERR, "Fbsink Idle-->Loaded failed!Exiting...\n");
01056     goto EXIT;
01057   }
01058 
01059   /* Free bufers for each non-tunneled port of camera component */
01060   for (nPortIndex = OMX_CAMPORT_INDEX_CP; nPortIndex <= OMX_CAMPORT_INDEX_CP_T; nPortIndex++) {
01061     for (i = 0; i < sCameraPortBufferList[nPortIndex].nBufferCountActual; i++) {
01062       if (sCameraPortBufferList[nPortIndex].pBufHeaderList[i] != NULL) {
01063         OMX_FreeBuffer(appPriv->camerahandle, nPortIndex, sCameraPortBufferList[nPortIndex].pBufHeaderList[i]);
01064       }
01065     }
01066     sCameraPortBufferList[nPortIndex].nBufferCountActual = 0;
01067   }
01068 
01069   /* Wait camera (Idle-->Loaded) to complete */
01070   tsem_down(appPriv->cameraSourceEventSem);
01071   /* Wait color conv (Exec-->Idle) to complete */
01072   tsem_down(appPriv->colorconvEventSem);
01073   /* Wait fbsink (Idle-->Loaded) to complete */
01074   tsem_down(appPriv->fbsinkEventSem);
01075 
01076   nRunCount++;
01077   if (nRunCount < nMaxRunCount) {
01078     goto RUN_AGAIN;
01079   }
01080 
01081   fprintf(stdout, "The captured videos are saved in file \"%s\"\n", cCaptureFileName);
01082   fprintf(stdout, "The thumbnail image is saved in file \"%s\"\n", cThumbnailFileName);
01083 
01084 EXIT:
01085   if (fCapture != NULL) {
01086     fclose(fCapture);
01087   }
01088   if (fThumbnail != NULL) {
01089     fclose(fThumbnail);
01090   }
01091 
01092   /* Free app private data */
01093   if (appPriv != NULL) {
01094     /* Free semaphores */
01095     if (appPriv->cameraSourceEventSem != NULL) {
01096       tsem_deinit(appPriv->cameraSourceEventSem);
01097       free(appPriv->cameraSourceEventSem);
01098     }
01099 
01100     if (appPriv->colorconvEventSem != NULL) {
01101       tsem_deinit(appPriv->colorconvEventSem);
01102       free(appPriv->colorconvEventSem);
01103     }
01104 
01105     if (appPriv->fbsinkEventSem != NULL) {
01106       tsem_deinit(appPriv->fbsinkEventSem);
01107       free(appPriv->fbsinkEventSem);
01108     }
01109 
01110     /* Free camera component handle */
01111     if (appPriv->camerahandle != NULL) {
01112       OMX_FreeHandle(appPriv->camerahandle);
01113     }
01114     /* Free Color conv component handle */
01115     if (appPriv->colorconvhandle != NULL) {
01116       OMX_FreeHandle(appPriv->colorconvhandle);
01117     }
01118 
01119     /* Free fbsink component handle */
01120     if (appPriv->fbsinkhandle != NULL) {
01121       OMX_FreeHandle(appPriv->fbsinkhandle);
01122     }
01123 
01124     free(appPriv);
01125   }
01126 
01127   /* Deinit the Omx core */
01128   if (bOmxInitialized) {
01129     OMX_Deinit();
01130   }
01131 
01132   return (int) err;
01133 }

Generated for OpenMAX Bellagio rel. 0.9.0 by  doxygen 1.5.1
SourceForge.net Logo