OMXCapture.cpp revision 6b5eaf29c3d17a24731bf9271bd0d199d433813e
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"
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setParametersCapture(const CameraParameters &params,
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                BaseCameraAdapter::AdapterState state)
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *str = NULL;
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_COLOR_FORMATTYPE pixFormat;
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool updateImagePortParams = false;
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *cap;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.getPictureSize(&w, &h);
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( w != ( int ) cap->mWidth ) ||
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          ( h != ( int ) cap->mHeight ) )
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        updateImagePortParams = true;
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap->mWidth = w;
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap->mHeight = h;
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //TODO: Support more pixelformats
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cap->mStride = 2;
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Image: cap.mWidth = %d", (int)cap->mWidth);
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Image: cap.mHeight = %d", (int)cap->mHeight);
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (valstr = params.getPictureFormat()) != NULL )
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0)
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("CbYCrY format selected");
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatCbYCrY;
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0)
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("YUV420SP format selected");
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatYUV420SemiPlanar;
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0)
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RGB565 format selected");
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_Format16bitRGB565;
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_JPEG) == 0)
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("JPEG format selected");
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingNone;
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_JPS) == 0)
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("JPS format selected");
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingJPS;
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_MPO) == 0)
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("MPO format selected");
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingMPO;
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_RAW_JPEG) == 0)
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RAW + JPEG format selected");
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingRAWJPEG;
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_RAW_MPO) == 0)
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RAW + MPO format selected");
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCodingMode = CodingRAWMPO;
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else if(strcmp(valstr, (const char *) TICameraParameters::PIXEL_FORMAT_RAW) == 0)
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("RAW Picture format selected");
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatRawBayer10bit;
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid format, JPEG format selected as default");
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pixFormat = OMX_COLOR_FormatUnused;
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Picture format is NULL, defaulting to JPEG");
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pixFormat = OMX_COLOR_FormatUnused;
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
128ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // JPEG capture is not supported in video mode by OMX Camera
129ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // Set capture format to yuv422i...jpeg encode will
130ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // be done on A9
131ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = params.get(TICameraParameters::KEY_CAP_MODE);
132ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (valstr && !strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE)) &&
133ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (pixFormat == OMX_COLOR_FormatUnused) ) {
134ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGDA("Capturing in video mode...selecting yuv422i");
135ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        pixFormat = OMX_COLOR_FormatCbYCrY;
136ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
137ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( pixFormat != cap->mColorFormat )
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        updateImagePortParams = true;
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        cap->mColorFormat = pixFormat;
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( updateImagePortParams )
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ( CAPTURE_ACTIVE & state ) != CAPTURE_ACTIVE )
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *cap);
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    str = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != str ) {
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        parseExpRange(str, mExposureBracketingValues, EXP_BRACKET_RANGE, mExposureBracketingValidEntries);
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mExposureBracketingValidEntries = 0;
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( params.getInt(CameraParameters::KEY_ROTATION) != -1 )
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPictureRotation = params.getInt(CameraParameters::KEY_ROTATION);
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPictureRotation = 0;
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Rotation set %d", mPictureRotation);
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Read Sensor Orientation and set it based on perating mode
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     if (( params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION) != -1 ) && (mCapMode == OMXCameraAdapter::VIDEO_MODE))
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         mSensorOrientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if (mSensorOrientation == 270 ||mSensorOrientation==90)
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             CAMHAL_LOGEA(" Orientation is 270/90. So setting counter rotation  to Ducati");
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             mSensorOrientation +=180;
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             mSensorOrientation%=360;
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev              }
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     else
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         mSensorOrientation = 0;
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     CAMHAL_LOGVB("Sensor Orientation  set : %d", mSensorOrientation);
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( params.getInt(TICameraParameters::KEY_BURST)  >= 1 )
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBurstFrames = params.getInt(TICameraParameters::KEY_BURST);
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBurstFrames = 1;
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Burst Frames set %d", mBurstFrames);
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( params.getInt(CameraParameters::KEY_JPEG_QUALITY)  >= MIN_JPEG_QUALITY ) &&
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ( params.getInt(CameraParameters::KEY_JPEG_QUALITY)  <= MAX_JPEG_QUALITY ) )
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPictureQuality = params.getInt(CameraParameters::KEY_JPEG_QUALITY);
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPictureQuality = MAX_JPEG_QUALITY;
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Quality set %d", mPictureQuality);
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)  >= 0 )
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbWidth = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbWidth = DEFAULT_THUMB_WIDTH;
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Thumb width set %d", mThumbWidth);
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)  >= 0 )
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbHeight = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbHeight = DEFAULT_THUMB_HEIGHT;
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGVB("Picture Thumb height set %d", mThumbHeight);
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)  >= MIN_JPEG_QUALITY ) &&
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)  <= MAX_JPEG_QUALITY ) )
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbQuality = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mThumbQuality = MAX_JPEG_QUALITY;
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Thumbnail Quality set %d", mThumbQuality);
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::getPictureBufferSize(size_t &length, size_t bufferCount)
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *imgCaptureData = NULL;
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        imgCaptureData->mNumBufs = bufferCount;
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *imgCaptureData);
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret == NO_ERROR )
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            length = imgCaptureData->mBufSize;
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("setFormat() failed 0x%x", ret);
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            length = 0;
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("getPictureBufferSize %d", length);
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::parseExpRange(const char *rangeStr,
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         int * expRange,
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         size_t count,
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                         size_t &validEntries)
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *expVal;
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *tmp = NULL;
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t i = 0;
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == rangeStr )
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == expRange )
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        tmp = ( char * ) malloc( strlen(rangeStr) + 1 );
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == tmp )
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("No resources for temporary buffer");
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        memset(tmp, '\0', strlen(rangeStr) + 1);
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strncpy(tmp, rangeStr, strlen(rangeStr) );
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        expVal = strtok_r( (char *) tmp, CameraHal::PARAMS_DELIMITER, &ctx);
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        i = 0;
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        while ( ( NULL != expVal ) && ( i < count ) )
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expRange[i] = atoi(expVal);
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expVal = strtok_r(NULL, CameraHal::PARAMS_DELIMITER, &ctx);
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            i++;
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        validEntries = i;
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != tmp )
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(tmp);
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setExposureBracketing(int *evValues,
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                 size_t evCount,
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                 size_t frameCount)
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_CAPTUREMODETYPE expCapMode;
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_EXTCAPTUREMODETYPE extExpCapMode;
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateInvalid == mComponentState )
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is in invalid state");
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == evValues )
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Exposure compensation values pointer is invalid");
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&expCapMode, OMX_CONFIG_CAPTUREMODETYPE);
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        expCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// If frameCount>0 but evCount<=0, then this is the case of HQ burst.
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Otherwise, it is normal HQ capture
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///If frameCount>0 and evCount>0 then this is the cause of HQ Exposure bracketing.
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == evCount && 0 == frameCount )
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.bFrameLimited = OMX_FALSE;
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.bFrameLimited = OMX_TRUE;
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expCapMode.nFrameLimit = frameCount;
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_IndexConfigCaptureMode,
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &expCapMode);
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while configuring capture mode 0x%x", eError);
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Camera capture mode configured successfully");
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&extExpCapMode, OMX_CONFIG_EXTCAPTUREMODETYPE);
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        extExpCapMode.nPortIndex = mCameraAdapterParameters.mImagePortIndex;
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == evCount )
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.bEnableBracketing = OMX_FALSE;
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.bEnableBracketing = OMX_TRUE;
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.tBracketConfigType.eBracketMode = OMX_BracketExposureRelativeInEV;
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.tBracketConfigType.nNbrBracketingValues = evCount - 1;
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( unsigned int i = 0 ; i < evCount ; i++ )
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            extExpCapMode.tBracketConfigType.nBracketValues[i]  =  ( evValues[i] * ( 1 << Q16_OFFSET ) )  / 10;
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                ( OMX_INDEXTYPE ) OMX_IndexConfigExtCaptureMode,
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &extExpCapMode);
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while configuring extended capture mode 0x%x", eError);
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Extended camera capture mode configured successfully");
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setShutterCallback(bool enabled)
439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_CALLBACKREQUESTTYPE shutterRequstCallback;
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component not in executing state");
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -1;
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&shutterRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE);
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        shutterRequstCallback.nPortIndex = OMX_ALL;
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( enabled )
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.bEnable = OMX_TRUE;
461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.nIndex = ( OMX_INDEXTYPE ) OMX_TI_IndexConfigShutterCallback;
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Enabling shutter callback");
463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.bEnable = OMX_FALSE;
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            shutterRequstCallback.nIndex = ( OMX_INDEXTYPE ) OMX_TI_IndexConfigShutterCallback;
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Disabling shutter callback");
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                ( OMX_INDEXTYPE ) OMX_IndexConfigCallbackRequest,
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &shutterRequstCallback);
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error registering shutter callback 0x%x", eError);
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Shutter callback for index 0x%x registered successfully",
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         OMX_TI_IndexConfigShutterCallback);
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doBracketing(OMX_BUFFERHEADERTYPE *pBuffHeader,
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        CameraFrame::FrameType typeOfFrame)
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentBufferIdx, nextBufferIdx;
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        currentBufferIdx = ( unsigned int ) pBuffHeader->pAppPrivate;
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( currentBufferIdx >= imgCaptureData->mNumBufs)
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid bracketing buffer index 0x%x", currentBufferIdx);
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueued[currentBufferIdx] = false;
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueuedCount--;
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 >= mBracketingBuffersQueuedCount )
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            nextBufferIdx = ( currentBufferIdx + 1 ) % imgCaptureData->mNumBufs;
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueued[nextBufferIdx] = true;
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueuedCount++;
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLastBracetingBufferIdx = nextBufferIdx;
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            setFrameRefCount(imgCaptureData->mBufferHeader[nextBufferIdx]->pBuffer, typeOfFrame, 1);
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            returnFrame(imgCaptureData->mBufferHeader[nextBufferIdx]->pBuffer, typeOfFrame);
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::sendBracketFrames()
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentBufferIdx;
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        currentBufferIdx = mLastBracetingBufferIdx;
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        do
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            currentBufferIdx++;
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            currentBufferIdx %= imgCaptureData->mNumBufs;
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (!mBracketingBuffersQueued[currentBufferIdx] )
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CameraFrame cameraFrame;
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                initCameraFrame(cameraFrame,
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                imgCaptureData->mBufferHeader[currentBufferIdx],
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                imgCaptureData->mImageType,
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                imgCaptureData);
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                sendFrame(cameraFrame);
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } while ( currentBufferIdx != mLastBracetingBufferIdx );
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::startBracketing(int range)
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is not in executing state");
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mBracketingLock);
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( mBracketingEnabled )
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 == imgCaptureData->mNumBufs )
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Image capture buffers set to %d", imgCaptureData->mNumBufs);
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mPending3Asettings )
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        apply3Asettings(mParameters3A);
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mBracketingLock);
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingRange = range;
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueued = new bool[imgCaptureData->mNumBufs];
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mBracketingBuffersQueued )
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to allocate bracketing management structures");
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingBuffersQueuedCount = imgCaptureData->mNumBufs;
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mLastBracetingBufferIdx = mBracketingBuffersQueuedCount - 1;
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            for ( int i = 0 ; i  < imgCaptureData->mNumBufs ; i++ )
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingBuffersQueued[i] = true;
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = startImageCapture();
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            Mutex::Autolock lock(mBracketingLock);
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingEnabled = true;
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mBracketingEnabled = false;
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopBracketing()
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  status_t ret = NO_ERROR;
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mBracketingLock);
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mBracketingEnabled )
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != mBracketingBuffersQueued )
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            delete [] mBracketingBuffersQueued;
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = stopImageCapture();
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueued = NULL;
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingEnabled = false;
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingBuffersQueuedCount = 0;
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mLastBracetingBufferIdx = 0;
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::startImageCapture()
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * capData = NULL;
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_BOOLEANTYPE bOMX;
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCaptureConfigured)
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Image capture was cancelled before we could start
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mStartCaptureSem.Count() )
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mStartCaptureSem semaphore count %d", mStartCaptureSem.Count());
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
714aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // Camera framework doesn't expect face callbacks once capture is triggered
715aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    pauseFaceDetection(true);
716aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //During bracketing image capture is already active
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mBracketingLock);
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mBracketingEnabled )
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop bracketing, activate normal burst for the remaining images
723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingEnabled = false;
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCapturedFrames = mBracketingRange;
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = sendBracketFrames();
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = setPictureRotation(mPictureRotation);
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error configuring image rotation %x", ret);
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //OMX shutter callback events are only available in hq mode
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode))
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_ALL,
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_TI_IndexConfigShutterCallback,
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        mStartCaptureSem);
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = setShutterCallback(true);
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
759ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( NO_ERROR == ret ) {
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        capData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Queue all the buffers on capture port
763ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        for ( int index = 0 ; index < capData->mNumBufs ; index++ ) {
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Queuing buffer on Capture port - 0x%x",
765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         ( unsigned int ) capData->mBufferHeader[index]->pBuffer);
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            eError = OMX_FillThisBuffer(mCameraAdapterParameters.mHandleComp,
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        (OMX_BUFFERHEADERTYPE*)capData->mBufferHeader[index]);
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
770ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mWaitingForSnapshot = true;
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCaptureSignalled = false;
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
775ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // Capturing command is not needed when capturing in video mode
776ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // Only need to queue buffers on image ports
777ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if (mCapMode != VIDEO_MODE) {
778ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE);
779ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            bOMX.bEnabled = OMX_TRUE;
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
781ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            /// sending Capturing Command to the component
782ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
783ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                   OMX_IndexConfigCapturing,
784ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                                   &bOMX);
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
786ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            CAMHAL_LOGDB("Capture set - 0x%x", eError);
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
788ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
790ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //OMX shutter callback events are only available in hq mode
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode))
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mStartCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
8016b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        //If somethiing bad happened while we wait
8026b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        if (mComponentState == OMX_StateInvalid)
8036b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng          {
8046b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            CAMHAL_LOGEA("Invalid State after Image Capture Exitting!!!");
8056b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            goto EXIT;
8066b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng          }
8076b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Shutter callback received");
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            notifyShutterSubscribers();
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
8159b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng            ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               OMX_ALL,
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               OMX_TI_IndexConfigShutterCallback,
819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               NULL);
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Timeout expired on shutter callback");
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto EXIT;
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    EXIT:
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( eError != OMX_ErrorNone )
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mWaitingForSnapshot = false;
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCaptureSignalled = false;
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopImageCapture()
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError;
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_BOOLEANTYPE bOMX;
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters *imgCaptureData = NULL;
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mCaptureConfigured) {
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Capture is not ongoing, return from here
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mStopCaptureSem.Count() ) {
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mStopCaptureSem semaphore count %d", mStopCaptureSem.Count());
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Disable the callback first
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mWaitingForSnapshot = false;
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSnapshotCount = 0;
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Disable the callback first
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = setShutterCallback(false);
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
867470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu    // if anybody is waiting on the shutter callback
868470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu    // signal them and then recreate the semaphore
869470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu    if ( 0 != mStartCaptureSem.Count() ) {
870470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu        for (int i = mStopCaptureSem.Count(); i > 0; i--) {
871470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu            ret |= SignalEvent(mCameraAdapterParameters.mHandleComp,
872470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu                               (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
873470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu                               OMX_ALL,
874470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu                               OMX_TI_IndexConfigShutterCallback,
875470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu                               NULL );
876470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu        }
877470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu        mStartCaptureSem.Create(0);
878470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu    }
879470b7353f563741371ebd464f6c4a662f45e65c4Tyler Luu
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //release any 3A locks if locked
881ba027fc89ec3950e1ac2f95fcc3f1002442ddabbSundar Raman    ret = set3ALock(OMX_FALSE, OMX_FALSE);
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret!=NO_ERROR)
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error Releaseing 3A locks%d", ret);
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
887aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // After capture, face detection should be disabled
888aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // and application needs to restart face detection
889aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    stopFaceDetection();
890aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait here for the capture to be done, in worst case timeout and proceed with cleanup
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
8936b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
8946b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
8956b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
8966b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
8976b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State Image Capture Stop Exitting!!!");
8986b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
8996b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
9006b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret ) {
9029b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng        ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_ALL,
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_TI_IndexConfigShutterCallback,
906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           NULL);
907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Timeout expired on shutter callback");
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Disable image capture
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE);
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bOMX.bEnabled = OMX_FALSE;
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_IndexConfigCapturing,
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           &bOMX);
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_ErrorNone != eError ) {
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Error during SetConfig- 0x%x", eError);
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -1;
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Capture set - 0x%x", eError);
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureSignalled = true; //set this to true if we exited because of timeout
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureConfigured = false;
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Register for Image port Disable event
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_EventCmdComplete,
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_CommandPortDisable,
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mCameraAdapterParameters.mImagePortIndex,
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mStopCaptureSem);
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Disable Capture Port
935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_CommandPortDisable,
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                mCameraAdapterParameters.mImagePortIndex,
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                NULL);
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Free all the buffers on capture port
941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (imgCaptureData) {
942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Freeing buffer on Capture port - %d", imgCaptureData->mNumBufs);
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        for ( int index = 0 ; index < imgCaptureData->mNumBufs ; index++) {
944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Freeing buffer on Capture port - 0x%x",
945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         ( unsigned int ) imgCaptureData->mBufferHeader[index]->pBuffer);
946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            eError = OMX_FreeBuffer(mCameraAdapterParameters.mHandleComp,
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    mCameraAdapterParameters.mImagePortIndex,
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    (OMX_BUFFERHEADERTYPE*)imgCaptureData->mBufferHeader[index]);
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Waiting for port disable");
954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait for the image port enable event
955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mStopCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
9566b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
9576b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
9586b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
9596b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
9606b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State after Disable Image Port Exitting!!!");
9616b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
9626b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
9636b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret ) {
965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Port disabled");
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
9679b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng        ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_EventCmdComplete,
969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_CommandPortDisable,
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mCameraAdapterParameters.mImagePortIndex,
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           NULL);
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Timeout expired on port disable");
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    EXIT:
977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Release image buffers
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mReleaseImageBuffersCallback ) {
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mReleaseImageBuffersCallback(mReleaseData);
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::UseBuffersCapture(void* bufArr, int num)
989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError;
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters * imgCaptureData = NULL;
995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t *buffers = (uint32_t*)bufArr;
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMXCameraPortParameters cap;
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mUseCaptureSem.Count() )
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mUseCaptureSem semaphore count %d", mUseCaptureSem.Count());
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    imgCaptureData->mNumBufs = num;
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //TODO: Support more pixelformats
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Params Width = %d", (int)imgCaptureData->mWidth);
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Params Height = %d", (int)imgCaptureData->mWidth);
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *imgCaptureData);
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ret != NO_ERROR )
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("setFormat() failed %d", ret);
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = setThumbnailParams(mThumbWidth, mThumbHeight, mThumbQuality);
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret)
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error configuring thumbnail size %x", ret);
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = setExposureBracketing( mExposureBracketingValues,
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mExposureBracketingValidEntries, mBurstFrames);
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ret != NO_ERROR )
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("setExposureBracketing() failed %d", ret);
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = setImageQuality(mPictureQuality);
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret)
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error configuring image quality %x", ret);
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Register for Image port ENABLE event
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_EventCmdComplete,
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_CommandPortEnable,
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mCameraAdapterParameters.mImagePortIndex,
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mUseCaptureSem);
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Enable Capture Port
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             OMX_CommandPortEnable,
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             mCameraAdapterParameters.mImagePortIndex,
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             NULL);
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for ( int index = 0 ; index < imgCaptureData->mNumBufs ; index++ )
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_BUFFERHEADERTYPE *pBufferHdr;
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("OMX_UseBuffer Capture address: 0x%x, size = %d",
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     (unsigned int)buffers[index],
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     (int)imgCaptureData->mBufSize);
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError = OMX_UseBuffer(mCameraAdapterParameters.mHandleComp,
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               &pBufferHdr,
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               mCameraAdapterParameters.mImagePortIndex,
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               0,
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               mCaptureBuffersLength,
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               (OMX_U8*)buffers[index]);
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("OMX_UseBuffer = 0x%x", eError);
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError);
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->pAppPrivate = (OMX_PTR) index;
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE);
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nVersionMajor = 1 ;
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nVersionMinor = 1 ;
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nRevision = 0;
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pBufferHdr->nVersion.s.nStep =  0;
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        imgCaptureData->mBufferHeader[index] = pBufferHdr;
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Wait for the image port enable event
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Waiting for port enable");
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mUseCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
10866b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
10876b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    //If somethiing bad happened while we wait
10886b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng    if (mComponentState == OMX_StateInvalid)
10896b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      {
10906b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        CAMHAL_LOGEA("Invalid State after Enable Image Port Exitting!!!");
10916b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng        goto EXIT;
10926b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng      }
10936b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ret == NO_ERROR )
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Port enabled");
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
11009b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng        ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_EventCmdComplete,
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           OMX_CommandPortEnable,
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           mCameraAdapterParameters.mImagePortIndex,
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                           NULL);
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Timeout expired on port enable");
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto EXIT;
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = setupEXIF();
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error configuring EXIF Buffer %x", ret);
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCapturedFrames = mBurstFrames;
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCaptureConfigured = true;
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    EXIT:
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
1129