1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License.
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @file OMXCapture.cpp
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file contains functionality for handling image capture.
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMXCameraAdapter.h"
26b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman#include "ErrorUtils.h"
27b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
29f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
30f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
32f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setParametersCapture(const android::CameraParameters &params,
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                BaseCameraAdapter::AdapterState state)
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *str = NULL;
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_COLOR_FORMATTYPE pixFormat;
39f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CodingMode codingMode = mCodingMode;
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
41a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    int varint = 0;
42f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_STEREOFRAMELAYOUTTYPE capFrmLayout;
43f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool inCaptureState = false;
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *cap;
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
50f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    capFrmLayout = cap->mFrameLayoutType;
51f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    setParamS3D(mCameraAdapterParameters.mImagePortIndex,
52f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        params.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT));
53f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (capFrmLayout != cap->mFrameLayoutType) {
54f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPendingCaptureSettings |= SetFormat;
55f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.getPictureSize(&w, &h);
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( w != ( int ) cap->mWidth ) ||
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          ( h != ( int ) cap->mHeight ) )
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
62b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings |= SetFormat;
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap->mWidth = w;
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap->mHeight = h;
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //TODO: Support more pixelformats
68d9520b9de06f01b9411307040cf245e6fc7fe361Milen Mitkov    //cap->mStride = 2;
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Image: cap.mWidth = %d", (int)cap->mWidth);
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Image: cap.mHeight = %d", (int)cap->mHeight);
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
73c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev    if ((valstr = params.getPictureFormat()) != NULL) {
74f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_YUV422I) == 0) {
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("CbYCrY format selected");
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatCbYCrY;
77f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPictureFormatFromClient = android::CameraParameters::PIXEL_FORMAT_YUV422I;
78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if(strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) {
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("YUV420SP format selected");
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatYUV420SemiPlanar;
81f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPictureFormatFromClient = android::CameraParameters::PIXEL_FORMAT_YUV420SP;
82f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if(strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_RGB565) == 0) {
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RGB565 format selected");
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_Format16bitRGB565;
85f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPictureFormatFromClient = android::CameraParameters::PIXEL_FORMAT_RGB565;
86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_JPEG) == 0) {
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("JPEG format selected");
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
89f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            codingMode = CodingJPEG;
90f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPictureFormatFromClient = android::CameraParameters::PIXEL_FORMAT_JPEG;
91f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (strcmp(valstr, TICameraParameters::PIXEL_FORMAT_JPS) == 0) {
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("JPS format selected");
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
94f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            codingMode = CodingJPS;
95c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = TICameraParameters::PIXEL_FORMAT_JPS;
96f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (strcmp(valstr, TICameraParameters::PIXEL_FORMAT_MPO) == 0) {
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("MPO format selected");
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
99f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            codingMode = CodingMPO;
100c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = TICameraParameters::PIXEL_FORMAT_MPO;
101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) {
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RAW Picture format selected");
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatRawBayer10bit;
104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPictureFormatFromClient = android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
105c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else {
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid format, JPEG format selected as default");
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            codingMode = CodingJPEG;
109c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = NULL;
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
111c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev    } else {
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Picture format is NULL, defaulting to JPEG");
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pixFormat = OMX_COLOR_FormatUnused;
114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        codingMode = CodingJPEG;
115c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        mPictureFormatFromClient = NULL;
116c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev    }
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mRawCapture = false;
120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mYuvCapture = false;
121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    valstr = params.get(TICameraParameters::KEY_CAP_MODE);
123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (!valstr || strcmp(valstr, TICameraParameters::HIGH_QUALITY_MODE) == 0) &&
124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            access(kRawImagesOutputDirPath, F_OK) != -1 ) {
125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mRawCapture = true;
126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mRawCapture && (access(kYuvImagesOutputDirPath, F_OK) != -1)) {
129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        pixFormat = OMX_COLOR_FormatCbYCrY;
130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mYuvCapture = true;
131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
133ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // JPEG capture is not supported in video mode by OMX Camera
134ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // Set capture format to yuv422i...jpeg encode will
135ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // be done on A9
136ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = params.get(TICameraParameters::KEY_CAP_MODE);
137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (valstr && ( strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0 ||
138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                      strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE_HQ) == 0 ) ) &&
139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            (pixFormat == OMX_COLOR_FormatUnused) ) {
140ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGDA("Capturing in video mode...selecting yuv422i");
141ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        pixFormat = OMX_COLOR_FormatCbYCrY;
142ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
143ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (pixFormat != cap->mColorFormat || codingMode != mCodingMode) {
145b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings |= SetFormat;
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        cap->mColorFormat = pixFormat;
147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCodingMode = codingMode;
148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
150a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    str = params.get(TICameraParameters::KEY_TEMP_BRACKETING);
152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( ( str != NULL ) &&
153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         ( strcmp(str, android::CameraParameters::TRUE) == 0 ) ) {
154a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( !mBracketingSet ) {
1569ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            mPendingCaptureSettings |= SetBurstExpBracket;
157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBracketingSet = true;
160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( mBracketingSet ) {
1639ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            mPendingCaptureSettings |= SetBurstExpBracket;
164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBracketingSet = false;
167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (str = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL ) {
170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        parseExpRange(str, mExposureBracketingValues, NULL,
171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                      mExposureGainBracketingModes,
172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                      EXP_BRACKET_RANGE, mExposureBracketingValidEntries);
173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mCapMode == OMXCameraAdapter::CP_CAM) {
174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mExposureBracketMode = OMX_BracketVectorShot;
175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
176f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mExposureBracketMode = OMX_BracketExposureRelativeInEV;
177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1789ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        mPendingCaptureSettings |= SetBurstExpBracket;
179f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else if ( (str = params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE)) != NULL) {
180f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        parseExpRange(str, mExposureBracketingValues, mExposureGainBracketingValues,
181f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                      mExposureGainBracketingModes,
182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                      EXP_BRACKET_RANGE, mExposureBracketingValidEntries);
183f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mCapMode == OMXCameraAdapter::CP_CAM) {
184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mExposureBracketMode = OMX_BracketVectorShot;
185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
186f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mExposureBracketMode = OMX_BracketExposureGainAbsolute;
187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1889ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        mPendingCaptureSettings |= SetBurstExpBracket;
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
1909ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        // always set queued shot config in CPCAM mode
1919ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        if (mCapMode == OMXCameraAdapter::CP_CAM) {
1929ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            mExposureBracketMode = OMX_BracketVectorShot;
1939ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            mPendingCaptureSettings |= SetBurstExpBracket;
1949ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        }
195b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        // if bracketing was previously set...we set again before capturing to clear
196f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mExposureBracketingValidEntries) {
1979ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            mPendingCaptureSettings |= SetBurstExpBracket;
198f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mExposureBracketingValidEntries = 0;
199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
202f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    str = params.get(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE);
203f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != str ) {
204f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        parseExpRange(str, mZoomBracketingValues, NULL, NULL,
205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                      ZOOM_BRACKET_RANGE, mZoomBracketingValidEntries);
206f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCurrentZoomBracketing = 0;
207f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mZoomBracketingEnabled = true;
208f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
209f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mZoomBracketingValidEntries) {
210f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mZoomBracketingValidEntries = 0;
211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mZoomBracketingEnabled = false;
213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
214a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
215a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Flush config queue
217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // If TRUE: Flush queue and abort processing before enqueing
218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    valstr = params.get(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE);
219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != valstr ) {
220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( 0 == strcmp(valstr, android::CameraParameters::TRUE) ) {
221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mFlushShotConfigQueue = true;
222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if ( 0 == strcmp(valstr, android::CameraParameters::FALSE) ) {
223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mFlushShotConfigQueue = false;
224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Missing flush shot config parameter. Will use current (%s)",
226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mFlushShotConfigQueue ? "true" : "false");
227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( params.getInt(android::CameraParameters::KEY_ROTATION) != -1 )
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (params.getInt(android::CameraParameters::KEY_ROTATION) != (int) mPictureRotation) {
233b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetRotation;
234b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mPictureRotation = params.getInt(android::CameraParameters::KEY_ROTATION);
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
239b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mPictureRotation) mPendingCaptureSettings |= SetRotation;
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPictureRotation = 0;
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Rotation set %d", mPictureRotation);
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
245a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Read Sensor Orientation and set it based on perating mode
247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    varint = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( varint != -1 )
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mSensorOrientation = varint;
251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mSensorOrientation == 270 ||mSensorOrientation==90)
252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEA(" Orientation is 270/90. So setting counter rotation to Ducati");
254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mSensorOrientation +=180;
255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mSensorOrientation%=360;
256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
257f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    else
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mSensorOrientation = 0;
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGVB("Sensor Orientation  set : %d", mSensorOrientation);
264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
266f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE
267a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    varint = params.getInt(TICameraParameters::KEY_BURST);
268a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    if ( varint >= 1 )
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (varint != (int) mBurstFrames) {
2719ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            mPendingCaptureSettings |= SetBurstExpBracket;
272b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
273a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mBurstFrames = varint;
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2779ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        if (mBurstFrames != 1) mPendingCaptureSettings |= SetBurstExpBracket;
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBurstFrames = 1;
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Burst Frames set %d", mBurstFrames);
282a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
283a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    varint = params.getInt(android::CameraParameters::KEY_JPEG_QUALITY);
285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( varint >= MIN_JPEG_QUALITY && varint <= MAX_JPEG_QUALITY ) {
286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (varint != mPictureQuality) {
287b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetQuality;
288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPictureQuality = varint;
289b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mPictureQuality != MAX_JPEG_QUALITY) {
292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPendingCaptureSettings |= SetQuality;
293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPictureQuality = MAX_JPEG_QUALITY;
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Quality set %d", mPictureQuality);
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( varint >= 0 ) {
301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (varint != mThumbWidth) {
302b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetThumb;
303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mThumbWidth = varint;
304b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mThumbWidth != DEFAULT_THUMB_WIDTH) {
307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPendingCaptureSettings |= SetThumb;
308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mThumbWidth = DEFAULT_THUMB_WIDTH;
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Thumb width set %d", mThumbWidth);
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
314f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( varint >= 0 ) {
316f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (varint != mThumbHeight) {
317b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetThumb;
318f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mThumbHeight = varint;
319b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
320f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mThumbHeight != DEFAULT_THUMB_HEIGHT) {
322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPendingCaptureSettings |= SetThumb;
323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mThumbHeight = DEFAULT_THUMB_HEIGHT;
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Thumb height set %d", mThumbHeight);
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
330f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( varint >= MIN_JPEG_QUALITY && varint <= MAX_JPEG_QUALITY ) {
331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (varint != mThumbQuality) {
332b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetThumb;
333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mThumbQuality = varint;
334b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mThumbQuality != MAX_JPEG_QUALITY) {
337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPendingCaptureSettings |= SetThumb;
338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mThumbQuality = MAX_JPEG_QUALITY;
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Thumbnail Quality set %d", mThumbQuality);
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
34414b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu    if (mFirstTimeInit) {
34514b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu        mPendingCaptureSettings = ECapturesettingsAll;
34614b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu    }
34714b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu
348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    cap = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoPortIndex];
349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    cap->mWidth = params.getInt(TICameraParameters::RAW_WIDTH);
350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    cap->mHeight = params.getInt(TICameraParameters::RAW_HEIGHT);
351fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
357f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::getPictureBufferSize(CameraFrame &frame, size_t bufferCount)
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *imgCaptureData = NULL;
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
369fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // If any settings have changed that need to be set with SetParam,
371f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // we will need to disable the port to set them
372f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((mPendingCaptureSettings & ECaptureParamSettings)) {
373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            disableImagePort();
374f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( NULL != mReleaseImageBuffersCallback ) {
375f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mReleaseImageBuffersCallback(mReleaseData);
376f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
377f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
378f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
379f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mPendingCaptureSettings & SetFormat) {
380fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            ret = setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *imgCaptureData);
381fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        }
382fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret == NO_ERROR )
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
385f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            frame.mLength = imgCaptureData->mBufSize;
386f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            frame.mWidth = imgCaptureData->mWidth;
387f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            frame.mHeight = imgCaptureData->mHeight;
388f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            frame.mAlignment = imgCaptureData->mStride;
389f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("getPictureBufferSize: width:%u height:%u alignment:%u length:%u",
390f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                         frame.mWidth, frame.mHeight, frame.mAlignment, frame.mLength);
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("setFormat() failed 0x%x", ret);
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint OMXCameraAdapter::getBracketingValueMode(const char *a, const char *b) const
404f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    BracketingValueMode bvm = BracketingValueAbsolute;
406f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
407f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (NULL != b) &&
408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         (NULL != a) &&
409f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         (a < b) &&
410f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         ( (NULL != memchr(a, '+', b - a)) ||
411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons           (NULL != memchr(a, '-', b - a)) ) ) {
412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bvm = BracketingValueRelative;
413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return bvm;
415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
416f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::parseExpRange(const char *rangeStr,
418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         int *expRange,
419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         int *gainRange,
420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         int *expGainModes,
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         size_t count,
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         size_t &validEntries)
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    char *end = NULL;
426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    const char *startPtr = NULL;
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t i = 0;
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL == rangeStr ){
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL == expRange ){
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NO_ERROR == ret ) {
440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        startPtr = rangeStr;
441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        do {
442f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Relative Exposure example: "-30,-10, 0, 10, 30"
443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Absolute Gain ex. (exposure,gain) pairs: "(100,300),(200,300),(400,300),(800,300),(1600,300)"
444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Relative Gain ex. (exposure,gain) pairs: "(-30,+0),(-10, +0),(+0,+0),(+10,+0),(+30,+0)"
445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Forced relative Exposure example: "-30F,-10F, 0F, 10F, 30F"
446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Forced absolute Gain ex. (exposure,gain) pairs: "(100,300)F,(200,300)F,(400,300)F,(800,300)F,(1600,300)F"
447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Forced relative Gain ex. (exposure,gain) pairs: "(-30,+0)F,(-10, +0)F,(+0,+0)F,(+10,+0)F,(+30,+0)F"
448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
449f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // skip '(' and ','
450f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            while ((*startPtr == '(') ||  (*startPtr == ',')) startPtr++;
451f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            expRange[i] = (int)strtol(startPtr, &end, 10);
453f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
454f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (expGainModes) {
455f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                // if gainRange is given rangeStr should be (exposure, gain) pair
456f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if (gainRange) {
457f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    int bvm_exp = getBracketingValueMode(startPtr, end);
458f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    startPtr = end + 1; // for the ','
459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    gainRange[i] = (int)strtol(startPtr, &end, 10);
460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if (BracketingValueAbsolute == bvm_exp) {
462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        expGainModes[i] = getBracketingValueMode(startPtr, end);
463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    } else {
464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        expGainModes[i] = bvm_exp;
465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                } else {
467f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    expGainModes[i] = BracketingValueCompensation;
468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
469f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            startPtr = end;
471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // skip ')'
473f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            while (*startPtr == ')') startPtr++;
474f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
475f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // Check for "forced" key
476f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (expGainModes) {
477f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                while ((*startPtr == 'F') || (*startPtr == 'f')) {
478f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    if ( BracketingValueAbsolute == expGainModes[i] ) {
479f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        expGainModes[i] = BracketingValueAbsoluteForced;
480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    } else if ( BracketingValueRelative == expGainModes[i] ) {
481f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        expGainModes[i] = BracketingValueRelativeForced;
482f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    } else if ( BracketingValueCompensation == expGainModes[i] ) {
483f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        expGainModes[i] = BracketingValueCompensationForced;
484f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    } else {
485f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        CAMHAL_LOGE("Unexpected old mode 0x%x", expGainModes[i]);
486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    }
487f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    startPtr++;
488f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            i++;
492f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
493f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } while ((startPtr[0] != '\0') && (i < count));
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        validEntries = i;
495f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
497f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
498f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
499f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
500f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
501f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
502f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::doExposureBracketing(int *evValues,
503f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 int *evValues2,
504f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 int *evModes2,
505f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 size_t evCount,
506f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 size_t frameCount,
507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 bool flush,
508f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 OMX_BRACKETMODETYPE bracketMode)
509f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
510f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
511f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
512f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
513f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
514f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( OMX_StateInvalid == mComponentState ) {
515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEA("OMX component is in invalid state");
516f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = -EINVAL;
517f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
518f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
519f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL == evValues ) {
520f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEA("Exposure compensation values pointer is invalid");
521f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = -EINVAL;
522f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
523f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
524f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NO_ERROR == ret ) {
525f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (bracketMode == OMX_BracketVectorShot) {
526f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = setVectorShot(evValues, evValues2, evModes2, evCount, frameCount, flush, bracketMode);
527f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
528f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = setExposureBracketing(evValues, evValues2, evCount, frameCount, bracketMode);
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
530f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
537f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setVectorStop(bool toPreview)
538f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
539f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
540f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_ERRORTYPE eError = OMX_ErrorNone;
541f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_CONFIG_VECTSHOTSTOPMETHODTYPE vecShotStop;
542f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
543f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
544f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
545f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
546f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_INIT_STRUCT_PTR(&vecShotStop, OMX_TI_CONFIG_VECTSHOTSTOPMETHODTYPE);
547f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
548f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    vecShotStop.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
549f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (toPreview) {
550f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        vecShotStop.eStopMethod =  OMX_TI_VECTSHOTSTOPMETHOD_GOTO_PREVIEW;
551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
552f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        vecShotStop.eStopMethod =  OMX_TI_VECTSHOTSTOPMETHOD_WAIT_IN_CAPTURE;
553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
554f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
555f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
556f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                           (OMX_INDEXTYPE) OMX_TI_IndexConfigVectShotStopMethod,
557f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                           &vecShotStop);
558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (OMX_ErrorNone != eError) {
559f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEB("Error while configuring bracket shot 0x%x", eError);
560f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
561f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Bracket shot configured successfully");
562f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
563f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
564f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
567f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
568f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::initVectorShot()
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_CAPTUREMODETYPE expCapMode;
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_EXTCAPTUREMODETYPE extExpCapMode;
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NO_ERROR == ret) {
579f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_INIT_STRUCT_PTR (&expCapMode, OMX_CONFIG_CAPTUREMODETYPE);
580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        expCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        expCapMode.bFrameLimited = OMX_FALSE;
583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                OMX_IndexConfigCaptureMode,
586f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                &expCapMode);
587f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (OMX_ErrorNone != eError) {
588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("Error while configuring capture mode 0x%x", eError);
589f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
591f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDA("Camera capture mode configured successfully");
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
593f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
595f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NO_ERROR == ret) {
596f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_INIT_STRUCT_PTR (&extExpCapMode, OMX_CONFIG_EXTCAPTUREMODETYPE);
597f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        extExpCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
598f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
599f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        extExpCapMode.bEnableBracketing = OMX_TRUE;
600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        extExpCapMode.tBracketConfigType.eBracketMode = OMX_BracketVectorShot;
601f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
602f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
603f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                ( OMX_INDEXTYPE ) OMX_IndexConfigExtCaptureMode,
604f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                &extExpCapMode);
605f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( OMX_ErrorNone != eError ) {
606f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("Error while configuring extended capture mode 0x%x", eError);
607f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
608f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
609f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDA("Extended camera capture mode configured successfully");
610f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
611f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
612f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
613f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
614f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NO_ERROR == ret) {
615f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // set vector stop method to stop in capture
616f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = setVectorStop(false);
617f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
618f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
619f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons exit:
620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
621f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
622f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
623f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
625f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setVectorShot(int *evValues,
626f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         int *evValues2,
627f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         int *evModes2,
628f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         size_t evCount,
629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         size_t frameCount,
630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         bool flush,
631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                         OMX_BRACKETMODETYPE bracketMode)
632f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
633f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
634f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_ERRORTYPE eError = OMX_ErrorNone;
635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_CONFIG_ENQUEUESHOTCONFIGS enqueueShotConfigs;
636f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_CONFIG_QUERYAVAILABLESHOTS queryAvailableShots;
637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bool doFlush = flush;
638f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
639f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
640f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
641f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_INIT_STRUCT_PTR(&enqueueShotConfigs, OMX_TI_CONFIG_ENQUEUESHOTCONFIGS);
642f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_INIT_STRUCT_PTR(&queryAvailableShots, OMX_TI_CONFIG_QUERYAVAILABLESHOTS);
643f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
644f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    queryAvailableShots.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
645f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
646f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                (OMX_INDEXTYPE) OMX_TI_IndexConfigQueryAvailableShots,
647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                &queryAvailableShots);
648f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (OMX_ErrorNone != eError) {
649f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("Error getting available shots 0x%x", eError);
650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto exit;
651f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
652f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGD("AVAILABLE SHOTS: %d", queryAvailableShots.nAvailableShots);
653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (queryAvailableShots.nAvailableShots < evCount) {
654f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // TODO(XXX): Need to implement some logic to handle this error
655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Not enough available shots to fulfill this queue request");
656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = -ENOSPC;
657f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
658f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
659f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
660f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
661f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    for ( unsigned int confID = 0; confID < evCount; ) {
662f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        unsigned int i;
663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        for ( i = 0 ; (i < ARRAY_SIZE(enqueueShotConfigs.nShotConfig)) && (confID < evCount); i++, confID++ ) {
664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGD("%2u: (%7d,%4d) mode: %d", confID, evValues[confID], evValues2[confID], evModes2[confID]);
665f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                enqueueShotConfigs.nShotConfig[i].nConfigId = confID;
666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                enqueueShotConfigs.nShotConfig[i].nFrames = 1;
667f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if ( (BracketingValueCompensation == evModes2[confID]) ||
668f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                     (BracketingValueCompensationForced == evModes2[confID]) ) {
669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    // EV compensation
670f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    enqueueShotConfigs.nShotConfig[i].nEC = evValues[confID];
671f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    enqueueShotConfigs.nShotConfig[i].nExp = 0;
672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    enqueueShotConfigs.nShotConfig[i].nGain = 0;
673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                } else {
674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    // exposure,gain pair
675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    enqueueShotConfigs.nShotConfig[i].nEC = 0;
676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    enqueueShotConfigs.nShotConfig[i].nExp = evValues[confID];
677f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    enqueueShotConfigs.nShotConfig[i].nGain = evValues2[confID];
678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                enqueueShotConfigs.nShotConfig[i].eExpGainApplyMethod = OMX_TI_EXPGAINAPPLYMETHOD_ABSOLUTE;
680f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                switch (evModes2[confID]) {
681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    case BracketingValueAbsolute: // (exp,gain) pairs directly program sensor values
682f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    default :
683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        enqueueShotConfigs.nShotConfig[i].eExpGainApplyMethod = OMX_TI_EXPGAINAPPLYMETHOD_ABSOLUTE;
684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        break;
685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    case BracketingValueRelative: // (exp,gain) pairs relative to AE settings and constraints
686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    case BracketingValueCompensation: // EV compensation relative to AE settings and constraints
687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        enqueueShotConfigs.nShotConfig[i].eExpGainApplyMethod = OMX_TI_EXPGAINAPPLYMETHOD_RELATIVE;
688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        break;
689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    case BracketingValueAbsoluteForced: // (exp,gain) pairs directly program sensor values
690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        // are forced over constraints due to flicker, etc.
691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        enqueueShotConfigs.nShotConfig[i].eExpGainApplyMethod = OMX_TI_EXPGAINAPPLYMETHOD_FORCE_ABSOLUTE;
692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        break;
693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    case BracketingValueRelativeForced: // (exp, gain) pairs relative to AE settings AND settings
694f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    case BracketingValueCompensationForced: // EV compensation relative to AE settings and constraints
695f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        // are forced over constraints due to flicker, etc.
696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        enqueueShotConfigs.nShotConfig[i].eExpGainApplyMethod = OMX_TI_EXPGAINAPPLYMETHOD_FORCE_RELATIVE;
697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        break;
698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                enqueueShotConfigs.nShotConfig[i].bNoSnapshot = OMX_FALSE; // TODO: Make this configurable
700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Repeat last exposure and again
703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((confID == evCount) && (evCount > 0) && (frameCount > evCount) && (0 != i)) {
704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            enqueueShotConfigs.nShotConfig[i-1].nFrames = frameCount - evCount;
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        enqueueShotConfigs.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        enqueueShotConfigs.bFlushQueue = doFlush ? OMX_TRUE : OMX_FALSE;
709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        enqueueShotConfigs.nNumConfigs = i;
710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        ( OMX_INDEXTYPE ) OMX_TI_IndexConfigEnqueueShotConfigs,
712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            &enqueueShotConfigs);
713f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( OMX_ErrorNone != eError ) {
7149ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            CAMHAL_LOGEB("Error while configuring enqueue shot 0x%x", eError);
715f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto exit;
716f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
7179ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            CAMHAL_LOGDA("Enqueue shot configured successfully");
718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
719f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Flush only first time
720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        doFlush = false;
721f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
722f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
7239ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov    // Handle burst capture (no any bracketing) case
7249ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov    if (0 == evCount) {
7259ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        CAMHAL_LOGE("Handle burst capture (no any bracketing) case");
7269ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nShotConfig[0].nConfigId = 0;
7279ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nShotConfig[0].nFrames = frameCount;
7289ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nShotConfig[0].nEC = 0;
7299ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nShotConfig[0].nExp = 0;
7309ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nShotConfig[0].nGain = 0;
7319ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nShotConfig[0].eExpGainApplyMethod = OMX_TI_EXPGAINAPPLYMETHOD_RELATIVE;
7329ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nShotConfig[0].bNoSnapshot = OMX_FALSE; // TODO: Make this configurable
7339ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nNumConfigs = 1;
7349ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
7359ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        enqueueShotConfigs.bFlushQueue = doFlush ? OMX_TRUE : OMX_FALSE;
7369ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
7379ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov                        ( OMX_INDEXTYPE ) OMX_TI_IndexConfigEnqueueShotConfigs,
7389ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov                            &enqueueShotConfigs);
7399ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        if ( OMX_ErrorNone != eError ) {
7409ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            CAMHAL_LOGEB("Error while configuring enqueue shot 0x%x", eError);
7419ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            goto exit;
7429ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        } else {
7439ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            CAMHAL_LOGDA("Enqueue shot configured successfully");
7449ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        }
7459ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov    }
7469ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov
747f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons exit:
748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
749f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
750f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
751f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
752f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
753f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setExposureBracketing(int *evValues,
754f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 int *evValues2,
755f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 size_t evCount,
756f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 size_t frameCount,
757f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                 OMX_BRACKETMODETYPE bracketMode)
758f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
759f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
760f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_ERRORTYPE eError = OMX_ErrorNone;
761f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_CONFIG_CAPTUREMODETYPE expCapMode;
762f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_CONFIG_EXTCAPTUREMODETYPE extExpCapMode;
763f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
764f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME;
765f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&expCapMode, OMX_CONFIG_CAPTUREMODETYPE);
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        expCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// If frameCount>0 but evCount<=0, then this is the case of HQ burst.
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Otherwise, it is normal HQ capture
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///If frameCount>0 and evCount>0 then this is the cause of HQ Exposure bracketing.
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == evCount && 0 == frameCount )
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.bFrameLimited = OMX_FALSE;
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.bFrameLimited = OMX_TRUE;
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.nFrameLimit = frameCount;
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_IndexConfigCaptureMode,
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &expCapMode);
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while configuring capture mode 0x%x", eError);
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Camera capture mode configured successfully");
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&extExpCapMode, OMX_CONFIG_EXTCAPTUREMODETYPE);
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        extExpCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == evCount )
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.bEnableBracketing = OMX_FALSE;
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.bEnableBracketing = OMX_TRUE;
809f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            extExpCapMode.tBracketConfigType.eBracketMode = bracketMode;
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.tBracketConfigType.nNbrBracketingValues = evCount - 1;
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < evCount ; i++ )
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
815f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (bracketMode == OMX_BracketExposureGainAbsolute) {
816f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                extExpCapMode.tBracketConfigType.nBracketValues[i]  =  evValues[i];
817f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                extExpCapMode.tBracketConfigType.nBracketValues2[i]  =  evValues2[i];
818f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
819f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                // assuming OMX_BracketExposureRelativeInEV
820f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                extExpCapMode.tBracketConfigType.nBracketValues[i]  =  ( evValues[i] * ( 1 << Q16_OFFSET ) )  / 10;
821f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                ( OMX_INDEXTYPE ) OMX_IndexConfigExtCaptureMode,
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &extExpCapMode);
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while configuring extended capture mode 0x%x", eError);
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Extended camera capture mode configured successfully");
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setShutterCallback(bool enabled)
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_CALLBACKREQUESTTYPE shutterRequstCallback;
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component not in executing state");
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -1;
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&shutterRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE);
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        shutterRequstCallback.nPortIndex = OMX_ALL;
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( enabled )
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.bEnable = OMX_TRUE;
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.nIndex = ( OMX_INDEXTYPE ) OMX_TI_IndexConfigShutterCallback;
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Enabling shutter callback");
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.bEnable = OMX_FALSE;
871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.nIndex = ( OMX_INDEXTYPE ) OMX_TI_IndexConfigShutterCallback;
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Disabling shutter callback");
873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                ( OMX_INDEXTYPE ) OMX_IndexConfigCallbackRequest,
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &shutterRequstCallback);
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error registering shutter callback 0x%x", eError);
881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Shutter callback for index 0x%x registered successfully",
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         OMX_TI_IndexConfigShutterCallback);
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doBracketing(OMX_BUFFERHEADERTYPE *pBuffHeader,
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        CameraFrame::FrameType typeOfFrame)
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentBufferIdx, nextBufferIdx;
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
914f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CameraBuffer *buffer = (CameraBuffer *)pBuffHeader->pAppPrivate;
915f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        currentBufferIdx = buffer->index;
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( currentBufferIdx >= imgCaptureData->mNumBufs)
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid bracketing buffer index 0x%x", currentBufferIdx);
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueued[currentBufferIdx] = false;
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueuedCount--;
928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 >= mBracketingBuffersQueuedCount )
930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            nextBufferIdx = ( currentBufferIdx + 1 ) % imgCaptureData->mNumBufs;
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueued[nextBufferIdx] = true;
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueuedCount++;
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLastBracetingBufferIdx = nextBufferIdx;
935f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            setFrameRefCount((CameraBuffer *)imgCaptureData->mBufferHeader[nextBufferIdx]->pAppPrivate, typeOfFrame, 1);
936f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            returnFrame((CameraBuffer *)imgCaptureData->mBufferHeader[nextBufferIdx]->pAppPrivate, typeOfFrame);
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
945f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::sendBracketFrames(size_t &framesSent)
946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentBufferIdx;
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
954f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    framesSent = 0;
955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        currentBufferIdx = mLastBracetingBufferIdx;
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        do
967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            currentBufferIdx++;
969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            currentBufferIdx %= imgCaptureData->mNumBufs;
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (!mBracketingBuffersQueued[currentBufferIdx] )
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CameraFrame cameraFrame;
97388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                sendCallBacks(cameraFrame,
97488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                              imgCaptureData->mBufferHeader[currentBufferIdx],
97588006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                              imgCaptureData->mImageType,
97688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                              imgCaptureData);
977f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                framesSent++;
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } while ( currentBufferIdx != mLastBracetingBufferIdx );
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::startBracketing(int range)
989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1004f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mBracketingLock);
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( mBracketingEnabled )
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 == imgCaptureData->mNumBufs )
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Image capture buffers set to %d", imgCaptureData->mNumBufs);
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mPending3Asettings )
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        apply3Asettings(mParameters3A);
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1023f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mBracketingLock);
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingRange = range;
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueued = new bool[imgCaptureData->mNumBufs];
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mBracketingBuffersQueued )
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to allocate bracketing management structures");
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueuedCount = imgCaptureData->mNumBufs;
1036f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mBurstFramesAccum = imgCaptureData->mNumBufs;
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLastBracetingBufferIdx = mBracketingBuffersQueuedCount - 1;
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            for ( int i = 0 ; i  < imgCaptureData->mNumBufs ; i++ )
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingBuffersQueued[i] = true;
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1049f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CachedCaptureParameters* cap_params = cacheCaptureParameters();
1050f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = startImageCapture(true, cap_params);
1051f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        delete cap_params;
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1053f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            android::AutoMutex lock(mBracketingLock);
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingEnabled = true;
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingEnabled = false;
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopBracketing()
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  status_t ret = NO_ERROR;
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1077f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = stopImageCapture();
1078f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1079f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mBracketingLock);
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
108188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    if ( NULL != mBracketingBuffersQueued )
108288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    {
108388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        delete [] mBracketingBuffersQueued;
108488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    }
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
108688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mBracketingBuffersQueued = NULL;
108788006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mBracketingEnabled = false;
108888006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mBracketingBuffersQueuedCount = 0;
108988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mLastBracetingBufferIdx = 0;
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1096f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::startImageCapture(bool bracketing, CachedCaptureParameters* capParams)
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * capData = NULL;
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_BOOLEANTYPE bOMX;
1102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    size_t bracketingSent = 0;
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mImageCaptureLock);
1107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCaptureConfigured)
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Image capture was cancelled before we could start
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mStartCaptureSem.Count() )
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mStartCaptureSem semaphore count %d", mStartCaptureSem.Count());
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( !bracketing ) {
1121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ((getNextState() & (CAPTURE_ACTIVE|BRACKETING_ACTIVE)) == 0) {
1122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDA("trying starting capture when already canceled");
1123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            return NO_ERROR;
1124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!capParams) {
1128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("Invalid cached parameters sent!");
1129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return BAD_VALUE;
11303ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman    }
11313ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman
1132aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // Camera framework doesn't expect face callbacks once capture is triggered
1133aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    pauseFaceDetection(true);
1134aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //During bracketing image capture is already active
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mBracketingLock);
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mBracketingEnabled )
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop bracketing, activate normal burst for the remaining images
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingEnabled = false;
1142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = sendBracketFrames(bracketingSent);
1143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Check if we accumulated enough buffers
1145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( bracketingSent < ( mBracketingRange - 1 ) )
1146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mCapturedFrames = mBracketingRange + ( ( mBracketingRange - 1 ) - bracketingSent );
1148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        else
1150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mCapturedFrames = mBracketingRange;
1152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBurstFramesQueued = 0;
1154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mBurstFramesAccum = mCapturedFrames;
1155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1156b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman        if(ret != NO_ERROR)
1157b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman            goto EXIT;
1158b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman        else
1159b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman            return ret;
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1163b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    if ( NO_ERROR == ret ) {
1164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (capParams->mPendingCaptureSettings & SetRotation) {
1165b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings &= ~SetRotation;
1166b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            ret = setPictureRotation(mPictureRotation);
1167b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            if ( NO_ERROR != ret ) {
1168b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu                CAMHAL_LOGEB("Error configuring image rotation %x", ret);
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
11729ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov        if (capParams->mPendingCaptureSettings & SetBurstExpBracket) {
11739ea65b3dc3b1728a812ff8f0b2cddf4b039f123eVladimir Petrov            mPendingCaptureSettings &= ~SetBurstExpBracket;
1174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( mBracketingSet ) {
1175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = doExposureBracketing(capParams->mExposureBracketingValues,
1176f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            capParams->mExposureGainBracketingValues,
1177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            capParams->mExposureGainBracketingModes,
1178f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            0,
1179f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            0,
1180f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            capParams->mFlushShotConfigQueue,
1181f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                            capParams->mExposureBracketMode);
1182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
1183f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                ret = doExposureBracketing(capParams->mExposureBracketingValues,
1184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    capParams->mExposureGainBracketingValues,
1185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    capParams->mExposureGainBracketingModes,
1186f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    capParams->mExposureBracketingValidEntries,
1187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    capParams->mBurstFrames,
1188f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    capParams->mFlushShotConfigQueue,
1189f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    capParams->mExposureBracketMode);
1190f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1191f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1192f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( ret != NO_ERROR ) {
1193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("setExposureBracketing() failed %d", ret);
1194f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                goto EXIT;
1195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1196f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1197ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    }
1198ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu
1199d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1200d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev            CameraHal::PPM("startImageCapture bracketing configs done: ", &mStartCapture);
1201d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
1202d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1203f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    capData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //OMX shutter callback events are only available in hq mode
1206f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode)) {
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_ALL,
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_TI_IndexConfigShutterCallback,
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        mStartCaptureSem);
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = setShutterCallback(true);
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mPending3Asettings) {
1224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        apply3Asettings(mParameters3A);
1225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
122760c916ae7e31dbff92c1c39385a87cf216fc34d9Tyler Luu    if (ret == NO_ERROR) {
1228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int index = 0;
1229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int queued = 0;
1230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mBurstLock);
1231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (capParams->mFlushShotConfigQueue) {
1233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // reset shot queue
1234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mCapturedFrames = mBurstFrames;
1235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mBurstFramesAccum = mBurstFrames;
1236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mBurstFramesQueued = 0;
1237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            for ( int index = 0 ; index < capData->mNumBufs ; index++ ) {
1238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                if (OMXCameraPortParameters::FILL == capData->mStatus[index]) {
1239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                    mBurstFramesQueued++;
1240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                }
1241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
124295395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev        } else {
124395395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev            mCapturedFrames += mBurstFrames;
124495395c7d9370323c8c536ab36052715ed9ff06f6Emilian Peev            mBurstFramesAccum += mBurstFrames;
1245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
124687b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu        CAMHAL_LOGD("mBurstFramesQueued = %d mBurstFramesAccum = %d index = %d "
124787b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu                    "capData->mNumBufs = %d queued = %d capData->mMaxQueueable = %d",
124887b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu                    mBurstFramesQueued,mBurstFramesAccum,index,
124987b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu                    capData->mNumBufs,queued,capData->mMaxQueueable);
125087b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu        CAMHAL_LOGD("%d", (mBurstFramesQueued < mBurstFramesAccum)
125187b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu                          && (index < capData->mNumBufs)
125287b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu                          && (queued < capData->mMaxQueueable));
1253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        while ((mBurstFramesQueued < mBurstFramesAccum) &&
1254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons               (index < capData->mNumBufs) &&
1255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons               (queued < capData->mMaxQueueable)) {
1256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (capData->mStatus[index] == OMXCameraPortParameters::IDLE) {
1257f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Queuing buffer on Capture port - %p",
1258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                             capData->mBufferHeader[index]->pBuffer);
1259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                capData->mStatus[index] = OMXCameraPortParameters::FILL;
1260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                eError = OMX_FillThisBuffer(mCameraAdapterParameters.mHandleComp,
1261f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            (OMX_BUFFERHEADERTYPE*)capData->mBufferHeader[index]);
1262f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mBurstFramesQueued++;
1264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                queued++;
1265f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else if (OMXCameraPortParameters::FILL == capData->mStatus[index]) {
126687b9b837adecda80c89d6184cfaa085e8dbbc4d6Tyler Luu               CAMHAL_LOGE("Not queueing index = %d", index);
1267f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                queued++;
1268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            index++;
1270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
1273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mRawCapture) {
1274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            capData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoPortIndex];
1275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ///Queue all the buffers on capture port
1277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            for ( int index = 0 ; index < capData->mNumBufs ; index++ ) {
1278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Queuing buffer on Video port (for RAW capture) - 0x%x", ( unsigned int ) capData->mBufferHeader[index]->pBuffer);
1279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                capData->mStatus[index] = OMXCameraPortParameters::FILL;
1280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                eError = OMX_FillThisBuffer(mCameraAdapterParameters.mHandleComp,
1281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        (OMX_BUFFERHEADERTYPE*)capData->mBufferHeader[index]);
1282f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mWaitingForSnapshot = true;
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCaptureSignalled = false;
1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1291ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // Capturing command is not needed when capturing in video mode
1292ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // Only need to queue buffers on image ports
1293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( ( mCapMode != VIDEO_MODE ) && ( mCapMode != VIDEO_MODE_HQ ) ) {
1294ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE);
1295ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            bOMX.bEnabled = OMX_TRUE;
1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1297ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            /// sending Capturing Command to the component
1298ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1299ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                   OMX_IndexConfigCapturing,
1300ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                   &bOMX);
1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1302ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            CAMHAL_LOGDB("Capture set - 0x%x", eError);
1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1304ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1306ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1308d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1309d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev            CameraHal::PPM("startImageCapture image buffers queued and capture enabled: ", &mStartCapture);
1310d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
1311d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //OMX shutter callback events are only available in hq mode
1313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode))
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mStartCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
13217a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng        //If something bad happened while we wait
13227a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng        if (mComponentState != OMX_StateExecuting)
13236b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng          {
13246b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            CAMHAL_LOGEA("Invalid State after Image Capture Exitting!!!");
13256b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            goto EXIT;
13266b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng          }
13276b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Shutter callback received");
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            notifyShutterSubscribers();
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
13359b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng            ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               OMX_ALL,
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               OMX_TI_IndexConfigShutterCallback,
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               NULL);
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Timeout expired on shutter callback");
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto EXIT;
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1346d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1347d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev            CameraHal::PPM("startImageCapture shutter event received: ", &mStartCapture);
1348d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
1349d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1352b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar RamanEXIT:
1353b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
1354b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    mWaitingForSnapshot = false;
1355b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    mCaptureSignalled = false;
1356b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    performCleanupAfterError();
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1358f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopImageCapture()
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1364b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    OMX_ERRORTYPE eError = OMX_ErrorNone;
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_BOOLEANTYPE bOMX;
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *imgCaptureData = NULL;
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(mImageCaptureLock);
1371f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mCaptureConfigured) {
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Capture is not ongoing, return from here
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mStopCaptureSem.Count() ) {
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mStopCaptureSem semaphore count %d", mStopCaptureSem.Count());
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1382f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // TODO(XXX): Reprocessing is currently piggy-backing capture commands
1383f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mAdapterState == REPROCESS_STATE) {
1384f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = stopReprocess();
1385f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1386f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Disable the callback first
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mWaitingForSnapshot = false;
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1390fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // OMX shutter callback events are only available in hq mode
1391fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if ((HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode)) {
1392fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        //Disable the callback first
1393fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        ret = setShutterCallback(false);
1394fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
1395fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        // if anybody is waiting on the shutter callback
1396fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        // signal them and then recreate the semaphore
1397fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        if ( 0 != mStartCaptureSem.Count() ) {
13983ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman
13993ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman            for (int i = mStartCaptureSem.Count(); i < 0; i++) {
14003ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman            ret |= SignalEvent(mCameraAdapterParameters.mHandleComp,
14013ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
14023ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               OMX_ALL,
14033ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               OMX_TI_IndexConfigShutterCallback,
14043ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               NULL );
1405fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            }
1406fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            mStartCaptureSem.Create(0);
1407470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu        }
1408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else if (CP_CAM == mCapMode) {
1409f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Reset shot config queue
1410f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_TI_CONFIG_ENQUEUESHOTCONFIGS resetShotConfigs;
1411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_INIT_STRUCT_PTR(&resetShotConfigs, OMX_TI_CONFIG_ENQUEUESHOTCONFIGS);
1412470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu
1413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        resetShotConfigs.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
1414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        resetShotConfigs.bFlushQueue = OMX_TRUE;
1415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        resetShotConfigs.nNumConfigs = 0;
1416f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1417f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        ( OMX_INDEXTYPE ) OMX_TI_IndexConfigEnqueueShotConfigs,
1418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                            &resetShotConfigs);
1419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( OMX_ErrorNone != eError ) {
1420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("Error while reset shot config 0x%x", eError);
1421f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto EXIT;
1422f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
1423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDA("Shot config reset successfully");
1424f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1426aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait here for the capture to be done, in worst case timeout and proceed with cleanup
1428fc8ab094473901857ee382396eebc5d52ac4c6c6Tyler Luu    mCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
14296b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
14306b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
14316b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
14326b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
14336b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State Image Capture Stop Exitting!!!");
14346b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
14356b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
14366b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1437fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // Disable image capture
1438fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // Capturing command is not needed when capturing in video mode
1439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( ( mCapMode != VIDEO_MODE ) && ( mCapMode != VIDEO_MODE_HQ ) ) {
1440fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE);
1441fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        bOMX.bEnabled = OMX_FALSE;
1442fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
1443fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1444fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu                               OMX_IndexConfigCapturing,
1445fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu                               &bOMX);
1446fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        if ( OMX_ErrorNone != eError ) {
1447fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            CAMHAL_LOGDB("Error during SetConfig- 0x%x", eError);
1448fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            ret = -1;
1449fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            goto EXIT;
1450fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        }
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1452ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Capture set - 0x%x", eError);
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureSignalled = true; //set this to true if we exited because of timeout
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1457fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    {
1458f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mFrameCountMutex);
1459fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFrameCount = 0;
1460fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFirstFrameCondition.broadcast();
1461fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    }
1462fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
1463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Stop is always signalled externally in CPCAM mode
1464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // We need to make sure we really stop
1465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ((mCapMode == CP_CAM)) {
1466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        disableReprocess();
1467f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        disableImagePort();
1468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( NULL != mReleaseImageBuffersCallback ) {
1469f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mReleaseImageBuffersCallback(mReleaseData);
1470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1473f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Moving code for below commit here as an optimization for continuous capture,
1474f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // so focus settings don't have to reapplied after each capture
1475f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // c78fa2a CameraHAL: Always reset focus mode after capture
1476f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Workaround when doing many consecutive shots, CAF wasn't getting restarted.
1477f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPending3Asettings |= SetFocus;
1478f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1479f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mCapturedFrames = 0;
1480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mBurstFramesAccum = 0;
1481f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mBurstFramesQueued = 0;
1482f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1483f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
1484fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
1485fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler LuuEXIT:
1486fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
1487fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    //Release image buffers
1488fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if ( NULL != mReleaseImageBuffersCallback ) {
1489fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        mReleaseImageBuffersCallback(mReleaseData);
1490fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1491fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
1492fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    {
1493f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        android::AutoMutex lock(mFrameCountMutex);
1494fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFrameCount = 0;
1495fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFirstFrameCondition.broadcast();
1496fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    }
1497fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
1498fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    performCleanupAfterError();
1499fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    LOG_FUNCTION_NAME_EXIT;
1500f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
1501fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu}
1502fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
1503fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luustatus_t OMXCameraAdapter::disableImagePort(){
1504fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    status_t ret = NO_ERROR;
1505fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    OMX_ERRORTYPE eError = OMX_ErrorNone;
1506fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    OMXCameraPortParameters *imgCaptureData = NULL;
1507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMXCameraPortParameters *imgRawCaptureData = NULL;
1508fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
1509fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (!mCaptureConfigured) {
1510fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        return NO_ERROR;
1511fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1512fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureConfigured = false;
1514fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
1515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    imgRawCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoPortIndex]; // for RAW capture
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Register for Image port Disable event
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_EventCmdComplete,
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_CommandPortDisable,
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mCameraAdapterParameters.mImagePortIndex,
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mStopCaptureSem);
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Disable Capture Port
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_CommandPortDisable,
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mCameraAdapterParameters.mImagePortIndex,
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                NULL);
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Free all the buffers on capture port
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (imgCaptureData) {
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Freeing buffer on Capture port - %d", imgCaptureData->mNumBufs);
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( int index = 0 ; index < imgCaptureData->mNumBufs ; index++) {
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Freeing buffer on Capture port - 0x%x",
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         ( unsigned int ) imgCaptureData->mBufferHeader[index]->pBuffer);
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            eError = OMX_FreeBuffer(mCameraAdapterParameters.mHandleComp,
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    mCameraAdapterParameters.mImagePortIndex,
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    (OMX_BUFFERHEADERTYPE*)imgCaptureData->mBufferHeader[index]);
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Waiting for port disable");
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait for the image port enable event
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mStopCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
15456b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
15466b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
15476b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
15486b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
15496b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State after Disable Image Port Exitting!!!");
15506b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
15516b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
15526b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret ) {
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Port disabled");
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
15569b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng        ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_EventCmdComplete,
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_CommandPortDisable,
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mCameraAdapterParameters.mImagePortIndex,
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           NULL);
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Timeout expired on port disable");
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    deinitInternalBuffers(mCameraAdapterParameters.mImagePortIndex);
1566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1567f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // since port settings are not persistent after port is disabled...
1568f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mPendingCaptureSettings |= SetFormat;
1569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
1571f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1572f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mRawCapture) {
1573f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ///Register for Video port Disable event
1574f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1575f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                OMX_EventCmdComplete,
1576f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                OMX_CommandPortDisable,
1577f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mCameraAdapterParameters.mVideoPortIndex,
1578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mStopCaptureSem);
1579f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ///Disable RawCapture Port
1580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
1581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                OMX_CommandPortDisable,
1582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mCameraAdapterParameters.mVideoPortIndex,
1583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                NULL);
1584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1586f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1587f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ///Free all the buffers on RawCapture port
1588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (imgRawCaptureData) {
1589f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("Freeing buffer on Capture port - %d", imgRawCaptureData->mNumBufs);
1590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            for ( int index = 0 ; index < imgRawCaptureData->mNumBufs ; index++) {
1591f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGDB("Freeing buffer on Capture port - 0x%x", ( unsigned int ) imgRawCaptureData->mBufferHeader[index]->pBuffer);
1592f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                eError = OMX_FreeBuffer(mCameraAdapterParameters.mHandleComp,
1593f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        mCameraAdapterParameters.mVideoPortIndex,
1594f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                        (OMX_BUFFERHEADERTYPE*)imgRawCaptureData->mBufferHeader[index]);
1595f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1596f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1597f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1598f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1599f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Waiting for Video port disable");
1600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        //Wait for the image port enable event
1601f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mStopCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
1602f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Video Port disabled");
1603f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1604f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1605f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1606f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsEXIT:
1607f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
1608f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
1609f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1610f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::initInternalBuffers(OMX_U32 portIndex)
1611f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
1612f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_ERRORTYPE eError = OMX_ErrorNone;
1613f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int index = 0;
1614f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_PARAM_USEBUFFERDESCRIPTOR bufferdesc;
1615f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1616f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    /* Indicate to Ducati that we're planning to use dynamically-mapped buffers */
1617f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_INIT_STRUCT_PTR (&bufferdesc, OMX_TI_PARAM_USEBUFFERDESCRIPTOR);
1618f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferdesc.nPortIndex = portIndex;
1619f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferdesc.bEnabled = OMX_FALSE;
1620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferdesc.eBufferType = OMX_TI_BufferTypePhysicalPageList;
1621f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1622f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp,
1623f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            (OMX_INDEXTYPE) OMX_TI_IndexUseBufferDescriptor,
1624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            &bufferdesc);
1625f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (eError!=OMX_ErrorNone) {
1626f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEB("OMX_SetParameter - %x", eError);
1627f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return -EINVAL;
1628f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDA("Initializing internal buffers");
1631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    do {
1632f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_TI_PARAM_COMPONENTBUFALLOCTYPE bufferalloc;
1633f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_TI_PARAM_COMPONENTBUFALLOCTYPE bufferallocset;
1634f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_INIT_STRUCT_PTR (&bufferalloc, OMX_TI_PARAM_COMPONENTBUFALLOCTYPE);
1635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferalloc.nPortIndex = portIndex;
1636f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferalloc.nIndex = index;
1637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1638f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError = OMX_GetParameter (mCameraAdapterParameters.mHandleComp,
1639f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                (OMX_INDEXTYPE)OMX_TI_IndexParamComponentBufferAllocation,
1640f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                &bufferalloc);
1641f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (eError == OMX_ErrorNoMore) {
1642f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            return NO_ERROR;
1643f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1644f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (eError != OMX_ErrorNone) {
1645f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("GetParameter failed error = 0x%x", eError);
1646f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            break;
1647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1648f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1649f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("Requesting buftype %d of size %dx%d",
1650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            (int)bufferalloc.eBufType, (int)bufferalloc.nAllocWidth,
1651f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            (int)bufferalloc.nAllocLines);
1652f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferalloc.eBufType = OMX_TI_BufferTypeHardwareReserved1D;
1654f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_INIT_STRUCT_PTR (&bufferallocset, OMX_TI_PARAM_COMPONENTBUFALLOCTYPE);
1656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferallocset.nPortIndex = portIndex;
1657f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferallocset.nIndex = index;
1658f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferallocset.eBufType = OMX_TI_BufferTypeHardwareReserved1D;
1659f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferallocset.nAllocWidth = bufferalloc.nAllocWidth;
1660f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufferallocset.nAllocLines = bufferalloc.nAllocLines;
1661f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1662f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError = OMX_SetParameter (mCameraAdapterParameters.mHandleComp,
1663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                (OMX_INDEXTYPE)OMX_TI_IndexParamComponentBufferAllocation,
1664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                &bufferallocset);
1665f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (eError != OMX_ErrorNone) {
1666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("SetParameter failed, error=%08x", eError);
1667f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (eError == OMX_ErrorNoMore) return NO_ERROR;
1668f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            break;
1669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1670f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1671f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        index++;
1672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        /* 1 is an arbitrary limit */
1674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } while (index < 1);
1675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGV("Ducati requested too many (>1) internal buffers");
1677f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return -EINVAL;
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::deinitInternalBuffers(OMX_U32 portIndex)
1682f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
1683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_ERRORTYPE eError = OMX_ErrorNone;
1684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_PARAM_USEBUFFERDESCRIPTOR bufferdesc;
1685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_INIT_STRUCT_PTR (&bufferdesc, OMX_TI_PARAM_USEBUFFERDESCRIPTOR);
1687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferdesc.nPortIndex = portIndex;
1688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferdesc.bEnabled = OMX_FALSE;
1689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferdesc.eBufferType = OMX_TI_BufferTypeDefault;
1690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp,
1692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            (OMX_INDEXTYPE) OMX_TI_IndexUseBufferDescriptor,
1693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            &bufferdesc);
1694f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (eError!=OMX_ErrorNone) {
1695f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEB("OMX_SetParameter - %x", eError);
1696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return -EINVAL;
1697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1698b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman
1699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_PARAM_COMPONENTBUFALLOCTYPE bufferalloc;
1700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_INIT_STRUCT_PTR (&bufferalloc, OMX_TI_PARAM_COMPONENTBUFALLOCTYPE);
1701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferalloc.nPortIndex = portIndex;
1702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferalloc.eBufType = OMX_TI_BufferTypeDefault;
1703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferalloc.nAllocWidth = 1;
1704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    bufferalloc.nAllocLines = 1;
1705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp,
1706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            (OMX_INDEXTYPE) OMX_TI_IndexParamComponentBufferAllocation,
1707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            &bufferalloc);
1708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (eError!=OMX_ErrorNone) {
1709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEB("OMX_SetParameter - %x", eError);
1710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return -EINVAL;
1711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1713f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return Utils::ErrorUtils::omxToAndroidError(eError);
1714f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
1715f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1716f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::UseBuffersCapture(CameraBuffer * bufArr, int num)
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1721b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    OMX_ERRORTYPE eError = OMX_ErrorNone;
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters cap;
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mUseCaptureSem.Count() )
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mUseCaptureSem semaphore count %d", mUseCaptureSem.Count());
1730b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman        return BAD_VALUE;
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1733f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_ASSERT(num > 0);
1734d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman
1735f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // if some setting that requires a SetParameter (including
1736f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // changing buffer types) then we need to disable the port
1737f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // before being allowed to apply the settings
1738f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ((mPendingCaptureSettings & ECaptureParamSettings) ||
1739f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            bufArr[0].type != imgCaptureData->mBufferType ||
1740f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            imgCaptureData->mNumBufs != num) {
1741f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mCaptureConfigured) {
1742f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            disableImagePort();
1743f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( NULL != mReleaseImageBuffersCallback ) {
1744f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mReleaseImageBuffersCallback(mReleaseData);
1745d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman            }
1746f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1747d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman
1748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        imgCaptureData->mBufferType = bufArr[0].type;
1749f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        imgCaptureData->mNumBufs = num;
1750fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
1751f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("Params Width = %d", (int)imgCaptureData->mWidth);
1752f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("Params Height = %d", (int)imgCaptureData->mHeight);
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1754f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mPendingCaptureSettings & SetFormat) {
1755f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPendingCaptureSettings &= ~SetFormat;
1756f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *imgCaptureData);
1757f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( ret != NO_ERROR ) {
1758f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("setFormat() failed %d", ret);
1759f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                LOG_FUNCTION_NAME_EXIT;
1760f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return ret;
1761f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1762f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1764f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mPendingCaptureSettings & SetThumb) {
1765f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPendingCaptureSettings &= ~SetThumb;
1766f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = setThumbnailParams(mThumbWidth, mThumbHeight, mThumbQuality);
1767f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( NO_ERROR != ret) {
1768f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("Error configuring thumbnail size %x", ret);
1769f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                return ret;
1770f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1771f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1773f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mPendingCaptureSettings & SetQuality) {
1774f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mPendingCaptureSettings &= ~SetQuality;
1775f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = setImageQuality(mPictureQuality);
1776f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if ( NO_ERROR != ret) {
1777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("Error configuring image quality %x", ret);
1778f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                goto EXIT;
1779f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1782f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Configure DOMX to use either gralloc handles or vptrs
1783f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        {
1784f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            OMX_TI_PARAMUSENATIVEBUFFER domxUseGrallocHandles;
1785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            OMX_INIT_STRUCT_PTR (&domxUseGrallocHandles, OMX_TI_PARAMUSENATIVEBUFFER);
1786f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1787f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            domxUseGrallocHandles.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
1788f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (bufArr[0].type == CAMERA_BUFFER_ANW) {
1789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGD ("Using ANW Buffers");
1790f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                initInternalBuffers(mCameraAdapterParameters.mImagePortIndex);
1791f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                domxUseGrallocHandles.bEnable = OMX_TRUE;
1792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            } else {
1793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGD ("Using ION Buffers");
1794f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                domxUseGrallocHandles.bEnable = OMX_FALSE;
1795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1796f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp,
1798f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                    (OMX_INDEXTYPE)OMX_TI_IndexUseNativeBuffers, &domxUseGrallocHandles);
1799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (eError!=OMX_ErrorNone) {
1800f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                CAMHAL_LOGEB("OMX_SetParameter - %x", eError);
1801f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1802f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1805d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1806d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1807d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Takepicture image port configuration: ", &bufArr->ppmStamp);
1808d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1809d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
1810d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1811f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Register for Image port ENABLE event
1812f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1813f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               OMX_EventCmdComplete,
1814f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               OMX_CommandPortEnable,
1815f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               mCameraAdapterParameters.mImagePortIndex,
1816f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               mUseCaptureSem);
1817f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1818f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Enable Capture Port
1819f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
1820f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                 OMX_CommandPortEnable,
1821f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                 mCameraAdapterParameters.mImagePortIndex,
1822f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                 NULL);
1823f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1824f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("OMX_UseBuffer = 0x%x", eError);
1825f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError);
1826f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1827f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        for (int index = 0 ; index < imgCaptureData->mNumBufs ; index++) {
1828f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            OMX_BUFFERHEADERTYPE *pBufferHdr;
1829f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("OMX_UseBuffer Capture address: 0x%x, size = %d",
1830f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                         (unsigned int)bufArr[index].opaque,
1831f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                         (int)imgCaptureData->mBufSize);
1832f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1833f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            eError = OMX_UseBuffer(mCameraAdapterParameters.mHandleComp,
1834f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   &pBufferHdr,
1835f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   mCameraAdapterParameters.mImagePortIndex,
1836f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   0,
1837f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   imgCaptureData->mBufSize,
1838f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                   (OMX_U8*)camera_buffer_get_omx_ptr(&bufArr[index]));
1839f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1840f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDB("OMX_UseBuffer = 0x%x", eError);
1841f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError);
1842f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1843f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            pBufferHdr->pAppPrivate = (OMX_PTR) &bufArr[index];
1844f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            bufArr[index].index = index;
1845f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
1846f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            pBufferHdr->nVersion.s.nVersionMajor = 1 ;
1847f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            pBufferHdr->nVersion.s.nVersionMinor = 1 ;
1848f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            pBufferHdr->nVersion.s.nRevision = 0;
1849f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            pBufferHdr->nVersion.s.nStep =  0;
1850f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            imgCaptureData->mBufferHeader[index] = pBufferHdr;
185160c916ae7e31dbff92c1c39385a87cf216fc34d9Tyler Luu            imgCaptureData->mStatus[index] = OMXCameraPortParameters::IDLE;
1852f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1853f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1854f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Wait for the image port enable event
1855f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Waiting for port enable");
1856f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = mUseCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
1857f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1858f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // If somethiing bad happened while we wait
1859f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mComponentState == OMX_StateInvalid) {
1860f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEA("Invalid State after Enable Image Port Exitting!!!");
1861f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            goto EXIT;
1862f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons          }
1863f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1864f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (ret != NO_ERROR) {
1865f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
1866f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               OMX_EventCmdComplete,
1867f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               OMX_CommandPortEnable,
1868f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               mCameraAdapterParameters.mImagePortIndex,
1869f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                               NULL);
1870f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDA("Timeout expired on port enable");
1871b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            goto EXIT;
1872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1873f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Port enabled");
1874f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1875d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1876d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1877d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Takepicture image port enabled and buffers registered: ", &bufArr->ppmStamp);
1878d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1879d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
1880d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1881ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev        if (mNextState != LOADED_REPROCESS_CAPTURE_STATE) {
1882ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev            // Enable WB and vector shot extra data for metadata
1883ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev            setExtraData(true, mCameraAdapterParameters.mImagePortIndex, OMX_WhiteBalance);
1884ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev            setExtraData(true, mCameraAdapterParameters.mImagePortIndex, OMX_TI_LSCTable);
1885ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev        }
1886f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1887f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // CPCam mode only supports vector shot
1888f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        // Regular capture is not supported
1889ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev        if ( (mCapMode == CP_CAM) && (mNextState != LOADED_REPROCESS_CAPTURE_STATE) ) {
1890ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev            initVectorShot();
1891ca2a5fa144b1484caace32ab51d01c195d74df3cEmilian Peev        }
18928c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu
18938c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu        mCaptureBuffersAvailable.clear();
18948c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu        for (unsigned int i = 0; i < imgCaptureData->mMaxQueueable; i++ ) {
18958c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu            mCaptureBuffersAvailable.add(&mCaptureBuffers[i], 0);
18968c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu        }
18978c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu
18988c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu        // initial ref count for undeqeueued buffers is 1 since buffer provider
18998c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu        // is still holding on to it
19008c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu        for (unsigned int i = imgCaptureData->mMaxQueueable; i < imgCaptureData->mNumBufs; i++ ) {
19018c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu            mCaptureBuffersAvailable.add(&mCaptureBuffers[i], 1);
19028c4175849a833e6466c16f05c5b68fbe6d0006c5Tyler Luu        }
1903b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    }
1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1905f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NO_ERROR == ret )
1906f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        {
1907f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = setupEXIF();
1908f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( NO_ERROR != ret )
1909f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            {
1910f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("Error configuring EXIF Buffer %x", ret);
1911f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
1912f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1913f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1914f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Choose proper single preview mode for cp capture (reproc or hs)
1915f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (( NO_ERROR == ret) && (OMXCameraAdapter::CP_CAM == mCapMode)) {
1916f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_TI_CONFIG_SINGLEPREVIEWMODETYPE singlePrevMode;
1917f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_INIT_STRUCT_PTR (&singlePrevMode, OMX_TI_CONFIG_SINGLEPREVIEWMODETYPE);
1918f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (mNextState == LOADED_CAPTURE_STATE) {
1919f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            singlePrevMode.eMode = OMX_TI_SinglePreviewMode_ImageCaptureHighSpeed;
1920f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else if (mNextState == LOADED_REPROCESS_CAPTURE_STATE) {
1921f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            singlePrevMode.eMode = OMX_TI_SinglePreviewMode_Reprocess;
1922f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
1923f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Wrong state trying to start a capture in CPCAM mode?");
1924f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            singlePrevMode.eMode = OMX_TI_SinglePreviewMode_ImageCaptureHighSpeed;
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1926f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1927f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                (OMX_INDEXTYPE) OMX_TI_IndexConfigSinglePreviewMode,
1928f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                &singlePrevMode);
1929f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( OMX_ErrorNone != eError ) {
1930f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("Error while configuring single preview mode 0x%x", eError);
1931f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            ret = Utils::ErrorUtils::omxToAndroidError(eError);
1932f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        } else {
1933f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGDA("single preview mode configured successfully");
1934f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
1935f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1936f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1937d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1938d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1939d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev    CameraHal::PPM("Takepicture extra configs on image port done: ", &bufArr->ppmStamp);
1940d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1941d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev#endif
1942d2951b18ac3cc79c6a985ff86f64fcb03a562afcEmilian Peev
1943f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mCaptureConfigured = true;
1944f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1945f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
1946f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mRawCapture) {
1947f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mCaptureConfigured = false;
1948f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1949f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
1950f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1951f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
1952f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1953f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsEXIT:
1954f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
1955f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    setExtraData(false, mCameraAdapterParameters.mImagePortIndex, OMX_WhiteBalance);
1956f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // TODO: WA: if domx client disables VectShotInfo metadata on the image port, this causes
1957f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // VectShotInfo to be disabled internally on preview port also. Remove setting in OMXCapture
1958f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // setExtraData(false, mCameraAdapterParameters.mImagePortIndex, OMX_TI_VectShotInfo);
1959f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    setExtraData(false, mCameraAdapterParameters.mImagePortIndex, OMX_TI_LSCTable);
1960f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //Release image buffers
1961f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != mReleaseImageBuffersCallback ) {
1962f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        mReleaseImageBuffersCallback(mReleaseData);
1963f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
1964f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    performCleanupAfterError();
1965f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT;
1966f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return (ret | Utils::ErrorUtils::omxToAndroidError(eError));
1967f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1968f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
1969f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::UseBuffersRawCapture(CameraBuffer *bufArr, int num)
1970f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
1971f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME
1972f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret;
1973f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_ERRORTYPE eError;
1974f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMXCameraPortParameters * imgRawCaptureData = NULL;
1975f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    Utils::Semaphore camSem;
1976f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMXCameraPortParameters cap;
1977f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1978f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    imgRawCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoPortIndex];
1979f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1980f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mCaptureConfigured) {
1981f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NO_ERROR;
1982b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    }
1983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1984f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camSem.Create();
1985f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1986f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // mWaitingForSnapshot is true only when we're in the process of capturing
1987f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (mWaitingForSnapshot) {
1988f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ///Register for Video port Disable event
1989f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1990f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                (OMX_EVENTTYPE) OMX_EventCmdComplete,
1991f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                OMX_CommandPortDisable,
1992f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mCameraAdapterParameters.mVideoPortIndex,
1993f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                camSem);
1994f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
1995f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ///Disable Capture Port
1996f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
1997f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                OMX_CommandPortDisable,
1998f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                mCameraAdapterParameters.mVideoPortIndex,
1999f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                NULL);
2000f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2001f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Waiting for port disable");
2002f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        //Wait for the image port enable event
2003f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        camSem.Wait();
2004f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDA("Port disabled");
2005f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2006f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2007f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    imgRawCaptureData->mNumBufs = num;
2008f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2009f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDB("RAW Max sensor width = %d", (int)imgRawCaptureData->mWidth);
2010f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDB("RAW Max sensor height = %d", (int)imgRawCaptureData->mHeight);
2011f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2012f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = setFormat(OMX_CAMERA_PORT_VIDEO_OUT_VIDEO, *imgRawCaptureData);
2013f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2014f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (ret != NO_ERROR) {
2015f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGEB("setFormat() failed %d", ret);
2016f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        LOG_FUNCTION_NAME_EXIT
2017f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return ret;
2018f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2019f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2020f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ///Register for Video port ENABLE event
2021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
2022f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                (OMX_EVENTTYPE) OMX_EventCmdComplete,
2023f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                OMX_CommandPortEnable,
2024f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                mCameraAdapterParameters.mVideoPortIndex,
2025f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                camSem);
2026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2027f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ///Enable Video Capture Port
2028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
2029f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                OMX_CommandPortEnable,
2030f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                mCameraAdapterParameters.mVideoPortIndex,
2031f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                NULL);
2032b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman
2033f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mCaptureBuffersLength = (int)imgRawCaptureData->mBufSize;
2034f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    for ( int index = 0 ; index < imgRawCaptureData->mNumBufs ; index++ ) {
2035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_BUFFERHEADERTYPE *pBufferHdr;
2036f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGDB("OMX_UseBuffer rawCapture address: 0x%x, size = %d ",
2037f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                     (unsigned int)bufArr[index].opaque,
2038f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                     (int)imgRawCaptureData->mBufSize );
2039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2040f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        eError = OMX_UseBuffer( mCameraAdapterParameters.mHandleComp,
2041f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                &pBufferHdr,
2042f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                mCameraAdapterParameters.mVideoPortIndex,
2043f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                0,
2044f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                mCaptureBuffersLength,
2045f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                (OMX_U8*)camera_buffer_get_omx_ptr(&bufArr[index]));
2046f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if (eError != OMX_ErrorNone) {
2047f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGEB("OMX_UseBuffer = 0x%x", eError);
2048f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError);
2051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2052f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        pBufferHdr->pAppPrivate = (OMX_PTR) &bufArr[index];
2053f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        bufArr[index].index = index;
2054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
2055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nVersionMajor = 1 ;
2056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nVersionMinor = 1 ;
2057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nRevision = 0;
2058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nStep =  0;
2059f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        imgRawCaptureData->mBufferHeader[index] = pBufferHdr;
2060f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait for the image port enable event
2064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Waiting for port enable");
2065f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camSem.Wait();
2066f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOGDA("Port enabled");
20676b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
2068f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (NO_ERROR == ret) {
2069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = setupEXIF();
2070f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( NO_ERROR != ret ) {
2071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error configuring EXIF Buffer %x", ret);
2072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2073f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
2074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCapturedFrames = mBurstFrames;
2076f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mBurstFramesQueued = 0;
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureConfigured = true;
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2079f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    EXIT:
2080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2081f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (eError != OMX_ErrorNone) {
2082f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if ( NULL != mErrorNotifier )
2083f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        {
2084f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            mErrorNotifier->errorNotify(eError);
2085f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
2086b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    }
2087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2088f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    LOG_FUNCTION_NAME_EXIT
2089f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
2090f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
2091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2093f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
2094f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
2095