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
00050 OMX_CALLBACKTYPE camera_source_callbacks = {
00051 .EventHandler = camera_sourceEventHandler,
00052 .EmptyBufferDone = NULL,
00053 .FillBufferDone = camera_sourceFillBufferDone
00054 };
00055
00056
00057 OMX_CALLBACKTYPE colorconv_callbacks = {
00058 .EventHandler = colorconvEventHandler,
00059 .EmptyBufferDone = colorconvEmptyBufferDone,
00060 .FillBufferDone = colorconvFillBufferDone
00061 };
00062
00063
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
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
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
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
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
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
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
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
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
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;
00617 unsigned int nCaptureTime = 5;
00618 char *cCaptureFileName = g_DefaultCaptureFileName;
00619 char *cThumbnailFileName = g_DefaultThumbnailFileName;
00620 OMX_BOOL bCameraStillImageMode = OMX_FALSE;
00621 OMX_BOOL bCameraAutoPause = OMX_FALSE;
00622 unsigned int nMaxRunCount = 1;
00623 unsigned int nRunCount = 0;
00624
00625
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
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
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
00719 fCapture=fopen(cCaptureFileName, "wb");
00720 fThumbnail=fopen(cThumbnailFileName, "wb");
00721
00722
00723
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
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
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
00742 if ((err = setCameraParameters(bCameraStillImageMode)) != OMX_ErrorNone) {
00743 DEBUG(DEB_LEV_ERR, "Set camera parameters failed! Use default settings...\n");
00744
00745 }
00746
00747
00748 if ((err = setColorConvParameters()) != OMX_ErrorNone) {
00749 DEBUG(DEB_LEV_ERR, "Set fbsink parameters failed! Use default settings...\n");
00750
00751 }
00752
00753
00754
00755 if ((err = setFbsinkParameters()) != OMX_ErrorNone) {
00756 DEBUG(DEB_LEV_ERR, "Set fbsink parameters failed! Use default settings...\n");
00757
00758 }
00759
00760
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
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
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);
00802 DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s Video Sink Clock Port Disabled\n", __func__);
00803
00804 RUN_AGAIN:
00805
00806
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
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
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
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
00846 tsem_down(appPriv->cameraSourceEventSem);
00847
00848 tsem_down(appPriv->colorconvEventSem);
00849
00850 tsem_down(appPriv->fbsinkEventSem);
00851
00852
00853
00854
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
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
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
00873 tsem_down(appPriv->cameraSourceEventSem);
00874
00875 tsem_down(appPriv->colorconvEventSem);
00876
00877 tsem_down(appPriv->fbsinkEventSem);
00878
00879
00880 fprintf(stdout, "Start preview, for %d sec...\n", nPreviewTime);
00881 sleep(nPreviewTime);
00882
00883
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
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
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
00911 }
00912
00913
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
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
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
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
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
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
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
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
00979 tsem_down(appPriv->cameraSourceEventSem);
00980
00981 tsem_down(appPriv->colorconvEventSem);
00982
00983 tsem_down(appPriv->fbsinkEventSem);
00984
00985
00986
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
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
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
01005 tsem_down(appPriv->cameraSourceEventSem);
01006
01007 tsem_down(appPriv->colorconvEventSem);
01008
01009 tsem_down(appPriv->fbsinkEventSem);
01010
01011 fprintf(stdout, "Continue to preview, for %d sec...\n", nPreviewTime);
01012 sleep(nPreviewTime);
01013
01014
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
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
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
01034 tsem_down(appPriv->cameraSourceEventSem);
01035
01036 tsem_down(appPriv->colorconvEventSem);
01037
01038 tsem_down(appPriv->fbsinkEventSem);
01039
01040
01041
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
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
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
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
01070 tsem_down(appPriv->cameraSourceEventSem);
01071
01072 tsem_down(appPriv->colorconvEventSem);
01073
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
01093 if (appPriv != NULL) {
01094
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
01111 if (appPriv->camerahandle != NULL) {
01112 OMX_FreeHandle(appPriv->camerahandle);
01113 }
01114
01115 if (appPriv->colorconvhandle != NULL) {
01116 OMX_FreeHandle(appPriv->colorconvhandle);
01117 }
01118
01119
01120 if (appPriv->fbsinkhandle != NULL) {
01121 OMX_FreeHandle(appPriv->fbsinkhandle);
01122 }
01123
01124 free(appPriv);
01125 }
01126
01127
01128 if (bOmxInitialized) {
01129 OMX_Deinit();
01130 }
01131
01132 return (int) err;
01133 }