OMXReprocess.cpp revision d2951b18ac3cc79c6a985ff86f64fcb03a562afc
1f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/* 2f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * Copyright (C) Texas Instruments - http://www.ti.com/ 3f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * 4f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * Licensed under the Apache License, Version 2.0 (the "License"); 5f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * you may not use this file except in compliance with the License. 6f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * You may obtain a copy of the License at 7f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * 8f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * http://www.apache.org/licenses/LICENSE-2.0 9f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * 10f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * Unless required by applicable law or agreed to in writing, software 11f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * distributed under the License is distributed on an "AS IS" BASIS, 12f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * See the License for the specific language governing permissions and 14f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * limitations under the License. 15f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 16f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 17f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 18f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons* @file OMXReprocess.cpp 19f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons* 20f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons* This file contains functionality for handling reprocessing operations. 21f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons* 22f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons*/ 23f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 24f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "CameraHal.h" 25f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "OMXCameraAdapter.h" 26f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "ErrorUtils.h" 27f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 28f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 29f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti { 30f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera { 31f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 32f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setParametersReprocess(const android::CameraParameters ¶ms, 33f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraBuffer* buffers, 34f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons BaseCameraAdapter::AdapterState state) 35f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 36f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 37f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int w, h, s; 38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_COLOR_FORMATTYPE pixFormat; 39f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMXCameraPortParameters *portData; 40f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char* valstr; 41f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 42f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 43f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 44f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!buffers) { 45f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("invalid buffer array"); 46f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 47f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 48f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 49f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoInPortIndex]; 50f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 51f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons w = buffers[0].width; 52f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons h = buffers[0].height; 53f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons s = buffers[0].stride; 54f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 55f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = buffers[0].format; 56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valstr != NULL) { 57f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) { 58f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("YUV420SP format selected"); 59f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pixFormat = OMX_COLOR_FormatYUV420SemiPlanar; 60f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) { 61f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("RAW Picture format selected"); 62f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pixFormat = OMX_COLOR_FormatRawBayer10bit; 63f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 64f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Format not supported, selecting YUV420SP by default"); 65f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pixFormat = OMX_COLOR_FormatYUV420SemiPlanar; 66f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 67f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 68f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Format not supported, selecting YUV420SP by default"); 69f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pixFormat = OMX_COLOR_FormatYUV420SemiPlanar; 70f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 71f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 72f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (w != (int)portData->mWidth) || (h != (int)portData->mHeight) || 73f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (s != (int) portData->mStride) || (pixFormat != portData->mColorFormat)) { 74f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mWidth = w; 75f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mHeight = h; 76f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 77f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( OMX_COLOR_FormatRawBayer10bit == pixFormat ) { 78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mStride = w * 2; 79f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 80f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mStride = s; 81f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 82f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 83f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mColorFormat = pixFormat; 84f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 85f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPendingReprocessSettings |= SetFormat; 86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 87f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 88f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 89f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 90f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 91f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 92f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 93f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::startReprocess() 94f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 95f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 96f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_ERRORTYPE eError = OMX_ErrorNone; 97f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMXCameraPortParameters * portData = NULL; 98f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 99f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 100f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD ("mReprocConfigured = %d", mReprocConfigured); 101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!mReprocConfigured) { 102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 103f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoInPortIndex]; 106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD ("mReprocConfigured = %d", mBurstFramesQueued); 108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NO_ERROR == ret) { 109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mBurstLock); 110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for ( int index = 0 ; index < portData->mMaxQueueable ; index++ ) { 112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Queuing buffer on video input port - %p", 113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mBufferHeader[index]->pBuffer); 114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mStatus[index] = OMXCameraPortParameters::FILL; 115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_EmptyThisBuffer(mCameraAdapterParameters.mHandleComp, 116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (OMX_BUFFERHEADERTYPE*)portData->mBufferHeader[index]); 117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError); 118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 121d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 122d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev CameraHal::PPM("startReprocess buffers queued on video port: ", &mStartCapture); 123d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif 124d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (ret | Utils::ErrorUtils::omxToAndroidError(eError)); 126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsEXIT: 128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError); 129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons performCleanupAfterError(); 130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (ret | Utils::ErrorUtils::omxToAndroidError(eError)); 132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::stopReprocess() 135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_ERRORTYPE eError = OMX_ErrorNone; 140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMXCameraPortParameters *portData = NULL; 141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!mReprocConfigured) { 143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoInPortIndex]; 147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Disable port - send command and then free all buffers 149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, 150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_EventCmdComplete, 151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_CommandPortDisable, 152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mStopReprocSem); 154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp, 155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_CommandPortDisable, 156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons NULL); 158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (portData) { 159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Freeing buffers on reproc port - num: %d", portData->mNumBufs); 160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (int index = 0 ; index < portData->mNumBufs ; index++) { 161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Freeing buffer on reproc port - 0x%x", 162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( unsigned int ) portData->mBufferHeader[index]->pBuffer); 163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_FreeBuffer(mCameraAdapterParameters.mHandleComp, 164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (OMX_BUFFERHEADERTYPE*)portData->mBufferHeader[index]); 166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError); 167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Waiting for port disable"); 170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mStopReprocSem.WaitTimeout(OMX_CMD_TIMEOUT); 171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mComponentState == OMX_StateInvalid) { 172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Invalid State after Disable Image Port Exitting!!!"); 173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto EXIT; 174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NO_ERROR == ret) { 176f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Port disabled"); 177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 178f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp, 179f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_EventCmdComplete, 180f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_CommandPortDisable, 181f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons NULL); 183f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Timeout expired on port disable"); 184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto EXIT; 185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 186f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons deinitInternalBuffers(mCameraAdapterParameters.mVideoInPortIndex); 188f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 189f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mReprocConfigured = false; 190f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 191f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsEXIT: 192f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError); 193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 194f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (ret | Utils::ErrorUtils::omxToAndroidError(eError)); 195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 196f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 197f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::disableReprocess(){ 198f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_ERRORTYPE eError = OMX_ErrorNone; 200f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 201f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // no-op..for now 202f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 203f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsEXIT: 204f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (ret | Utils::ErrorUtils::omxToAndroidError(eError)); 205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 206f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 207f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::UseBuffersReprocess(CameraBuffer *bufArr, int num) 208f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 209f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 210f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_ERRORTYPE eError = OMX_ErrorNone; 213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMXCameraPortParameters *portData = NULL; 214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoInPortIndex]; 216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( 0 != mUseReprocessSem.Count() ) { 218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Error mUseReprocessSem semaphore count %d", mUseReprocessSem.Count()); 219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_ASSERT(num > 0); 223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mAdapterState == REPROCESS_STATE) { 225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons stopReprocess(); 226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (mAdapterState == CAPTURE_STATE) { 227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons stopImageCapture(); 228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons stopReprocess(); 229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons disableImagePort(); 230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 232d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 233d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 234d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev CameraHal::PPM("Reprocess stopping image capture and disabling image port: ", &bufArr->ppmStamp); 235d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 236d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif 237d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mNumBufs = num; 239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Configure 241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setParametersReprocess(mParams, bufArr, mAdapterState); 242f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mReprocConfigured) { 244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mPendingReprocessSettings & ECaptureParamSettings) { 245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons stopReprocess(); 246f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Tap in port has been already configured. 248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mPendingReprocessSettings & SetFormat) { 253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPendingReprocessSettings &= ~SetFormat; 254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setFormat(OMX_CAMERA_PORT_VIDEO_IN_VIDEO, *portData); 255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ret != NO_ERROR ) { 256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("setFormat() failed %d", ret); 257f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 261f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 262f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Configure DOMX to use either gralloc handles or vptrs 263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_TI_PARAMUSENATIVEBUFFER domxUseGrallocHandles; 264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_INIT_STRUCT_PTR (&domxUseGrallocHandles, OMX_TI_PARAMUSENATIVEBUFFER); 265f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 266f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons domxUseGrallocHandles.nPortIndex = mCameraAdapterParameters.mVideoInPortIndex; 267f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (bufArr[0].type == CAMERA_BUFFER_ANW) { 268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Using ANW"); 269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons domxUseGrallocHandles.bEnable = OMX_TRUE; 270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 271f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Need to allocate tiler reservation and state we are going to be using 272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // pagelist buffers. Assuming this happens when buffers if from anw 273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons initInternalBuffers(mCameraAdapterParameters.mVideoInPortIndex); 274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Using ION"); 276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons domxUseGrallocHandles.bEnable = OMX_FALSE; 277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (OMX_INDEXTYPE)OMX_TI_IndexUseNativeBuffers, &domxUseGrallocHandles); 280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (eError!=OMX_ErrorNone) { 281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("OMX_SetParameter - %x", eError); 282f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError); 284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 285d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 286d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 287d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev CameraHal::PPM("Reprocess configuration done: ", &bufArr->ppmStamp); 288d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 289d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif 290d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Enable Port 292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, 293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_EventCmdComplete, 294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_CommandPortEnable, 295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mUseReprocessSem); 297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp, 298f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_CommandPortEnable, 299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons NULL); 301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError); 302f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (int index = 0 ; index < portData->mNumBufs ; index++) 304f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_BUFFERHEADERTYPE *pBufferHdr; 306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("OMX_UseBuffer Capture address: 0x%x, size = %d", 307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (unsigned int)bufArr[index].opaque, 308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (int)portData->mBufSize); 309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_UseBuffer(mCameraAdapterParameters.mHandleComp, 311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons &pBufferHdr, 312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 0, 314f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mBufSize, 315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (OMX_U8*)camera_buffer_get_omx_ptr(&bufArr[index])); 316f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 317f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("OMX_UseBuffer = 0x%x", eError); 318f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError); 319f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 320f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pBufferHdr->pAppPrivate = (OMX_PTR) &bufArr[index]; 321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bufArr[index].index = index; 322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pBufferHdr->nVersion.s.nVersionMajor = 1 ; 324f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pBufferHdr->nVersion.s.nVersionMinor = 1 ; 325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pBufferHdr->nVersion.s.nRevision = 0; 326f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pBufferHdr->nVersion.s.nStep = 0; 327f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portData->mBufferHeader[index] = pBufferHdr; 328f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 330f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Wait for port enable event 331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Waiting for port enable"); 332f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mUseReprocessSem.WaitTimeout(OMX_CMD_TIMEOUT); 333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 334f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Error out if somethiing bad happened while we wait 335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mComponentState == OMX_StateInvalid) { 336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Invalid State while trying to enable port for reprocessing"); 337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto EXIT; 338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret == NO_ERROR) { 341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Port enabled"); 342f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp, 344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_EventCmdComplete, 345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_CommandPortEnable, 346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mVideoInPortIndex, 347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons NULL); 348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Timeout expired on port enable"); 349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto EXIT; 350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 352f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mReprocConfigured = true; 353f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 354d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 355d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 356d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev CameraHal::PPM("Reprocess video port enabled and buffers registered: ", &bufArr->ppmStamp); 357d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 358d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif 359d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev 360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (ret | Utils::ErrorUtils::omxToAndroidError(eError)); 361f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 362f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsEXIT: 363f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError); 364f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Release image buffers 365f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != mReleaseImageBuffersCallback ) { 366f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mReleaseImageBuffersCallback(mReleaseData); 367f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 368f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons performCleanupAfterError(); 369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (ret | Utils::ErrorUtils::omxToAndroidError(eError)); 371f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 372f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 374f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera 375f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti 376