diff options
Diffstat (limited to 'camera/OMXCameraAdapter/OMXCameraAdapter.cpp')
| -rwxr-xr-x | camera/OMXCameraAdapter/OMXCameraAdapter.cpp | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp index 4495d50..976fe8f 100755 --- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp +++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp @@ -1757,6 +1757,7 @@ status_t OMXCameraAdapter::startPreview() OMX_ERRORTYPE eError = OMX_ErrorNone; OMXCameraPortParameters *mPreviewData = NULL; OMXCameraPortParameters *measurementData = NULL; + OMX_CONFIG_EXTRADATATYPE extraDataControl; LOG_FUNCTION_NAME; @@ -1863,6 +1864,22 @@ status_t OMXCameraAdapter::startPreview() } + // Enable Ancillary data. The nDCCStatus field is used to signify + // whether the preview frame is a snapshot + if ( OMX_ErrorNone == eError) + { + OMX_INIT_STRUCT_PTR (&extraDataControl, OMX_CONFIG_EXTRADATATYPE); + extraDataControl.nPortIndex = OMX_ALL; + extraDataControl.eExtraDataType = OMX_AncillaryData; + extraDataControl.bEnable = OMX_TRUE; + + eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, + ( OMX_INDEXTYPE ) OMX_IndexConfigOtherExtraDataControl, + &extraDataControl); + GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError); + } + + if ( mPending3Asettings ) apply3Asettings(mParameters3A); @@ -2878,6 +2895,10 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE sp<CameraFDResult> fdResult = NULL; unsigned int mask = 0xFFFF; CameraFrame cameraFrame; + OMX_TI_PLATFORMPRIVATE *platformPrivate; + OMX_OTHER_EXTRADATATYPE *extraData; + OMX_TI_ANCILLARYDATATYPE *ancillaryData; + bool snapshotFrame = false; res1 = res2 = NO_ERROR; pPortParam = &(mCameraAdapterParameters.mCameraPortParams[pBuffHeader->nOutputPortIndex]); @@ -2895,6 +2916,19 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE return OMX_ErrorNone; } + if ( mWaitingForSnapshot ) + { + platformPrivate = (OMX_TI_PLATFORMPRIVATE*) pBuffHeader->pPlatformPrivate; + extraData = getExtradata((OMX_OTHER_EXTRADATATYPE*) platformPrivate->pMetaDataBuffer, + (OMX_EXTRADATATYPE) OMX_AncillaryData); + + if ( NULL != extraData ) + { + ancillaryData = (OMX_TI_ANCILLARYDATATYPE*) extraData->data; + snapshotFrame = ancillaryData->nDCCStatus; + } + } + recalculateFPS(); { @@ -2914,15 +2948,15 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE } ///Prepare the frames to be sent - initialize CameraFrame object and reference count - if( mWaitingForSnapshot && (mCapturedFrames > 0) ) + if( mWaitingForSnapshot && (mCapturedFrames > 0) && snapshotFrame ) { typeOfFrame = CameraFrame::SNAPSHOT_FRAME; mask = (unsigned int)CameraFrame::SNAPSHOT_FRAME; } else { - typeOfFrame = CameraFrame::PREVIEW_FRAME_SYNC; - mask = (unsigned int)CameraFrame::PREVIEW_FRAME_SYNC; + typeOfFrame = CameraFrame::PREVIEW_FRAME_SYNC; + mask = (unsigned int)CameraFrame::PREVIEW_FRAME_SYNC; } if (mRecording) @@ -3322,6 +3356,23 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler() return false; } +OMX_OTHER_EXTRADATATYPE *OMXCameraAdapter::getExtradata(OMX_OTHER_EXTRADATATYPE *extraData, OMX_EXTRADATATYPE type) +{ + if ( NULL != extraData ) + { + while ( extraData->nDataSize != 0 ) + { + if ( type == extraData->eType ) + { + return extraData; + } + extraData = (OMX_OTHER_EXTRADATATYPE*) ((char*)extraData + extraData->nSize); + } + } + // Required extradata type wasn't found + return NULL; +} + OMXCameraAdapter::OMXCameraAdapter(size_t sensor_index): mComponentState (OMX_StateLoaded) { LOG_FUNCTION_NAME; |
