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