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