OMXCapture.cpp revision ba027fc89ec3950e1ac2f95fcc3f1002442ddabb
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 ¶ms, 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 801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Shutter callback received"); 804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev notifyShutterSubscribers(); 805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 8089b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp, 809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ALL, 811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_IndexConfigShutterCallback, 812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL); 813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Timeout expired on shutter callback"); 814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( eError != OMX_ErrorNone ) 822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mWaitingForSnapshot = false; 825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCaptureSignalled = false; 826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopImageCapture() 835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError; 838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_BOOLEANTYPE bOMX; 839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMXCameraPortParameters *imgCaptureData = NULL; 840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!mCaptureConfigured) { 844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Capture is not ongoing, return from here 845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 != mStopCaptureSem.Count() ) { 849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error mStopCaptureSem semaphore count %d", mStopCaptureSem.Count()); 850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable the callback first 854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mWaitingForSnapshot = false; 855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSnapshotCount = 0; 856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable the callback first 858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setShutterCallback(false); 859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //release any 3A locks if locked 861ba027fc89ec3950e1ac2f95fcc3f1002442ddabbSundar Raman ret = set3ALock(OMX_FALSE, OMX_FALSE); 862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(ret!=NO_ERROR) 863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error Releaseing 3A locks%d", ret); 865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 867aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // After capture, face detection should be disabled 868aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // and application needs to restart face detection 869aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu stopFaceDetection(); 870aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Wait here for the capture to be done, in worst case timeout and proceed with cleanup 872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT); 873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) { 8749b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp, 875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ALL, 877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_IndexConfigShutterCallback, 878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL); 879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Timeout expired on shutter callback"); 880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable image capture 883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE); 884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bOMX.bEnabled = OMX_FALSE; 885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex]; 886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCapturing, 888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &bOMX); 889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) { 890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Error during SetConfig- 0x%x", eError); 891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Capture set - 0x%x", eError); 895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCaptureSignalled = true; //set this to true if we exited because of timeout 897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCaptureConfigured = false; 899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Register for Image port Disable event 901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, 902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_EventCmdComplete, 903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CommandPortDisable, 904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mStopCaptureSem); 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Disable Capture Port 907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp, 908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CommandPortDisable, 909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL); 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Free all the buffers on capture port 913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (imgCaptureData) { 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Freeing buffer on Capture port - %d", imgCaptureData->mNumBufs); 915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( int index = 0 ; index < imgCaptureData->mNumBufs ; index++) { 916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Freeing buffer on Capture port - 0x%x", 917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( unsigned int ) imgCaptureData->mBufferHeader[index]->pBuffer); 918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_FreeBuffer(mCameraAdapterParameters.mHandleComp, 919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_BUFFERHEADERTYPE*)imgCaptureData->mBufferHeader[index]); 921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError); 923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Waiting for port disable"); 926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Wait for the image port enable event 927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mStopCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT); 928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) { 929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Port disabled"); 930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 9319b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp, 932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_EventCmdComplete, 933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CommandPortDisable, 934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL); 936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Timeout expired on port disable"); 937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Release image buffers 943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mReleaseImageBuffersCallback ) { 944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mReleaseImageBuffersCallback(mReleaseData); 945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::UseBuffersCapture(void* bufArr, int num) 953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError; 958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMXCameraPortParameters * imgCaptureData = NULL; 959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *buffers = (uint32_t*)bufArr; 960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMXCameraPortParameters cap; 961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev imgCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex]; 963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 != mUseCaptureSem.Count() ) 965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error mUseCaptureSem semaphore count %d", mUseCaptureSem.Count()); 967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev imgCaptureData->mNumBufs = num; 971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //TODO: Support more pixelformats 973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Params Width = %d", (int)imgCaptureData->mWidth); 975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Params Height = %d", (int)imgCaptureData->mWidth); 976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setFormat(OMX_CAMERA_PORT_IMAGE_OUT_IMAGE, *imgCaptureData); 978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ret != NO_ERROR ) 979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("setFormat() failed %d", ret); 981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setThumbnailParams(mThumbWidth, mThumbHeight, mThumbQuality); 986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret) 987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error configuring thumbnail size %x", ret); 989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setExposureBracketing( mExposureBracketingValues, 993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mExposureBracketingValidEntries, mBurstFrames); 994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ret != NO_ERROR ) 995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("setExposureBracketing() failed %d", ret); 997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setImageQuality(mPictureQuality); 1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret) 1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error configuring image quality %x", ret); 1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Register for Image port ENABLE event 1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, 1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_EventCmdComplete, 1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CommandPortEnable, 1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mUseCaptureSem); 1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Enable Capture Port 1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp, 1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CommandPortEnable, 1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL); 1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( int index = 0 ; index < imgCaptureData->mNumBufs ; index++ ) 1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_BUFFERHEADERTYPE *pBufferHdr; 1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("OMX_UseBuffer Capture address: 0x%x, size = %d", 1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (unsigned int)buffers[index], 1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (int)imgCaptureData->mBufSize); 1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_UseBuffer(mCameraAdapterParameters.mHandleComp, 1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &pBufferHdr, 1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 0, 1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCaptureBuffersLength, 1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_U8*)buffers[index]); 1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("OMX_UseBuffer = 0x%x", eError); 1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev GOTO_EXIT_IF(( eError != OMX_ErrorNone ), eError); 1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBufferHdr->pAppPrivate = (OMX_PTR) index; 1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBufferHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBufferHdr->nVersion.s.nVersionMajor = 1 ; 1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBufferHdr->nVersion.s.nVersionMinor = 1 ; 1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBufferHdr->nVersion.s.nRevision = 0; 1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pBufferHdr->nVersion.s.nStep = 0; 1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev imgCaptureData->mBufferHeader[index] = pBufferHdr; 1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Wait for the image port enable event 1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Waiting for port enable"); 1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mUseCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT); 1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ret == NO_ERROR ) 1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Port enabled"); 1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 10569b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp, 1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_EventCmdComplete, 1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CommandPortEnable, 1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapterParameters.mImagePortIndex, 1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL); 1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Timeout expired on port enable"); 1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setupEXIF(); 1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error configuring EXIF Buffer %x", ret); 1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCapturedFrames = mBurstFrames; 1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCaptureConfigured = true; 1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 1085