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#undef LOG_TAG
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL"
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMXCameraAdapter.h"
30b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman#include "ErrorUtils.h"
31b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setParametersCapture(const CameraParameters &params,
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                BaseCameraAdapter::AdapterState state)
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *str = NULL;
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_COLOR_FORMATTYPE pixFormat;
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
43a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    int varint = 0;
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *cap;
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.getPictureSize(&w, &h);
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( w != ( int ) cap->mWidth ) ||
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          ( h != ( int ) cap->mHeight ) )
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
55b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings |= SetFormat;
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap->mWidth = w;
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap->mHeight = h;
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //TODO: Support more pixelformats
61d9520b9de06f01b9411307040cf245e6fc7fe361Milen Mitkov    //cap->mStride = 2;
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Image: cap.mWidth = %d", (int)cap->mWidth);
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Image: cap.mHeight = %d", (int)cap->mHeight);
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
66c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev    if ((valstr = params.getPictureFormat()) != NULL) {
67c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        if (strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) {
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("CbYCrY format selected");
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatCbYCrY;
70c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = CameraParameters::PIXEL_FORMAT_YUV422I;
71c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) {
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("YUV420SP format selected");
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatYUV420SemiPlanar;
74c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = CameraParameters::PIXEL_FORMAT_YUV420SP;
75c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0) {
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RGB565 format selected");
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_Format16bitRGB565;
78c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = CameraParameters::PIXEL_FORMAT_RGB565;
79c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else if (strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_JPEG) == 0) {
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("JPEG format selected");
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingNone;
83c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = CameraParameters::PIXEL_FORMAT_JPEG;
84c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else if (strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_JPS) == 0) {
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("JPS format selected");
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingJPS;
88c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = TICameraParameters::PIXEL_FORMAT_JPS;
89c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else if (strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_MPO) == 0) {
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("MPO format selected");
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingMPO;
93c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = TICameraParameters::PIXEL_FORMAT_MPO;
94c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else if (strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_RAW) == 0) {
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RAW Picture format selected");
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatRawBayer10bit;
97c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = TICameraParameters::PIXEL_FORMAT_RAW;
98c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        } else {
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid format, JPEG format selected as default");
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
101c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev            mPictureFormatFromClient = NULL;
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
103c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev    } else {
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Picture format is NULL, defaulting to JPEG");
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pixFormat = OMX_COLOR_FormatUnused;
106c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev        mPictureFormatFromClient = NULL;
107c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev    }
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
109ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // JPEG capture is not supported in video mode by OMX Camera
110ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // Set capture format to yuv422i...jpeg encode will
111ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // be done on A9
112ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = params.get(TICameraParameters::KEY_CAP_MODE);
113ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (valstr && !strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE)) &&
114ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (pixFormat == OMX_COLOR_FormatUnused) ) {
115ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGDA("Capturing in video mode...selecting yuv422i");
116ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        pixFormat = OMX_COLOR_FormatCbYCrY;
117ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
118ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( pixFormat != cap->mColorFormat )
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
121b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings |= SetFormat;
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        cap->mColorFormat = pixFormat;
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
125a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
126a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    str = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != str ) {
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        parseExpRange(str, mExposureBracketingValues, EXP_BRACKET_RANGE, mExposureBracketingValidEntries);
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
131b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        // if bracketing was previously set...we set again before capturing to clear
132b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mExposureBracketingValidEntries) mPendingCaptureSettings |= SetExpBracket;
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mExposureBracketingValidEntries = 0;
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
136a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
137a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
138a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    varint = params.getInt(CameraParameters::KEY_ROTATION);
139a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    if ( varint != -1 )
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
141a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( ( unsigned int )  varint != mPictureRotation) {
142b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetRotation;
143b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
144a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mPictureRotation = varint;
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
148b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mPictureRotation) mPendingCaptureSettings |= SetRotation;
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPictureRotation = 0;
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Rotation set %d", mPictureRotation);
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
154a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
155a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Read Sensor Orientation and set it based on perating mode
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
158a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev     varint = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
159a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev     if (( varint != -1 ) && (mCapMode == OMXCameraAdapter::VIDEO_MODE))
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
161a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev         mSensorOrientation = varint;
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if (mSensorOrientation == 270 ||mSensorOrientation==90)
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             CAMHAL_LOGEA(" Orientation is 270/90. So setting counter rotation  to Ducati");
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             mSensorOrientation +=180;
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             mSensorOrientation%=360;
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev              }
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     else
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         mSensorOrientation = 0;
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     CAMHAL_LOGVB("Sensor Orientation  set : %d", mSensorOrientation);
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
176a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    varint = params.getInt(TICameraParameters::KEY_BURST);
177a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    if ( varint >= 1 )
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
179a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if (varint != mBurstFrames) {
180b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetExpBracket;
181b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
182a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mBurstFrames = varint;
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
186b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mBurstFrames != 1) mPendingCaptureSettings |= SetExpBracket;
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBurstFrames = 1;
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Burst Frames set %d", mBurstFrames);
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
192a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
193a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
194a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    varint = params.getInt(CameraParameters::KEY_JPEG_QUALITY);
195a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    if ( ( varint >= MIN_JPEG_QUALITY ) &&
196a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev         ( varint  <= MAX_JPEG_QUALITY ) )
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
198a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( ( unsigned int ) varint != mPictureQuality) {
199b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetQuality;
200b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
201a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mPictureQuality = varint;
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
205b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mPictureQuality != MAX_JPEG_QUALITY) mPendingCaptureSettings |= SetQuality;
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPictureQuality = MAX_JPEG_QUALITY;
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Quality set %d", mPictureQuality);
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
211a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
212a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    if ( varint >= 0 )
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
214a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( ( unsigned int ) varint != mThumbWidth) {
215b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetThumb;
216b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
217a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mThumbWidth = varint;
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
221b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mThumbWidth != DEFAULT_THUMB_WIDTH) mPendingCaptureSettings |= SetThumb;
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbWidth = DEFAULT_THUMB_WIDTH;
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Thumb width set %d", mThumbWidth);
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
228a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
229a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    if ( varint >= 0 )
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
231a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( ( unsigned int ) varint != mThumbHeight) {
232b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetThumb;
233b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
234a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mThumbHeight = varint;
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
238b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mThumbHeight != DEFAULT_THUMB_HEIGHT) mPendingCaptureSettings |= SetThumb;
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbHeight = DEFAULT_THUMB_HEIGHT;
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Thumb height set %d", mThumbHeight);
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
245a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
246a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    if ( ( varint >= MIN_JPEG_QUALITY ) &&
247a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev         ( varint <= MAX_JPEG_QUALITY ) )
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
249a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( ( unsigned int ) varint != mThumbQuality) {
250b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings |= SetThumb;
251b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        }
252a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mThumbQuality = varint;
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
256b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mThumbQuality != MAX_JPEG_QUALITY) mPendingCaptureSettings |= SetThumb;
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbQuality = MAX_JPEG_QUALITY;
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Thumbnail Quality set %d", mThumbQuality);
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26214b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu    if (mFirstTimeInit) {
26314b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu        mPendingCaptureSettings = ECapturesettingsAll;
26414b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu    }
26514b70386c375a24a2ec0ff627efa9bb90b00ecfeTyler Luu
266fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (mPendingCaptureSettings) {
267fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        disableImagePort();
268fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        if ( NULL != mReleaseImageBuffersCallback ) {
269fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            mReleaseImageBuffersCallback(mReleaseData);
270fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        }
271fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
272fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::getPictureBufferSize(size_t &length, size_t bufferCount)
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *imgCaptureData = NULL;
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        imgCaptureData->mNumBufs = bufferCount;
291fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
292fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        // check if image port is already configured...
293fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        // if it already configured then we don't have to query again
294fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        if (!mCaptureConfigured) {
295fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            ret = setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *imgCaptureData);
296fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        }
297fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret == NO_ERROR )
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            length = imgCaptureData->mBufSize;
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("setFormat() failed 0x%x", ret);
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            length = 0;
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("getPictureBufferSize %d", length);
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::parseExpRange(const char *rangeStr,
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         int * expRange,
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         size_t count,
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         size_t &validEntries)
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *expVal;
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *tmp = NULL;
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t i = 0;
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == rangeStr )
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == expRange )
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        tmp = ( char * ) malloc( strlen(rangeStr) + 1 );
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == tmp )
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("No resources for temporary buffer");
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        memset(tmp, '\0', strlen(rangeStr) + 1);
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strncpy(tmp, rangeStr, strlen(rangeStr) );
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        expVal = strtok_r( (char *) tmp, CameraHal::PARAMS_DELIMITER, &ctx);
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        i = 0;
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        while ( ( NULL != expVal ) && ( i < count ) )
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expRange[i] = atoi(expVal);
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expVal = strtok_r(NULL, CameraHal::PARAMS_DELIMITER, &ctx);
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            i++;
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        validEntries = i;
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != tmp )
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(tmp);
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setExposureBracketing(int *evValues,
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                 size_t evCount,
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                 size_t frameCount)
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_CAPTUREMODETYPE expCapMode;
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_EXTCAPTUREMODETYPE extExpCapMode;
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateInvalid == mComponentState )
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is in invalid state");
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == evValues )
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Exposure compensation values pointer is invalid");
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&expCapMode, OMX_CONFIG_CAPTUREMODETYPE);
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        expCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// If frameCount>0 but evCount<=0, then this is the case of HQ burst.
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Otherwise, it is normal HQ capture
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///If frameCount>0 and evCount>0 then this is the cause of HQ Exposure bracketing.
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == evCount && 0 == frameCount )
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.bFrameLimited = OMX_FALSE;
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.bFrameLimited = OMX_TRUE;
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.nFrameLimit = frameCount;
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_IndexConfigCaptureMode,
419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &expCapMode);
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while configuring capture mode 0x%x", eError);
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Camera capture mode configured successfully");
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&extExpCapMode, OMX_CONFIG_EXTCAPTUREMODETYPE);
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        extExpCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == evCount )
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.bEnableBracketing = OMX_FALSE;
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.bEnableBracketing = OMX_TRUE;
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.tBracketConfigType.eBracketMode = OMX_BracketExposureRelativeInEV;
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.tBracketConfigType.nNbrBracketingValues = evCount - 1;
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < evCount ; i++ )
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.tBracketConfigType.nBracketValues[i]  =  ( evValues[i] * ( 1 << Q16_OFFSET ) )  / 10;
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                ( OMX_INDEXTYPE ) OMX_IndexConfigExtCaptureMode,
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &extExpCapMode);
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while configuring extended capture mode 0x%x", eError);
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Extended camera capture mode configured successfully");
461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setShutterCallback(bool enabled)
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_CALLBACKREQUESTTYPE shutterRequstCallback;
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component not in executing state");
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -1;
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&shutterRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE);
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        shutterRequstCallback.nPortIndex = OMX_ALL;
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( enabled )
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.bEnable = OMX_TRUE;
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.nIndex = ( OMX_INDEXTYPE ) OMX_TI_IndexConfigShutterCallback;
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Enabling shutter callback");
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.bEnable = OMX_FALSE;
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.nIndex = ( OMX_INDEXTYPE ) OMX_TI_IndexConfigShutterCallback;
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Disabling shutter callback");
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                ( OMX_INDEXTYPE ) OMX_IndexConfigCallbackRequest,
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &shutterRequstCallback);
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error registering shutter callback 0x%x", eError);
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Shutter callback for index 0x%x registered successfully",
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         OMX_TI_IndexConfigShutterCallback);
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doBracketing(OMX_BUFFERHEADERTYPE *pBuffHeader,
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        CameraFrame::FrameType typeOfFrame)
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentBufferIdx, nextBufferIdx;
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        currentBufferIdx = ( unsigned int ) pBuffHeader->pAppPrivate;
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( currentBufferIdx >= imgCaptureData->mNumBufs)
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid bracketing buffer index 0x%x", currentBufferIdx);
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueued[currentBufferIdx] = false;
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueuedCount--;
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 >= mBracketingBuffersQueuedCount )
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            nextBufferIdx = ( currentBufferIdx + 1 ) % imgCaptureData->mNumBufs;
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueued[nextBufferIdx] = true;
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueuedCount++;
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLastBracetingBufferIdx = nextBufferIdx;
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            setFrameRefCount(imgCaptureData->mBufferHeader[nextBufferIdx]->pBuffer, typeOfFrame, 1);
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            returnFrame(imgCaptureData->mBufferHeader[nextBufferIdx]->pBuffer, typeOfFrame);
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::sendBracketFrames()
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentBufferIdx;
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        currentBufferIdx = mLastBracetingBufferIdx;
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        do
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            currentBufferIdx++;
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            currentBufferIdx %= imgCaptureData->mNumBufs;
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (!mBracketingBuffersQueued[currentBufferIdx] )
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CameraFrame cameraFrame;
59888006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                sendCallBacks(cameraFrame,
59988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                              imgCaptureData->mBufferHeader[currentBufferIdx],
60088006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                              imgCaptureData->mImageType,
60188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman                              imgCaptureData);
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } while ( currentBufferIdx != mLastBracetingBufferIdx );
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::startBracketing(int range)
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mBracketingLock);
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( mBracketingEnabled )
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 == imgCaptureData->mNumBufs )
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Image capture buffers set to %d", imgCaptureData->mNumBufs);
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mPending3Asettings )
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        apply3Asettings(mParameters3A);
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mBracketingLock);
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingRange = range;
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueued = new bool[imgCaptureData->mNumBufs];
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mBracketingBuffersQueued )
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to allocate bracketing management structures");
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueuedCount = imgCaptureData->mNumBufs;
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLastBracetingBufferIdx = mBracketingBuffersQueuedCount - 1;
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            for ( int i = 0 ; i  < imgCaptureData->mNumBufs ; i++ )
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingBuffersQueued[i] = true;
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = startImageCapture();
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            Mutex::Autolock lock(mBracketingLock);
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingEnabled = true;
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingEnabled = false;
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopBracketing()
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  status_t ret = NO_ERROR;
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mBracketingLock);
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
70188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    if ( NULL != mBracketingBuffersQueued )
70288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    {
70388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        delete [] mBracketingBuffersQueued;
70488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    }
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
70688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    ret = stopImageCapture();
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
70888006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mBracketingBuffersQueued = NULL;
70988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mBracketingEnabled = false;
71088006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mBracketingBuffersQueuedCount = 0;
71188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    mLastBracetingBufferIdx = 0;
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::startImageCapture()
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * capData = NULL;
723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_BOOLEANTYPE bOMX;
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCaptureConfigured)
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Image capture was cancelled before we could start
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mStartCaptureSem.Count() )
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mStartCaptureSem semaphore count %d", mStartCaptureSem.Count());
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
7393ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman    if ((getNextState() & (CAPTURE_ACTIVE|BRACKETING_ACTIVE)) == 0) {
7403ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman        CAMHAL_LOGDA("trying starting capture when already canceled");
7413ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman        return NO_ERROR;
7423ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman    }
7433ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman
744aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // Camera framework doesn't expect face callbacks once capture is triggered
745aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    pauseFaceDetection(true);
746aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //During bracketing image capture is already active
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mBracketingLock);
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mBracketingEnabled )
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop bracketing, activate normal burst for the remaining images
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingEnabled = false;
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCapturedFrames = mBracketingRange;
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = sendBracketFrames();
756b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman        if(ret != NO_ERROR)
757b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman            goto EXIT;
758b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman        else
759b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman            return ret;
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
763b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    if ( NO_ERROR == ret ) {
764b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if (mPendingCaptureSettings & SetRotation) {
765b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            mPendingCaptureSettings &= ~SetRotation;
766b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            ret = setPictureRotation(mPictureRotation);
767b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            if ( NO_ERROR != ret ) {
768b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu                CAMHAL_LOGEB("Error configuring image rotation %x", ret);
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
771b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    }
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
773ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    // need to enable wb data for video snapshot to fill in exif data
774ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    if ((ret == NO_ERROR) && (mCapMode == VIDEO_MODE)) {
775ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu        // video snapshot uses wb data from snapshot frame
776ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu        ret = setExtraData(true, mCameraAdapterParameters.mPrevPortIndex, OMX_WhiteBalance);
777ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    }
778ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //OMX shutter callback events are only available in hq mode
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode))
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_ALL,
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_TI_IndexConfigShutterCallback,
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        mStartCaptureSem);
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = setShutterCallback(true);
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
799ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( NO_ERROR == ret ) {
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        capData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Queue all the buffers on capture port
803ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        for ( int index = 0 ; index < capData->mNumBufs ; index++ ) {
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Queuing buffer on Capture port - 0x%x",
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         ( unsigned int ) capData->mBufferHeader[index]->pBuffer);
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            eError = OMX_FillThisBuffer(mCameraAdapterParameters.mHandleComp,
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        (OMX_BUFFERHEADERTYPE*)capData->mBufferHeader[index]);
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
810ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mWaitingForSnapshot = true;
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCaptureSignalled = false;
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
815ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // Capturing command is not needed when capturing in video mode
816ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // Only need to queue buffers on image ports
817ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if (mCapMode != VIDEO_MODE) {
818ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE);
819ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            bOMX.bEnabled = OMX_TRUE;
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
821ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            /// sending Capturing Command to the component
822ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
823ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                   OMX_IndexConfigCapturing,
824ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                   &bOMX);
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
826ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            CAMHAL_LOGDB("Capture set - 0x%x", eError);
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
828ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
830ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //OMX shutter callback events are only available in hq mode
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode))
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mStartCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
8417a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng        //If something bad happened while we wait
8427a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng        if (mComponentState != OMX_StateExecuting)
8436b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng          {
8446b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            CAMHAL_LOGEA("Invalid State after Image Capture Exitting!!!");
8456b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            goto EXIT;
8466b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng          }
8476b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Shutter callback received");
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            notifyShutterSubscribers();
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
8559b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng            ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               OMX_ALL,
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               OMX_TI_IndexConfigShutterCallback,
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               NULL);
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Timeout expired on shutter callback");
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto EXIT;
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
866b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    return (ret | ErrorUtils::omxToAndroidError(eError));
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
868b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar RamanEXIT:
869b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
870ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    setExtraData(false, mCameraAdapterParameters.mPrevPortIndex, OMX_WhiteBalance);
871b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    mWaitingForSnapshot = false;
872b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    mCaptureSignalled = false;
873b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    performCleanupAfterError();
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
875b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    return (ret | ErrorUtils::omxToAndroidError(eError));
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopImageCapture()
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
881b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    OMX_ERRORTYPE eError = OMX_ErrorNone;
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_BOOLEANTYPE bOMX;
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *imgCaptureData = NULL;
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mCaptureConfigured) {
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Capture is not ongoing, return from here
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mStopCaptureSem.Count() ) {
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mStopCaptureSem semaphore count %d", mStopCaptureSem.Count());
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Disable the callback first
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mWaitingForSnapshot = false;
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSnapshotCount = 0;
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
901fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // OMX shutter callback events are only available in hq mode
902fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if ((HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode)) {
903fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        //Disable the callback first
904fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        ret = setShutterCallback(false);
905fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
906fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        // if anybody is waiting on the shutter callback
907fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        // signal them and then recreate the semaphore
908fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        if ( 0 != mStartCaptureSem.Count() ) {
9093ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman
9103ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman            for (int i = mStartCaptureSem.Count(); i < 0; i++) {
9113ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman            ret |= SignalEvent(mCameraAdapterParameters.mHandleComp,
9123ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
9133ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               OMX_ALL,
9143ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               OMX_TI_IndexConfigShutterCallback,
9153ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman                               NULL );
916fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            }
917fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            mStartCaptureSem.Create(0);
918470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu        }
919470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu    }
920470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu
921aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // After capture, face detection should be disabled
922aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // and application needs to restart face detection
923aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    stopFaceDetection();
924aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait here for the capture to be done, in worst case timeout and proceed with cleanup
926fc8ab094473901857ee382396eebc5d52ac4c6c6Tyler Luu    mCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
9276b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
9286b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
9296b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
9306b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
9316b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State Image Capture Stop Exitting!!!");
9326b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
9336b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
9346b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
935fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // Disable image capture
936fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // Capturing command is not needed when capturing in video mode
937fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (mCapMode != VIDEO_MODE) {
938fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE);
939fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        bOMX.bEnabled = OMX_FALSE;
940fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
941fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
942fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu                               OMX_IndexConfigCapturing,
943fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu                               &bOMX);
944fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        if ( OMX_ErrorNone != eError ) {
945fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            CAMHAL_LOGDB("Error during SetConfig- 0x%x", eError);
946fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            ret = -1;
947fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu            goto EXIT;
948fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        }
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
950ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu
951ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    // had to enable wb data for video snapshot to fill in exif data
952ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    // now that we are done...disable
953ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    if ((ret == NO_ERROR) && (mCapMode == VIDEO_MODE)) {
954ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu        ret = setExtraData(false, mCameraAdapterParameters.mPrevPortIndex, OMX_WhiteBalance);
955ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu    }
956ef73bec8a83a2fd7fbb072d009382c64eb2da0eeTyler Luu
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Capture set - 0x%x", eError);
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureSignalled = true; //set this to true if we exited because of timeout
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
961fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    {
962fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        Mutex::Autolock lock(mFrameCountMutex);
963fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFrameCount = 0;
964fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFirstFrameCondition.broadcast();
965fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    }
966fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
967fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    return (ret | ErrorUtils::omxToAndroidError(eError));
968fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
969fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler LuuEXIT:
970fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
971fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    //Release image buffers
972fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if ( NULL != mReleaseImageBuffersCallback ) {
973fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        mReleaseImageBuffersCallback(mReleaseData);
974fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
975fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
976fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    {
977fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        Mutex::Autolock lock(mFrameCountMutex);
978fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFrameCount = 0;
979fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mFirstFrameCondition.broadcast();
980fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    }
981fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
982fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    performCleanupAfterError();
983fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    LOG_FUNCTION_NAME_EXIT;
984fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    return (ret | ErrorUtils::omxToAndroidError(eError));
985fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu}
986fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
987fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luustatus_t OMXCameraAdapter::disableImagePort(){
988fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    status_t ret = NO_ERROR;
989fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    OMX_ERRORTYPE eError = OMX_ErrorNone;
990fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    OMXCameraPortParameters *imgCaptureData = NULL;
991fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
992fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (!mCaptureConfigured) {
993fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        return NO_ERROR;
994fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
995fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureConfigured = false;
997fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Register for Image port Disable event
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_EventCmdComplete,
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_CommandPortDisable,
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mCameraAdapterParameters.mImagePortIndex,
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mStopCaptureSem);
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Disable Capture Port
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_CommandPortDisable,
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mCameraAdapterParameters.mImagePortIndex,
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                NULL);
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Free all the buffers on capture port
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (imgCaptureData) {
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Freeing buffer on Capture port - %d", imgCaptureData->mNumBufs);
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( int index = 0 ; index < imgCaptureData->mNumBufs ; index++) {
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Freeing buffer on Capture port - 0x%x",
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         ( unsigned int ) imgCaptureData->mBufferHeader[index]->pBuffer);
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            eError = OMX_FreeBuffer(mCameraAdapterParameters.mHandleComp,
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    mCameraAdapterParameters.mImagePortIndex,
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    (OMX_BUFFERHEADERTYPE*)imgCaptureData->mBufferHeader[index]);
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Waiting for port disable");
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait for the image port enable event
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mStopCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
10276b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
10286b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
10296b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
10306b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
10316b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State after Disable Image Port Exitting!!!");
10326b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
10336b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
10346b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret ) {
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Port disabled");
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
10389b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng        ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_EventCmdComplete,
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_CommandPortDisable,
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mCameraAdapterParameters.mImagePortIndex,
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           NULL);
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Timeout expired on port disable");
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1047fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu EXIT:
1048b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    return (ret | ErrorUtils::omxToAndroidError(eError));
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1051b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::UseBuffersCapture(void* bufArr, int num)
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1057b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    OMX_ERRORTYPE eError = OMX_ErrorNone;
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t *buffers = (uint32_t*)bufArr;
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters cap;
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mUseCaptureSem.Count() )
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mUseCaptureSem semaphore count %d", mUseCaptureSem.Count());
1067b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman        return BAD_VALUE;
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1070fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // capture is already configured...we can skip this step
1071fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (mCaptureConfigured) {
1072d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman
1073d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman        if ( NO_ERROR == ret )
1074d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman            {
1075d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman            ret = setupEXIF();
1076d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman            if ( NO_ERROR != ret )
1077d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman                {
1078d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman                CAMHAL_LOGEB("Error configuring EXIF Buffer %x", ret);
1079d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman                }
1080d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman            }
1081d16343600a83478ed6223e51aa41f717f28b6351Sundar Raman
1082fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        mCapturedFrames = mBurstFrames;
1083fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        return NO_ERROR;
1084fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1085fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData->mNumBufs = num;
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //TODO: Support more pixelformats
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Params Width = %d", (int)imgCaptureData->mWidth);
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Params Height = %d", (int)imgCaptureData->mWidth);
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1093b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    if (mPendingCaptureSettings & SetFormat) {
1094b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings &= ~SetFormat;
1095b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        ret = setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *imgCaptureData);
1096b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if ( ret != NO_ERROR ) {
1097b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            CAMHAL_LOGEB("setFormat() failed %d", ret);
1098b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            LOG_FUNCTION_NAME_EXIT;
1099b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            return ret;
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1101b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    }
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1103b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    if (mPendingCaptureSettings & SetThumb) {
1104b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings &= ~SetThumb;
1105b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        ret = setThumbnailParams(mThumbWidth, mThumbHeight, mThumbQuality);
1106b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if ( NO_ERROR != ret) {
1107b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            CAMHAL_LOGEB("Error configuring thumbnail size %x", ret);
1108b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            return ret;
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1110b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    }
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1112b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    if (mPendingCaptureSettings & SetExpBracket) {
1113b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings &= ~SetExpBracket;
1114b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        ret = setExposureBracketing( mExposureBracketingValues,
1115b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu                                     mExposureBracketingValidEntries, mBurstFrames);
1116b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if ( ret != NO_ERROR ) {
1117b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            CAMHAL_LOGEB("setExposureBracketing() failed %d", ret);
1118b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            goto EXIT;
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1120b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    }
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1122b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    if (mPendingCaptureSettings & SetQuality) {
1123b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        mPendingCaptureSettings &= ~SetQuality;
1124b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        ret = setImageQuality(mPictureQuality);
1125b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu        if ( NO_ERROR != ret) {
1126b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            CAMHAL_LOGEB("Error configuring image quality %x", ret);
1127b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu            goto EXIT;
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1129b5abb7cbdf48ecccbf0e6d5e61a1846c0c4b28a5Tyler Luu    }
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Register for Image port ENABLE event
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_EventCmdComplete,
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_CommandPortEnable,
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mCameraAdapterParameters.mImagePortIndex,
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mUseCaptureSem);
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Enable Capture Port
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             OMX_CommandPortEnable,
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             mCameraAdapterParameters.mImagePortIndex,
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             NULL);
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1144b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    CAMHAL_LOGDB("OMX_UseBuffer = 0x%x", eError);
1145b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError);
1146b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for ( int index = 0 ; index < imgCaptureData->mNumBufs ; index++ )
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_BUFFERHEADERTYPE *pBufferHdr;
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("OMX_UseBuffer Capture address: 0x%x, size = %d",
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     (unsigned int)buffers[index],
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     (int)imgCaptureData->mBufSize);
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError = OMX_UseBuffer(mCameraAdapterParameters.mHandleComp,
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               &pBufferHdr,
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               mCameraAdapterParameters.mImagePortIndex,
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               0,
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               mCaptureBuffersLength,
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               (OMX_U8*)buffers[index]);
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("OMX_UseBuffer = 0x%x", eError);
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError);
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->pAppPrivate = (OMX_PTR) index;
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nVersionMajor = 1 ;
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nVersionMinor = 1 ;
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nRevision = 0;
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nStep =  0;
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        imgCaptureData->mBufferHeader[index] = pBufferHdr;
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait for the image port enable event
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Waiting for port enable");
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mUseCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
11766b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
11776b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
11786b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
11796b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
11806b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State after Enable Image Port Exitting!!!");
11816b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
11826b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
11836b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ret == NO_ERROR )
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Port enabled");
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
11909b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng        ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_EventCmdComplete,
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_CommandPortEnable,
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mCameraAdapterParameters.mImagePortIndex,
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           NULL);
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Timeout expired on port enable");
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = setupEXIF();
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error configuring EXIF Buffer %x", ret);
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCapturedFrames = mBurstFrames;
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureConfigured = true;
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1211b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    return (ret | ErrorUtils::omxToAndroidError(eError));
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1213b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar RamanEXIT:
1214b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
1215b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    //Release image buffers
1216b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    if ( NULL != mReleaseImageBuffersCallback ) {
1217b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman        mReleaseImageBuffersCallback(mReleaseData);
1218b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    }
1219b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    performCleanupAfterError();
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1221b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman    return (ret | ErrorUtils::omxToAndroidError(eError));
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
1226