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 OMXAlgo.cpp 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file contains functionality for handling algorithm configurations. 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h" 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMXCameraAdapter.h" 2600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman#include "ErrorUtils.h" 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 288b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu#undef TRUE 298b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu 30f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti { 31f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera { 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setParametersAlgo(const android::CameraParameters ¶ms, 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::AdapterState state) 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *valstr = NULL; 38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *valManualStr = NULL; 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *oldstr = NULL; 40f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMXCameraPortParameters *cap; 41f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons BrightnessMode gbce = BRIGHTNESS_OFF; 42f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons BrightnessMode glbce = BRIGHTNESS_OFF; 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CaptureMode capMode; 4734da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman CAMHAL_LOGDB("Capture mode %s", params.get(TICameraParameters::KEY_CAP_MODE)); 48f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL ) { 49f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(valstr, (const char *) TICameraParameters::HIGH_PERFORMANCE_MODE) == 0) { 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev capMode = OMXCameraAdapter::HIGH_SPEED; 51f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_HIGH_SPEED; 52f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::EXPOSURE_BRACKETING) == 0) { 53f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons capMode = OMXCameraAdapter::HIGH_SPEED; 54f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_HIGH_SPEED; 55f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::ZOOM_BRACKETING) == 0) { 56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons capMode = OMXCameraAdapter::HIGH_SPEED; 57f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_HIGH_SPEED; 58f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::HIGH_QUALITY_MODE) == 0) { 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev capMode = OMXCameraAdapter::HIGH_QUALITY; 60f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_HIGH_QUALITY; 61f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::HIGH_QUALITY_ZSL_MODE) == 0) { 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev capMode = OMXCameraAdapter::HIGH_QUALITY_ZSL; 63f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_ZEROSHUTTERLAG; 64f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) { 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev capMode = OMXCameraAdapter::VIDEO_MODE; 66f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_VIDEO; 67f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE_HQ) == 0) { 68f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons capMode = OMXCameraAdapter::VIDEO_MODE_HQ; 69f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_VIDEO_HIGH_QUALITY; 70f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::CP_CAM_MODE) == 0) { 71f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons capMode = OMXCameraAdapter::CP_CAM; 72f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_CPCAM; 73f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, (const char *) TICameraParameters::TEMP_BRACKETING) == 0) { 74f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons capMode = OMXCameraAdapter::HIGH_SPEED; 75f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_HIGH_SPEED; 76f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev capMode = OMXCameraAdapter::HIGH_QUALITY; 78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_HIGH_QUALITY; 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 81f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 82f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons capMode = OMXCameraAdapter::HIGH_QUALITY; 83f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_HIGH_QUALITY; 84f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( mSensorIndex == 2 ) { 87f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapabilitiesOpMode = MODE_STEREO; 88f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 89f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 90f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( mCapMode != capMode ) { 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCapMode = capMode; 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOMXStateSwitch = true; 93f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPendingPreviewSettings |= SetCapMode; 94f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Capture Mode set %d", mCapMode); 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// Configure IPP, LDCNSF, GBCE and GLBCE only in HQ mode 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev IPPMode ipp; 100d9520b9de06f01b9411307040cf245e6fc7fe361Milen Mitkov if((mCapMode == OMXCameraAdapter::HIGH_QUALITY) || (mCapMode == OMXCameraAdapter::HIGH_QUALITY_ZSL) 101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons || (mCapMode == OMXCameraAdapter::VIDEO_MODE) 102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons || (mCapMode == OMXCameraAdapter::CP_CAM)) 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (valstr = params.get(TICameraParameters::KEY_IPP)) != NULL ) 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(valstr, (const char *) TICameraParameters::IPP_LDCNSF) == 0) 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ipp = OMXCameraAdapter::IPP_LDCNSF; 109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if (strcmp(valstr, (const char *) TICameraParameters::IPP_LDC) == 0) 111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ipp = OMXCameraAdapter::IPP_LDC; 113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if (strcmp(valstr, (const char *) TICameraParameters::IPP_NSF) == 0) 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ipp = OMXCameraAdapter::IPP_NSF; 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if (strcmp(valstr, (const char *) TICameraParameters::IPP_NONE) == 0) 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ipp = OMXCameraAdapter::IPP_NONE; 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ipp = OMXCameraAdapter::IPP_NONE; 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ipp = OMXCameraAdapter::IPP_NONE; 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("IPP Mode set %d", ipp); 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (((valstr = params.get(TICameraParameters::KEY_GBCE)) != NULL) ) { 135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(valstr, android::CameraParameters::TRUE ) == 0) { 136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons gbce = BRIGHTNESS_ON; 137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons gbce = BRIGHTNESS_OFF; 139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( gbce != mGBCE ) { 142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mGBCE = gbce; 143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons setGBCE(mGBCE); 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if(mFirstTimeInit) { 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable GBCE by default 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev setGBCE(OMXCameraAdapter::BRIGHTNESS_OFF); 149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL ) { 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(valstr, android::CameraParameters::TRUE) == 0) { 154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons glbce = BRIGHTNESS_ON; 155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons glbce = BRIGHTNESS_OFF; 157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( glbce != mGLBCE ) { 160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mGLBCE = glbce; 161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons setGLBCE(mGLBCE); 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if(mFirstTimeInit) { 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable GLBCE by default 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev setGLBCE(OMXCameraAdapter::BRIGHTNESS_OFF); 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ipp = OMXCameraAdapter::IPP_NONE; 171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mIPP != ipp ) 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mIPP = ipp; 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOMXStateSwitch = true; 177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPendingPreviewSettings |= SetLDC; 178f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPendingPreviewSettings |= SetNSF; 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Set VNF Configuration 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool vnfEnabled = false; 183f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = params.get(TICameraParameters::KEY_VNF); 184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valstr && strcmp(valstr, android::CameraParameters::TRUE) == 0) 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VNF Enabled"); 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vnfEnabled = true; 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VNF Disabled"); 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vnfEnabled = false; 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mVnfEnabled != vnfEnabled ) 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVnfEnabled = vnfEnabled; 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOMXStateSwitch = true; 199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPendingPreviewSettings |= SetVNF; 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Set VSTAB Configuration 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool vstabEnabled = false; 204f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION); 205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valstr && strcmp(valstr, android::CameraParameters::TRUE) == 0) { 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VSTAB Enabled"); 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vstabEnabled = true; 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VSTAB Disabled"); 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vstabEnabled = false; 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mVstabEnabled != vstabEnabled ) 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVstabEnabled = vstabEnabled; 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOMXStateSwitch = true; 219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPendingPreviewSettings |= SetVSTAB; 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //A work-around for a failing call to OMX flush buffers 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( capMode = OMXCameraAdapter::VIDEO_MODE ) && 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mVstabEnabled ) ) 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOMXStateSwitch = true; 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 229a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT 230a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Set Auto Convergence Mode 232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = params.get((const char *) TICameraParameters::KEY_AUTOCONVERGENCE_MODE); 233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valManualStr = params.get(TICameraParameters::KEY_MANUAL_CONVERGENCE); 234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons cap = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (cap->mFrameLayoutType != OMX_TI_StereoFrameLayout2D) { 238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr != NULL) || (valManualStr != NULL)) { 239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons setAutoConvergence(valstr, valManualStr, params); 240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valstr != NULL) { 241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("AutoConvergenceMode %s", valstr); 242f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valManualStr != NULL) { 244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Manual Convergence %s", valManualStr); 245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //Set Mechanical Misalignment Correction 249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = params.get(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION); 250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( valstr != NULL ) { 251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons setMechanicalMisalignmentCorrection(strcmp(valstr, android::CameraParameters::TRUE) == 0); 252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Mechanical Misalignment Correction %s", valstr); 253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 256a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 257a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// Set AutoConvergence 264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setAutoConvergence(const char *pValstr, const char *pValManualstr, const android::CameraParameters ¶ms) 265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_CONVERGENCETYPE ACParams; 269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *str = NULL; 270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::Vector<android::sp<CameraArea> > tempAreas; 271f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int mode; 272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int changed = 0; 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( pValManualstr != NULL ) { 277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_S32 manualConvergence = (OMX_S32)strtol(pValManualstr ,0 ,0); 278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mManualConv != manualConvergence) { 280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mManualConv = manualConvergence; 281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons changed = 1; 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( pValstr != NULL ) { 286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mode = getLUTvalue_HALtoOMX(pValstr, mAutoConvergenceLUT); 287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NAME_NOT_FOUND == mode ) { 289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Wrong convergence mode: %s", pValstr); 290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return mode; 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( mAutoConv != static_cast<OMX_TI_AUTOCONVERGENCEMODETYPE> (mode) ) { 295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAutoConv = static_cast<OMX_TI_AUTOCONVERGENCEMODETYPE> (mode); 296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons changed = 1; 297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 298f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( OMX_TI_AutoConvergenceModeFocusFaceTouch == mAutoConv ) { 301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mTouchAreasLock); 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons str = params.get(android::CameraParameters::KEY_METERING_AREAS); 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != str ) { 306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = CameraArea::parseAreas(str, ( strlen(str) + 1 ), tempAreas); 307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Touch areas not received in %s", 309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::KEY_METERING_AREAS); 310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 314f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( CameraArea::areAreasDifferent(mTouchAreas, tempAreas) ) { 315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mTouchAreas.clear(); 316f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mTouchAreas = tempAreas; 317f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons changed = 1; 318f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 319f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 320f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!changed) { 322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 324f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 326f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMXCameraPortParameters * mPreviewData; 327f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 328f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ACParams.nSize = (OMX_U32)sizeof(OMX_TI_CONFIG_CONVERGENCETYPE); 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ACParams.nVersion = mLocalVersionParam; 331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ACParams.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 332f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 334f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (OMX_INDEXTYPE)OMX_TI_IndexConfigAutoConvergence, 335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons &ACParams); 336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ACParams.eACMode = mAutoConv; 338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ACParams.nManualConverence = mManualConv; 339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (1 == mTouchAreas.size()) { 341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int widthDivisor = 1; 342f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int heightDivisor = 1; 343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mPreviewData->mFrameLayoutType == OMX_TI_StereoFrameLayoutTopBottom) { 345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons heightDivisor = 2; 346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mPreviewData->mFrameLayoutType == OMX_TI_StereoFrameLayoutLeftRight) { 348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons widthDivisor = 2; 349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // transform the coordinates to 3A-type coordinates 352f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mTouchAreas.itemAt(0)->transfrom((size_t)mPreviewData->mWidth/widthDivisor, 353f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (size_t)mPreviewData->mHeight/heightDivisor, 354f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (size_t&) ACParams.nACProcWinStartY, 355f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (size_t&) ACParams.nACProcWinStartX, 356f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (size_t&) ACParams.nACProcWinWidth, 357f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (size_t&) ACParams.nACProcWinHeight); 358f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 359f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("nSize %d", (int)ACParams.nSize); 361f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("nPortIndex %d", (int)ACParams.nPortIndex); 362f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("nManualConverence %d", (int)ACParams.nManualConverence); 363f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("eACMode %d", (int)ACParams.eACMode); 364f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("nACProcWinStartX %d", (int)ACParams.nACProcWinStartX); 365f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("nACProcWinStartY %d", (int)ACParams.nACProcWinStartY); 366f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("nACProcWinWidth %d", (int)ACParams.nACProcWinWidth); 367f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("nACProcWinHeight %d", (int)ACParams.nACProcWinHeight); 368f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("bACStatus %d", (int)ACParams.bACStatus); 369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE)OMX_TI_IndexConfigAutoConvergence, 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &ACParams); 373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 374f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( eError != OMX_ErrorNone ) { 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while setting AutoConvergence 0x%x", eError); 376f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = BAD_VALUE; 377f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("AutoConvergence applied successfully"); 379f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::enableVideoNoiseFilter(bool enable) 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PARAM_VIDEONOISEFILTERTYPE vnfCfg; 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&vnfCfg, OMX_PARAM_VIDEONOISEFILTERTYPE); 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enable ) 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VNF is enabled"); 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vnfCfg.eMode = OMX_VideoNoiseFilterModeOn; 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VNF is disabled"); 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vnfCfg.eMode = OMX_VideoNoiseFilterModeOff; 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexParamVideoNoiseFilter, 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &vnfCfg); 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring video noise filter 0x%x", eError); 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Video noise filter is configured successfully"); 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::enableVideoStabilization(bool enable) 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_FRAMESTABTYPE frameStabCfg; 434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_BOOLEANTYPE vstabp; 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&vstabp, OMX_CONFIG_BOOLEANTYPE); 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(enable) 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vstabp.bEnabled = OMX_TRUE; 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vstabp.bEnabled = OMX_FALSE; 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE)OMX_IndexParamFrameStabilisation, 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &vstabp); 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring video stabilization param 0x%x", eError); 457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Video stabilization param configured successfully"); 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&frameStabCfg, OMX_CONFIG_FRAMESTABTYPE); 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexConfigCommonFrameStabilisation, 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &frameStabCfg); 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while getting video stabilization mode 0x%x", 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (unsigned int)eError); 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("VSTAB Port Index = %d", (int)frameStabCfg.nPortIndex); 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frameStabCfg.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enable ) 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VSTAB is enabled"); 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frameStabCfg.bStab = OMX_TRUE; 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("VSTAB is disabled"); 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frameStabCfg.bStab = OMX_FALSE; 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexConfigCommonFrameStabilisation, 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &frameStabCfg); 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring video stabilization mode 0x%x", eError); 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Video stabilization mode configured successfully"); 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setGBCE(OMXCameraAdapter::BrightnessMode mode) 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_LOCAL_AND_GLOBAL_BRIGHTNESSCONTRASTTYPE bControl; 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&bControl, OMX_TI_CONFIG_LOCAL_AND_GLOBAL_BRIGHTNESSCONTRASTTYPE); 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.nPortIndex = OMX_ALL; 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch ( mode ) 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::BRIGHTNESS_ON: 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.eControl = OMX_TI_BceModeOn; 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::BRIGHTNESS_AUTO: 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.eControl = OMX_TI_BceModeAuto; 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::BRIGHTNESS_OFF: 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.eControl = OMX_TI_BceModeOff; 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_TI_IndexConfigGlobalBrightnessContrastEnhance, 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &bControl); 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while setting GBCE 0x%x", eError); 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("GBCE configured successfully 0x%x", mode); 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setGLBCE(OMXCameraAdapter::BrightnessMode mode) 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_LOCAL_AND_GLOBAL_BRIGHTNESSCONTRASTTYPE bControl; 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&bControl, OMX_TI_CONFIG_LOCAL_AND_GLOBAL_BRIGHTNESSCONTRASTTYPE); 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.nPortIndex = OMX_ALL; 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch ( mode ) 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::BRIGHTNESS_ON: 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.eControl = OMX_TI_BceModeOn; 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::BRIGHTNESS_AUTO: 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.eControl = OMX_TI_BceModeAuto; 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::BRIGHTNESS_OFF: 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bControl.eControl = OMX_TI_BceModeOff; 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_TI_IndexConfigLocalBrightnessContrastEnhance, 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &bControl); 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configure GLBCE 0x%x", eError); 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("GLBCE configured successfully"); 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setCaptureMode(OMXCameraAdapter::CaptureMode mode) 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_CAMOPERATINGMODETYPE camMode; 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_BOOLEANTYPE bCAC; 637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_TI_CONFIG_SINGLEPREVIEWMODETYPE singlePrevMode; 638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 6414164de02d63220e48eaca08def1d6c5802a8693fSundar Raman //CAC is disabled by default 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&bCAC, OMX_CONFIG_BOOLEANTYPE); 643f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_INIT_STRUCT_PTR (&singlePrevMode, OMX_TI_CONFIG_SINGLEPREVIEWMODETYPE); 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bCAC.bEnabled = OMX_FALSE; 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&camMode, OMX_CONFIG_CAMOPERATINGMODETYPE); 650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( mSensorIndex == OMX_TI_StereoSensor ) { 651f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( OMXCameraAdapter::VIDEO_MODE == mode ) { 652f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Camera mode: STEREO VIDEO"); 653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons camMode.eCamOperatingMode = OMX_TI_StereoVideo; 654f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Camera mode: STEREO"); 656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons camMode.eCamOperatingMode = OMX_CaptureStereoImageCapture; 657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 658f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ( OMXCameraAdapter::HIGH_SPEED == mode ) { 659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Camera mode: HIGH SPEED"); 660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camMode.eCamOperatingMode = OMX_CaptureImageHighSpeedTemporalBracketing; 661f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ( OMXCameraAdapter::CP_CAM == mode ) { 662f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Camera mode: CP CAM"); 663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons camMode.eCamOperatingMode = OMX_TI_CPCam; 664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // TODO(XXX): Hardcode for now until we implement re-proc pipe 665f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons singlePrevMode.eMode = OMX_TI_SinglePreviewMode_ImageCaptureHighSpeed; 666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if( OMXCameraAdapter::HIGH_QUALITY == mode ) { 667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Camera mode: HIGH QUALITY"); 668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camMode.eCamOperatingMode = OMX_CaptureImageProfileBase; 669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if( OMXCameraAdapter::HIGH_QUALITY_ZSL== mode ) { 6709743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu const char* valstr = NULL; 671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Camera mode: HIGH QUALITY_ZSL"); 672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camMode.eCamOperatingMode = OMX_TI_CaptureImageProfileZeroShutterLag; 6739743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_TUNA 675c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev if ( !mIternalRecordingHint ) { 6769743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu zslHistoryLen.nHistoryLen = 5; 6779743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } 678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 679c78626b15e9f29a5bcf85447ceafb17dcbf58b69Emilian Peev 680f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if( OMXCameraAdapter::VIDEO_MODE == mode ) { 681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Camera mode: VIDEO MODE"); 682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camMode.eCamOperatingMode = OMX_CaptureVideo; 683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if( OMXCameraAdapter::VIDEO_MODE_HQ == mode ) { 684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Camera mode: VIDEO MODE HQ"); 685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons camMode.eCamOperatingMode = OMX_CaptureHighQualityVideo; 686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Camera mode: INVALID mode passed!"); 688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return BAD_VALUE; 689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 690308c2a428da0f71b413d24fca55433ece1625603Vladislav Hristov 69110e47a001f5c979a3cd7f72238cb35c9eee40c1eTyler Luu if( NO_ERROR == ret ) 692308c2a428da0f71b413d24fca55433ece1625603Vladislav Hristov { 693308c2a428da0f71b413d24fca55433ece1625603Vladislav Hristov eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexCameraOperatingMode, 695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &camMode); 696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring camera mode 0x%x", eError); 699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = Utils::ErrorUtils::omxToAndroidError(eError); 700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Camera mode configured successfully"); 704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if((NO_ERROR == ret) && (OMXCameraAdapter::CP_CAM == mode)) { 708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //Configure Single Preview Mode 709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( OMX_INDEXTYPE ) OMX_TI_IndexConfigSinglePreviewMode, 711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons &singlePrevMode); 712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( OMX_ErrorNone != eError ) { 713f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Error while configuring single preview mode 0x%x", eError); 714f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = Utils::ErrorUtils::omxToAndroidError(eError); 715f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 716f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("single preview mode configured successfully"); 717f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 719f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 72110e47a001f5c979a3cd7f72238cb35c9eee40c1eTyler Luu if( NO_ERROR == ret ) 722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Configure CAC 724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexConfigChromaticAberrationCorrection, 726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &bCAC); 727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring CAC 0x%x", eError); 730f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = Utils::ErrorUtils::omxToAndroidError(eError); 731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("CAC configured successfully"); 735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setLDC(OMXCameraAdapter::IPPMode mode) 745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_BOOLEANTYPE bOMX; 749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateLoaded != mComponentState ) 753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is not in loaded state"); 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE); 761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch ( mode ) 763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_LDCNSF: 765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_LDC: 766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bOMX.bEnabled = OMX_TRUE; 768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_NONE: 771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_NSF: 772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bOMX.bEnabled = OMX_FALSE; 775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("Configuring LDC mode 0x%x", bOMX.bEnabled); 780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexParamLensDistortionCorrection, 782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &bOMX); 783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error while setting LDC"); 786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setNSF(OMXCameraAdapter::IPPMode mode) 796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PARAM_ISONOISEFILTERTYPE nsf; 800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateLoaded != mComponentState ) 804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is not in loaded state"); 806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&nsf, OMX_PARAM_ISONOISEFILTERTYPE); 812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nsf.nPortIndex = OMX_ALL; 813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch ( mode ) 815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_LDCNSF: 817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_NSF: 818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nsf.eMode = OMX_ISONoiseFilterModeOn; 820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_LDC: 823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMXCameraAdapter::IPP_NONE: 824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nsf.eMode = OMX_ISONoiseFilterModeOff; 827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("Configuring NSF mode 0x%x", nsf.eMode); 832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE)OMX_IndexParamHighISONoiseFiler, 834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &nsf); 835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error while setting NSF"); 838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setImageQuality(unsigned int quality) 848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_PARAM_QFACTORTYPE jpegQualityConf; 852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(jpegQualityConf, OMX_IMAGE_PARAM_QFACTORTYPE); 864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev jpegQualityConf.nQFactor = quality; 865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev jpegQualityConf.nPortIndex = mCameraAdapterParameters.mImagePortIndex; 866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexParamQFactor, 869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &jpegQualityConf); 870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring jpeg Quality 0x%x", eError); 873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setThumbnailParams(unsigned int width, 883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int height, 884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int quality) 885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PARAM_THUMBNAILTYPE thumbConf; 889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(thumbConf, OMX_PARAM_THUMBNAILTYPE); 901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.nPortIndex = mCameraAdapterParameters.mImagePortIndex; 902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetParameter(mCameraAdapterParameters.mHandleComp, 904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexParamThumbnail, 905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &thumbConf); 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while retrieving thumbnail size 0x%x", eError); 909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //CTS Requirement: width or height equal to zero should 913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //result in absent EXIF thumbnail 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( 0 == width ) || ( 0 == height ) ) 915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.nWidth = mThumbRes[0].width; 917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.nHeight = mThumbRes[0].height; 918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.eCompressionFormat = OMX_IMAGE_CodingUnused; 919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.nWidth = width; 923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.nHeight = height; 924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.nQuality = quality; 925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev thumbConf.eCompressionFormat = OMX_IMAGE_CodingJPEG; 926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Thumbnail width = %d, Thumbnail Height = %d", width, height); 929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetParameter(mCameraAdapterParameters.mHandleComp, 931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexParamThumbnail, 932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &thumbConf); 933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring thumbnail size 0x%x", eError); 936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setAlgoPriority(AlgoPriority priority, 946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Algorithm3A algo, 947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool enable) 948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 95300479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( OMX_StateInvalid == mComponentState ) { 954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 95500479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman return NO_INIT; 95600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 95800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( FACE_PRIORITY == priority ) { 959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 96000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( algo & WHITE_BALANCE_ALGO ) { 96100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( enable ) { 96200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAwbFaceEnable = OMX_TRUE; 96300479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 96400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAwbFaceEnable = OMX_FALSE; 96500479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 96600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 96800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( algo & EXPOSURE_ALGO ) { 96900479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( enable ) { 97000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAeFaceEnable = OMX_TRUE; 97100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 97200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAeFaceEnable = OMX_FALSE; 973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 97400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 97600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( algo & FOCUS_ALGO ) { 97700479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( enable ) { 97800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAfFaceEnable = OMX_TRUE; 97900479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 98000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAfFaceEnable = OMX_FALSE; 98100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 98200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 98400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 98500479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman ( OMX_INDEXTYPE ) OMX_TI_IndexConfigFacePriority3a, 98600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman &mFacePriority); 98700479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( OMX_ErrorNone != eError ) { 98800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman CAMHAL_LOGEB("Error while configuring face priority 0x%x", eError); 98900479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 99000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman CAMHAL_LOGDB("Face priority for algorithms set successfully 0x%x, 0x%x, 0x%x", 99100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAfFaceEnable, 99200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAeFaceEnable, 99300479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mFacePriority.bAwbFaceEnable); 99400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 99600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else if ( REGION_PRIORITY == priority ) { 997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 99800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( algo & WHITE_BALANCE_ALGO ) { 99900479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( enable ) { 100000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAwbRegionEnable= OMX_TRUE; 100100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 100200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAwbRegionEnable = OMX_FALSE; 100300479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 100400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 100600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( algo & EXPOSURE_ALGO ) { 100700479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( enable ) { 100800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAeRegionEnable = OMX_TRUE; 100900479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 101000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAeRegionEnable = OMX_FALSE; 101100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 101200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 101400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( algo & FOCUS_ALGO ) { 101500479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( enable ) { 101600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAfRegionEnable = OMX_TRUE; 101700479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 101800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAfRegionEnable = OMX_FALSE; 1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 102000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 102200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 102300479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman ( OMX_INDEXTYPE ) OMX_TI_IndexConfigRegionPriority3a, 102400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman &mRegionPriority); 102500479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman if ( OMX_ErrorNone != eError ) { 102600479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman CAMHAL_LOGEB("Error while configuring region priority 0x%x", eError); 102700479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } else { 102800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman CAMHAL_LOGDB("Region priority for algorithms set successfully 0x%x, 0x%x, 0x%x", 102900479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAfRegionEnable, 103000479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAeRegionEnable, 103100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman mRegionPriority.bAwbRegionEnable); 1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 103400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman } 103500479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman 1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1038f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return Utils::ErrorUtils::omxToAndroidError(eError); 1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setPictureRotation(unsigned int degree) 1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_ROTATIONTYPE rotation; 1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(rotation, OMX_CONFIG_ROTATIONTYPE); 1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rotation.nRotation = degree; 1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev rotation.nPortIndex = mCameraAdapterParameters.mImagePortIndex; 1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonRotate, 1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &rotation); 1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring rotation 0x%x", eError); 1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setSensorOrientation(unsigned int degree) 1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_ROTATIONTYPE sensorOrientation; 1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int tmpHeight, tmpWidth; 1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMXCameraPortParameters *mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1084f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( OMX_StateInvalid == mComponentState ) { 1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1087f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* Set Temproary Port resolution. 1090f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * For resolution with height >= 720, 1091f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * resolution cannot be set without configuring orientation. 1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * So we first set a temp resolution. We have used VGA 1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1094f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( mPreviewData->mHeight >= 720 ) { 1095f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons tmpHeight = mPreviewData->mHeight; 1096f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons tmpWidth = mPreviewData->mWidth; 1097f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewData->mWidth = 640; 1098f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewData->mHeight = 480; 1099f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1100f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setFormat(OMX_CAMERA_PORT_VIDEO_OUT_PREVIEW, *mPreviewData); 1101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR != ret ) { 1102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Error while configuring format 0x%x", ret); 1103f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewData->mWidth = tmpWidth; 1107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewData->mHeight = tmpHeight; 1108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewPortInitialized = true; 1109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons else if (!mPreviewPortInitialized) { 1111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setFormat(OMX_CAMERA_PORT_VIDEO_OUT_PREVIEW, *mPreviewData); 1112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR != ret ) { 1113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Error while configuring format 0x%x", ret); 1114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewPortInitialized = true; 1117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* Now set Required Orientation*/ 1120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR == ret ) { 1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(sensorOrientation, OMX_CONFIG_ROTATIONTYPE); 1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensorOrientation.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensorOrientation.nRotation = degree; 1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonRotate, 1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &sensorOrientation); 1127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( OMX_ErrorNone != eError ) { 1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring rotation 0x%x", eError); 1129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB(" Currently Sensor Orientation is set to : %d", 1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( unsigned int ) sensorOrientation.nRotation); 1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB(" Sensor Configured for Port : %d", 1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( unsigned int ) sensorOrientation.nPortIndex); 1134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* Now set the required resolution as requested */ 1137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR == ret ) { 1138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bool portConfigured = false; 1139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setSensorQuirks(degree, 1140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex], 1141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons portConfigured); 1142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR != ret ) { 1143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Error while configuring setSensorQuirks 0x%x", ret); 1144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( !portConfigured ) { 1148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setFormat (mCameraAdapterParameters.mPrevPortIndex, 1149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]); 1150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR != ret ) { 1151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Error while configuring format 0x%x", ret); 1152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Another WA: Setting the port definition will reset the VFR 1156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // configuration. 1157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons setVFramerate(mPreviewData->mMinFrameRate, 1158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewData->mMaxFrameRate); 1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setVFramerate(OMX_U32 minFrameRate, OMX_U32 maxFrameRate) 1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_VARFRMRANGETYPE vfr; 117234da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman OMXCameraPortParameters * mPreviewData = 117334da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 117734da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman if ( OMX_StateInvalid == mComponentState ) { 1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 118034da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman } 1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( !mSetFormatDone ) { 118334da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman return NO_INIT; 118434da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman } 118534da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman 118634da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman if ( NO_ERROR == ret ) { 1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&vfr, OMX_TI_CONFIG_VARFRMRANGETYPE); 1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vfr.xMin = minFrameRate<<16; 1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev vfr.xMax = maxFrameRate<<16; 1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE)OMX_TI_IndexConfigVarFrmRange, 1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &vfr); 119534da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman if(OMX_ErrorNone != eError) { 1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while setting VFR min = %d, max = %d, error = 0x%x", 1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( unsigned int ) minFrameRate, 1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( unsigned int ) maxFrameRate, 1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError); 1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 120134da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman } else { 1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("VFR Configured Successfully [%d:%d]", 1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( unsigned int ) minFrameRate, 1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( unsigned int ) maxFrameRate); 1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 120634da992571ff2af3274d2e3fcaaadf6383c83996Sundar Raman } 1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::setMechanicalMisalignmentCorrection(const bool enable) 1212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 1213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 1214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_ERRORTYPE eError = OMX_ErrorNone; 1215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons OMX_TI_CONFIG_MM mm; 1216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 1218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mm.nVersion = mLocalVersionParam; 1220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mm.nSize = sizeof(OMX_TI_CONFIG_MM); 1221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mm.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 1222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mm.bMM = enable ? OMX_TRUE : OMX_FALSE; 1223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (OMX_INDEXTYPE)OMX_TI_IndexConfigMechanicalMisalignment, 1226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons &mm); 1227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(OMX_ErrorNone != eError) { 1229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Error while enabling mechanical misalignment correction. error = 0x%x", eError); 1230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = -1; 1231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 1234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 1237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera 1239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti 1240