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 &params,
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