OMX3A.cpp revision 2facbeb345500d62f74eac01ebb49a069fe034c1
1/*
2 * Copyright (C) Texas Instruments - http://www.ti.com/
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/**
18* @file OMX3A.cpp
19*
20* This file contains functionality for handling 3A configurations.
21*
22*/
23
24#undef LOG_TAG
25
26#define LOG_TAG "CameraHAL"
27
28#include "CameraHal.h"
29#include "OMXCameraAdapter.h"
30#include "ErrorUtils.h"
31
32#undef TRUE
33#undef FALSE
34#define TRUE "true"
35#define FALSE "false"
36
37#define METERING_AREAS_RANGE 0xFF
38
39namespace android {
40
41status_t OMXCameraAdapter::setParameters3A(const CameraParameters &params,
42                                           BaseCameraAdapter::AdapterState state)
43{
44    status_t ret = NO_ERROR;
45    int mode = 0;
46    const char *str = NULL;
47    BaseCameraAdapter::AdapterState nextState;
48    BaseCameraAdapter::getNextState(nextState);
49
50    LOG_FUNCTION_NAME;
51
52    Mutex::Autolock lock(m3ASettingsUpdateLock);
53
54    str = params.get(CameraParameters::KEY_SCENE_MODE);
55    mode = getLUTvalue_HALtoOMX( str, SceneLUT);
56    if ( mFirstTimeInit || ((str != NULL) && ( mParameters3A.SceneMode != mode )) ) {
57        if ( 0 <= mode ) {
58            mParameters3A.SceneMode = mode;
59            if ((mode == OMX_Manual) && (mFirstTimeInit == false)){//Auto mode
60                mFirstTimeInit = true;
61            }
62            if ((mode != OMX_Manual) &&
63                (state & PREVIEW_ACTIVE) && !(nextState & CAPTURE_ACTIVE)) {
64                // if setting preset scene mode, previewing, and not in the middle of capture
65                // set preset scene mode immediately instead of in next FBD
66                // for feedback params to work properly since they need to be read
67                // by application in subsequent getParameters()
68                ret |= setScene(mParameters3A);
69                // re-apply EV compensation after setting scene mode since it probably reset it
70                if(mParameters3A.EVCompensation) {
71                   setEVCompensation(mParameters3A);
72                }
73                return ret;
74            } else {
75                mPending3Asettings |= SetSceneMode;
76            }
77        } else {
78            mParameters3A.SceneMode = OMX_Manual;
79        }
80        CAMHAL_LOGVB("SceneMode %d", mParameters3A.SceneMode);
81    }
82
83    str = params.get(TICameraParameters::KEY_EXPOSURE_MODE);
84    mode = getLUTvalue_HALtoOMX( str, ExpLUT);
85    if ( ( str != NULL ) && ( mParameters3A.Exposure != mode ))
86        {
87        mParameters3A.Exposure = mode;
88        CAMHAL_LOGDB("Exposure mode %d", mode);
89        if ( 0 <= mParameters3A.Exposure )
90            {
91            mPending3Asettings |= SetExpMode;
92            }
93        }
94
95    str = params.get(CameraParameters::KEY_WHITE_BALANCE);
96    mode = getLUTvalue_HALtoOMX( str, WBalLUT);
97    if (mFirstTimeInit || ((str != NULL) && (mode != mParameters3A.WhiteBallance)))
98        {
99        mParameters3A.WhiteBallance = mode;
100        CAMHAL_LOGDB("Whitebalance mode %d", mode);
101        if ( 0 <= mParameters3A.WhiteBallance )
102            {
103            mPending3Asettings |= SetWhiteBallance;
104            }
105        }
106
107    if ( 0 <= params.getInt(TICameraParameters::KEY_CONTRAST) )
108        {
109        if ( mFirstTimeInit ||
110             ( (mParameters3A.Contrast  + CONTRAST_OFFSET) !=
111                     params.getInt(TICameraParameters::KEY_CONTRAST)) )
112            {
113            mParameters3A.Contrast = params.getInt(TICameraParameters::KEY_CONTRAST) - CONTRAST_OFFSET;
114            CAMHAL_LOGDB("Contrast %d", mParameters3A.Contrast);
115            mPending3Asettings |= SetContrast;
116            }
117        }
118
119    if ( 0 <= params.getInt(TICameraParameters::KEY_SHARPNESS) )
120        {
121        if ( mFirstTimeInit ||
122             ((mParameters3A.Sharpness + SHARPNESS_OFFSET) !=
123                     params.getInt(TICameraParameters::KEY_SHARPNESS)))
124            {
125            mParameters3A.Sharpness = params.getInt(TICameraParameters::KEY_SHARPNESS) - SHARPNESS_OFFSET;
126            CAMHAL_LOGDB("Sharpness %d", mParameters3A.Sharpness);
127            mPending3Asettings |= SetSharpness;
128            }
129        }
130
131    if ( 0 <= params.getInt(TICameraParameters::KEY_SATURATION) )
132        {
133        if ( mFirstTimeInit ||
134             ((mParameters3A.Saturation + SATURATION_OFFSET) !=
135                     params.getInt(TICameraParameters::KEY_SATURATION)) )
136            {
137            mParameters3A.Saturation = params.getInt(TICameraParameters::KEY_SATURATION) - SATURATION_OFFSET;
138            CAMHAL_LOGDB("Saturation %d", mParameters3A.Saturation);
139            mPending3Asettings |= SetSaturation;
140            }
141        }
142
143    if ( 0 <= params.getInt(TICameraParameters::KEY_BRIGHTNESS) )
144        {
145        if ( mFirstTimeInit ||
146             (( mParameters3A.Brightness !=
147                     ( unsigned int ) params.getInt(TICameraParameters::KEY_BRIGHTNESS))) )
148            {
149            mParameters3A.Brightness = (unsigned)params.getInt(TICameraParameters::KEY_BRIGHTNESS);
150            CAMHAL_LOGDB("Brightness %d", mParameters3A.Brightness);
151            mPending3Asettings |= SetBrightness;
152            }
153        }
154
155    str = params.get(CameraParameters::KEY_ANTIBANDING);
156    mode = getLUTvalue_HALtoOMX(str,FlickerLUT);
157    if ( mFirstTimeInit || ( ( str != NULL ) && ( mParameters3A.Flicker != mode ) ))
158        {
159        mParameters3A.Flicker = mode;
160        CAMHAL_LOGDB("Flicker %d", mParameters3A.Flicker);
161        if ( 0 <= mParameters3A.Flicker )
162            {
163            mPending3Asettings |= SetFlicker;
164            }
165        }
166
167    str = params.get(TICameraParameters::KEY_ISO);
168    mode = getLUTvalue_HALtoOMX(str, IsoLUT);
169    CAMHAL_LOGVB("ISO mode arrived in HAL : %s", str);
170    if ( mFirstTimeInit || (  ( str != NULL ) && ( mParameters3A.ISO != mode )) )
171        {
172        mParameters3A.ISO = mode;
173        CAMHAL_LOGDB("ISO %d", mParameters3A.ISO);
174        if ( 0 <= mParameters3A.ISO )
175            {
176            mPending3Asettings |= SetISO;
177            }
178        }
179
180    str = params.get(CameraParameters::KEY_FOCUS_MODE);
181    mode = getLUTvalue_HALtoOMX(str, FocusLUT);
182    if ( (mFirstTimeInit || ((str != NULL) && (mParameters3A.Focus != mode))))
183        {
184        //Apply focus mode immediatly only if  CAF  or Inifinity are selected
185        if ( ( mode == OMX_IMAGE_FocusControlAuto ) ||
186             ( mode == OMX_IMAGE_FocusControlAutoInfinity ) )
187            {
188            mPending3Asettings |= SetFocus;
189            }
190
191        mParameters3A.Focus = mode;
192        CAMHAL_LOGDB("Focus %x", mParameters3A.Focus);
193        }
194
195    str = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION);
196    if ( mFirstTimeInit ||
197          (( str != NULL ) &&
198                  (mParameters3A.EVCompensation !=
199                          params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION))))
200        {
201        CAMHAL_LOGDB("Setting EV Compensation to %d",
202                     params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION));
203
204        mParameters3A.EVCompensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
205        mPending3Asettings |= SetEVCompensation;
206        }
207
208    str = params.get(CameraParameters::KEY_FLASH_MODE);
209    mode = getLUTvalue_HALtoOMX( str, FlashLUT);
210    if (  mFirstTimeInit || (( str != NULL ) && ( mParameters3A.FlashMode != mode )) )
211        {
212        if ( 0 <= mode )
213            {
214            mParameters3A.FlashMode = mode;
215            mPending3Asettings |= SetFlash;
216            }
217        else
218            {
219            mParameters3A.FlashMode = OMX_Manual;
220            }
221        }
222
223    CAMHAL_LOGVB("Flash Setting %s", str);
224    CAMHAL_LOGVB("FlashMode %d", mParameters3A.FlashMode);
225
226    str = params.get(CameraParameters::KEY_EFFECT);
227    mode = getLUTvalue_HALtoOMX( str, EffLUT);
228    if (  mFirstTimeInit || (( str != NULL ) && ( mParameters3A.Effect != mode )) )
229        {
230        mParameters3A.Effect = mode;
231        CAMHAL_LOGDB("Effect %d", mParameters3A.Effect);
232        if ( 0 <= mParameters3A.Effect )
233            {
234            mPending3Asettings |= SetEffect;
235            }
236        }
237
238    str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED);
239    if ( (str != NULL) && (!strcmp(str, "true")) )
240      {
241        OMX_BOOL lock = OMX_FALSE;
242        mUserSetExpLock = OMX_FALSE;
243        str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK);
244        if ( (strcmp(str, "true")) == 0)
245          {
246            CAMHAL_LOGVA("Locking Exposure");
247            lock = OMX_TRUE;
248            mUserSetExpLock = OMX_TRUE;
249          }
250        else
251          {
252            CAMHAL_LOGVA("UnLocking Exposure");
253          }
254
255        if (mParameters3A.ExposureLock != lock)
256          {
257            mParameters3A.ExposureLock = lock;
258            CAMHAL_LOGDB("ExposureLock %d", lock);
259            mPending3Asettings |= SetExpLock;
260          }
261      }
262
263    str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED);
264    if ( (str != NULL) && (!strcmp(str, "true")) )
265      {
266        OMX_BOOL lock = OMX_FALSE;
267        mUserSetWbLock = OMX_FALSE;
268        str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK);
269        if ( (strcmp(str, "true")) == 0)
270          {
271            CAMHAL_LOGVA("Locking WhiteBalance");
272            lock = OMX_TRUE;
273            mUserSetWbLock = OMX_TRUE;
274          }
275        else
276          {
277            CAMHAL_LOGVA("UnLocking WhiteBalance");
278          }
279        if (mParameters3A.WhiteBalanceLock != lock)
280          {
281            mParameters3A.WhiteBalanceLock = lock;
282            CAMHAL_LOGDB("WhiteBalanceLock %d", lock);
283            mPending3Asettings |= SetWBLock;
284          }
285      }
286
287    str = params.get(CameraParameters::KEY_METERING_AREAS);
288    if ( (str != NULL) ) {
289        size_t MAX_METERING_AREAS;
290        Vector< sp<CameraArea> > tempAreas;
291
292        MAX_METERING_AREAS = atoi(params.get(CameraParameters::KEY_MAX_NUM_METERING_AREAS));
293
294        Mutex::Autolock lock(mMeteringAreasLock);
295
296        ret = CameraArea::parseAreas(str, ( strlen(str) + 1 ), tempAreas);
297
298        CAMHAL_LOGVB("areAreasDifferent? = %d",
299                     CameraArea::areAreasDifferent(mMeteringAreas, tempAreas));
300
301        if ( (NO_ERROR == ret) && CameraArea::areAreasDifferent(mMeteringAreas, tempAreas) ) {
302            mMeteringAreas.clear();
303            mMeteringAreas = tempAreas;
304
305            if ( MAX_METERING_AREAS >= mMeteringAreas.size() ) {
306                CAMHAL_LOGDB("Setting Metering Areas %s",
307                        params.get(CameraParameters::KEY_METERING_AREAS));
308
309                mPending3Asettings |= SetMeteringAreas;
310            } else {
311                CAMHAL_LOGEB("Metering areas supported %d, metering areas set %d",
312                             MAX_METERING_AREAS, mMeteringAreas.size());
313                ret = -EINVAL;
314            }
315        }
316    }
317
318    LOG_FUNCTION_NAME_EXIT;
319
320    return ret;
321}
322
323int OMXCameraAdapter::getLUTvalue_HALtoOMX(const char * HalValue, LUTtype LUT)
324{
325    int LUTsize = LUT.size;
326    if( HalValue )
327        for(int i = 0; i < LUTsize; i++)
328            if( 0 == strcmp(LUT.Table[i].userDefinition, HalValue) )
329                return LUT.Table[i].omxDefinition;
330
331    return -ENOENT;
332}
333
334const char* OMXCameraAdapter::getLUTvalue_OMXtoHAL(int OMXValue, LUTtype LUT)
335{
336    int LUTsize = LUT.size;
337    for(int i = 0; i < LUTsize; i++)
338        if( LUT.Table[i].omxDefinition == OMXValue )
339            return LUT.Table[i].userDefinition;
340
341    return NULL;
342}
343
344status_t OMXCameraAdapter::apply3ADefaults(Gen3A_settings &Gen3A)
345{
346    status_t ret = NO_ERROR;
347
348    LOG_FUNCTION_NAME;
349
350    Gen3A.Effect = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EFFECT, EffLUT);
351    ret |= setEffect(Gen3A);
352
353    Gen3A.FlashMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FLASH_MODE, FlashLUT);
354    ret |= setFlashMode(Gen3A);
355
356    Gen3A.SceneMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_SCENE_MODE, SceneLUT);
357    ret |= setScene(Gen3A);
358
359    Gen3A.EVCompensation = atoi(OMXCameraAdapter::DEFAULT_EV_COMPENSATION);
360    ret |= setEVCompensation(Gen3A);
361
362    Gen3A.Focus = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FOCUS_MODE, FocusLUT);
363    ret |= setFocusMode(Gen3A);
364
365    Gen3A.ISO = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ISO_MODE, IsoLUT);
366    ret |= setISO(Gen3A);
367
368    Gen3A.Flicker = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ANTIBANDING, FlickerLUT);
369    ret |= setFlicker(Gen3A);
370
371    Gen3A.Brightness = atoi(OMXCameraAdapter::DEFAULT_BRIGHTNESS);
372    ret |= setBrightness(Gen3A);
373
374    Gen3A.Saturation = atoi(OMXCameraAdapter::DEFAULT_SATURATION) - SATURATION_OFFSET;
375    ret |= setSaturation(Gen3A);
376
377    Gen3A.Sharpness = atoi(OMXCameraAdapter::DEFAULT_SHARPNESS) - SHARPNESS_OFFSET;
378    ret |= setSharpness(Gen3A);
379
380    Gen3A.Contrast = atoi(OMXCameraAdapter::DEFAULT_CONTRAST) - CONTRAST_OFFSET;
381    ret |= setContrast(Gen3A);
382
383    Gen3A.WhiteBallance = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_WB, WBalLUT);
384    ret |= setWBMode(Gen3A);
385
386    Gen3A.Exposure = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EXPOSURE_MODE, ExpLUT);
387    ret |= setExposureMode(Gen3A);
388
389    Gen3A.ExposureLock = OMX_FALSE;
390    ret |= setExposureLock(Gen3A);
391
392    Gen3A.FocusLock = OMX_FALSE;
393    ret |= setFocusLock(Gen3A);
394
395    Gen3A.WhiteBalanceLock = OMX_FALSE;
396    ret |= setWhiteBalanceLock(Gen3A);
397
398    LOG_FUNCTION_NAME_EXIT;
399
400    return NO_ERROR;
401}
402
403status_t OMXCameraAdapter::setExposureMode(Gen3A_settings& Gen3A)
404{
405    OMX_ERRORTYPE eError = OMX_ErrorNone;
406    OMX_CONFIG_EXPOSURECONTROLTYPE exp;
407
408    LOG_FUNCTION_NAME;
409
410    if ( OMX_StateInvalid == mComponentState )
411        {
412        CAMHAL_LOGEA("OMX component is in invalid state");
413        return NO_INIT;
414        }
415
416    OMX_INIT_STRUCT_PTR (&exp, OMX_CONFIG_EXPOSURECONTROLTYPE);
417    exp.nPortIndex = OMX_ALL;
418    exp.eExposureControl = (OMX_EXPOSURECONTROLTYPE)Gen3A.Exposure;
419
420    eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
421                            OMX_IndexConfigCommonExposure,
422                            &exp);
423    if ( OMX_ErrorNone != eError )
424        {
425        CAMHAL_LOGEB("Error while configuring exposure mode 0x%x", eError);
426        }
427    else
428        {
429        CAMHAL_LOGDA("Camera exposure mode configured successfully");
430        }
431
432    LOG_FUNCTION_NAME_EXIT;
433
434    return ErrorUtils::omxToAndroidError(eError);
435}
436
437status_t OMXCameraAdapter::setFlashMode(Gen3A_settings& Gen3A)
438{
439    status_t ret = NO_ERROR;
440    OMX_ERRORTYPE eError = OMX_ErrorNone;
441    OMX_IMAGE_PARAM_FLASHCONTROLTYPE flash;
442    OMX_CONFIG_FOCUSASSISTTYPE focusAssist;
443
444    LOG_FUNCTION_NAME;
445
446    if ( OMX_StateInvalid == mComponentState )
447        {
448        CAMHAL_LOGEA("OMX component is in invalid state");
449        return NO_INIT;
450        }
451
452    OMX_INIT_STRUCT_PTR (&flash, OMX_IMAGE_PARAM_FLASHCONTROLTYPE);
453    flash.nPortIndex = OMX_ALL;
454    flash.eFlashControl = ( OMX_IMAGE_FLASHCONTROLTYPE ) Gen3A.FlashMode;
455
456    CAMHAL_LOGDB("Configuring flash mode 0x%x", flash.eFlashControl);
457    eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
458                            (OMX_INDEXTYPE) OMX_IndexConfigFlashControl,
459                            &flash);
460    if ( OMX_ErrorNone != eError )
461        {
462        CAMHAL_LOGEB("Error while configuring flash mode 0x%x", eError);
463        }
464    else
465        {
466        CAMHAL_LOGDA("Camera flash mode configured successfully");
467        }
468
469    if ( OMX_ErrorNone == eError )
470        {
471        OMX_INIT_STRUCT_PTR (&focusAssist, OMX_CONFIG_FOCUSASSISTTYPE);
472        focusAssist.nPortIndex = OMX_ALL;
473        if ( flash.eFlashControl == OMX_IMAGE_FlashControlOff )
474            {
475            focusAssist.bFocusAssist = OMX_FALSE;
476            }
477        else
478            {
479            focusAssist.bFocusAssist = OMX_TRUE;
480            }
481
482        CAMHAL_LOGDB("Configuring AF Assist mode 0x%x", focusAssist.bFocusAssist);
483        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
484                                (OMX_INDEXTYPE) OMX_IndexConfigFocusAssist,
485                                &focusAssist);
486        if ( OMX_ErrorNone != eError )
487            {
488            CAMHAL_LOGEB("Error while configuring AF Assist mode 0x%x", eError);
489            }
490        else
491            {
492            CAMHAL_LOGDA("Camera AF Assist  mode configured successfully");
493            }
494        }
495
496    LOG_FUNCTION_NAME_EXIT;
497
498    return ErrorUtils::omxToAndroidError(eError);
499}
500
501status_t OMXCameraAdapter::getFlashMode(Gen3A_settings& Gen3A)
502{
503    status_t ret = NO_ERROR;
504    OMX_ERRORTYPE eError = OMX_ErrorNone;
505    OMX_IMAGE_PARAM_FLASHCONTROLTYPE flash;
506
507    LOG_FUNCTION_NAME;
508
509    if ( OMX_StateInvalid == mComponentState ) {
510        CAMHAL_LOGEA("OMX component is in invalid state");
511        return NO_INIT;
512    }
513
514    OMX_INIT_STRUCT_PTR (&flash, OMX_IMAGE_PARAM_FLASHCONTROLTYPE);
515    flash.nPortIndex = OMX_ALL;
516
517    eError =  OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
518                            (OMX_INDEXTYPE) OMX_IndexConfigFlashControl,
519                            &flash);
520
521    if ( OMX_ErrorNone != eError ) {
522        CAMHAL_LOGEB("Error while getting flash mode 0x%x", eError);
523    } else {
524        Gen3A.FlashMode = flash.eFlashControl;
525        CAMHAL_LOGDB("Gen3A.FlashMode 0x%x", Gen3A.FlashMode);
526    }
527
528    LOG_FUNCTION_NAME_EXIT;
529
530    return ErrorUtils::omxToAndroidError(eError);
531}
532
533status_t OMXCameraAdapter::setFocusMode(Gen3A_settings& Gen3A)
534{
535    status_t ret = NO_ERROR;
536    OMX_ERRORTYPE eError = OMX_ErrorNone;
537    OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focus;
538    size_t top, left, width, height, weight;
539
540    LOG_FUNCTION_NAME;
541
542    BaseCameraAdapter::AdapterState state;
543    BaseCameraAdapter::getState(state);
544
545    if ( OMX_StateInvalid == mComponentState )
546        {
547        CAMHAL_LOGEA("OMX component is in invalid state");
548        return NO_INIT;
549        }
550
551
552    ///Face detection takes precedence over touch AF
553    if ( mFaceDetectionRunning )
554        {
555        //Disable region priority first
556        setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false);
557
558        //Enable face algorithm priority for focus
559        setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO , true);
560
561        //Do normal focus afterwards
562        ////FIXME: Check if the extended focus control is needed? this overrides caf
563        //focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended;
564        }
565    else if ( (!mFocusAreas.isEmpty()) && (!mFocusAreas.itemAt(0)->isZeroArea()) )
566        {
567
568        //Disable face priority first
569        setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false);
570
571        //Enable region algorithm priority
572        setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true);
573
574
575        //Do normal focus afterwards
576        //FIXME: Check if the extended focus control is needed? this overrides caf
577        //focus.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended;
578
579        }
580    else
581        {
582
583        //Disable both region and face priority
584        setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false);
585
586        setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false);
587
588        }
589
590    if ( NO_ERROR == ret && ((state & AF_ACTIVE) == 0) )
591        {
592        OMX_INIT_STRUCT_PTR (&focus, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
593        focus.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
594        focus.eFocusControl = (OMX_IMAGE_FOCUSCONTROLTYPE)Gen3A.Focus;
595
596        CAMHAL_LOGDB("Configuring focus mode 0x%x", focus.eFocusControl);
597        eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, OMX_IndexConfigFocusControl, &focus);
598        if ( OMX_ErrorNone != eError )
599            {
600            CAMHAL_LOGEB("Error while configuring focus mode 0x%x", eError);
601            }
602        else
603            {
604            CAMHAL_LOGDA("Camera focus mode configured successfully");
605            }
606        }
607
608    LOG_FUNCTION_NAME_EXIT;
609
610    return ErrorUtils::omxToAndroidError(eError);
611}
612
613status_t OMXCameraAdapter::getFocusMode(Gen3A_settings& Gen3A)
614{
615    status_t ret = NO_ERROR;
616    OMX_ERRORTYPE eError = OMX_ErrorNone;
617    OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focus;
618    size_t top, left, width, height, weight;
619
620    LOG_FUNCTION_NAME;
621
622    if (OMX_StateInvalid == mComponentState) {
623        CAMHAL_LOGEA("OMX component is in invalid state");
624        return NO_INIT;
625    }
626
627    OMX_INIT_STRUCT_PTR (&focus, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
628    focus.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
629    eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
630                           OMX_IndexConfigFocusControl, &focus);
631
632    if (OMX_ErrorNone != eError) {
633        CAMHAL_LOGEB("Error while configuring focus mode 0x%x", eError);
634    } else {
635        Gen3A.Focus = focus.eFocusControl;
636        CAMHAL_LOGDB("Gen3A.Focus 0x%x", Gen3A.Focus);
637    }
638
639    LOG_FUNCTION_NAME_EXIT;
640
641    return ErrorUtils::omxToAndroidError(eError);
642}
643
644status_t OMXCameraAdapter::setScene(Gen3A_settings& Gen3A)
645{
646    OMX_ERRORTYPE eError = OMX_ErrorNone;
647    OMX_CONFIG_SCENEMODETYPE scene;
648
649    LOG_FUNCTION_NAME;
650
651    if ( OMX_StateInvalid == mComponentState )
652        {
653        CAMHAL_LOGEA("OMX component is in invalid state");
654        return NO_INIT;
655        }
656
657    OMX_INIT_STRUCT_PTR (&scene, OMX_CONFIG_SCENEMODETYPE);
658    scene.nPortIndex = OMX_ALL;
659    scene.eSceneMode = ( OMX_SCENEMODETYPE ) Gen3A.SceneMode;
660
661    CAMHAL_LOGDB("Configuring scene mode 0x%x", scene.eSceneMode);
662    eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
663                            ( OMX_INDEXTYPE ) OMX_TI_IndexConfigSceneMode,
664                            &scene);
665
666    if (OMX_ErrorNone != eError) {
667        CAMHAL_LOGEB("Error while configuring scene mode 0x%x", eError);
668    } else {
669        CAMHAL_LOGDA("Camera scene configured successfully");
670        if (Gen3A.SceneMode != OMX_Manual) {
671            // Get preset scene mode feedback
672            getFocusMode(Gen3A);
673            getFlashMode(Gen3A);
674            getWBMode(Gen3A);
675
676            // TODO(XXX): Re-enable these for mainline
677            // getSharpness(Gen3A);
678            // getSaturation(Gen3A);
679            // getISO(Gen3A);
680        }
681    }
682
683    LOG_FUNCTION_NAME_EXIT;
684
685    return ErrorUtils::omxToAndroidError(eError);
686}
687
688status_t OMXCameraAdapter::setEVCompensation(Gen3A_settings& Gen3A)
689{
690    OMX_ERRORTYPE eError = OMX_ErrorNone;
691    OMX_CONFIG_EXPOSUREVALUETYPE expValues;
692
693    LOG_FUNCTION_NAME;
694
695    if ( OMX_StateInvalid == mComponentState )
696        {
697        CAMHAL_LOGEA("OMX component is in invalid state");
698        return NO_INIT;
699        }
700
701    OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE);
702    expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
703
704    OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
705                   OMX_IndexConfigCommonExposureValue,
706                   &expValues);
707    CAMHAL_LOGDB("old EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation);
708    CAMHAL_LOGDB("EV Compensation for HAL = %d", Gen3A.EVCompensation);
709
710    expValues.xEVCompensation = ( Gen3A.EVCompensation * ( 1 << Q16_OFFSET ) )  / 10;
711    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
712                            OMX_IndexConfigCommonExposureValue,
713                            &expValues);
714    CAMHAL_LOGDB("new EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation);
715    if ( OMX_ErrorNone != eError )
716        {
717        CAMHAL_LOGEB("Error while configuring EV Compensation 0x%x error = 0x%x",
718                     ( unsigned int ) expValues.xEVCompensation,
719                     eError);
720        }
721    else
722        {
723        CAMHAL_LOGDB("EV Compensation 0x%x configured successfully",
724                     ( unsigned int ) expValues.xEVCompensation);
725        }
726
727    LOG_FUNCTION_NAME_EXIT;
728
729    return ErrorUtils::omxToAndroidError(eError);
730}
731
732status_t OMXCameraAdapter::getEVCompensation(Gen3A_settings& Gen3A)
733{
734    OMX_ERRORTYPE eError = OMX_ErrorNone;
735    OMX_CONFIG_EXPOSUREVALUETYPE expValues;
736
737    LOG_FUNCTION_NAME;
738
739    if ( OMX_StateInvalid == mComponentState ) {
740        CAMHAL_LOGEA("OMX component is in invalid state");
741        return NO_INIT;
742    }
743
744    OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE);
745    expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
746
747    OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
748                  OMX_IndexConfigCommonExposureValue,
749                  &expValues);
750
751    if ( OMX_ErrorNone != eError ) {
752        CAMHAL_LOGEB("Error while getting EV Compensation error = 0x%x", eError);
753    } else {
754        Gen3A.EVCompensation = (10 * expValues.xEVCompensation) / (1 << Q16_OFFSET);
755        CAMHAL_LOGDB("Gen3A.EVCompensation 0x%x", Gen3A.EVCompensation);
756    }
757
758    LOG_FUNCTION_NAME_EXIT;
759
760    return ErrorUtils::omxToAndroidError(eError);
761}
762
763status_t OMXCameraAdapter::setWBMode(Gen3A_settings& Gen3A)
764{
765    OMX_ERRORTYPE eError = OMX_ErrorNone;
766    OMX_CONFIG_WHITEBALCONTROLTYPE wb;
767
768    LOG_FUNCTION_NAME;
769
770    if ( OMX_StateInvalid == mComponentState )
771        {
772        CAMHAL_LOGEA("OMX component is in invalid state");
773        return NO_INIT;
774        }
775
776    OMX_INIT_STRUCT_PTR (&wb, OMX_CONFIG_WHITEBALCONTROLTYPE);
777    wb.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
778    wb.eWhiteBalControl = ( OMX_WHITEBALCONTROLTYPE ) Gen3A.WhiteBallance;
779
780    if ( WB_FACE_PRIORITY == Gen3A.WhiteBallance )
781        {
782        //Disable Region priority and enable Face priority
783        setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false);
784        setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, true);
785
786        //Then set the mode to auto
787        wb.eWhiteBalControl = OMX_WhiteBalControlAuto;
788        }
789    else
790        {
791        //Disable Face and Region priority
792        setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, false);
793        setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false);
794        }
795
796    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
797                         OMX_IndexConfigCommonWhiteBalance,
798                         &wb);
799    if ( OMX_ErrorNone != eError )
800        {
801        CAMHAL_LOGEB("Error while configuring Whitebalance mode 0x%x error = 0x%x",
802                     ( unsigned int ) wb.eWhiteBalControl,
803                     eError);
804        }
805    else
806        {
807        CAMHAL_LOGDB("Whitebalance mode 0x%x configured successfully",
808                     ( unsigned int ) wb.eWhiteBalControl);
809        }
810
811    LOG_FUNCTION_NAME_EXIT;
812
813    return eError;
814}
815
816status_t OMXCameraAdapter::getWBMode(Gen3A_settings& Gen3A)
817{
818    OMX_ERRORTYPE eError = OMX_ErrorNone;
819    OMX_CONFIG_WHITEBALCONTROLTYPE wb;
820
821    LOG_FUNCTION_NAME;
822
823    if ( OMX_StateInvalid == mComponentState ) {
824        CAMHAL_LOGEA("OMX component is in invalid state");
825        return NO_INIT;
826    }
827
828    OMX_INIT_STRUCT_PTR (&wb, OMX_CONFIG_WHITEBALCONTROLTYPE);
829    wb.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
830
831    eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
832                           OMX_IndexConfigCommonWhiteBalance,
833                           &wb);
834
835    if (OMX_ErrorNone != eError) {
836        CAMHAL_LOGEB("Error while getting Whitebalance mode error = 0x%x", eError);
837    } else {
838        Gen3A.WhiteBallance = wb.eWhiteBalControl;
839        CAMHAL_LOGDB("Gen3A.WhiteBallance 0x%x", Gen3A.WhiteBallance);
840    }
841
842    LOG_FUNCTION_NAME_EXIT;
843
844    return eError;
845}
846
847status_t OMXCameraAdapter::setFlicker(Gen3A_settings& Gen3A)
848{
849    OMX_ERRORTYPE eError = OMX_ErrorNone;
850    OMX_CONFIG_FLICKERCANCELTYPE flicker;
851
852    LOG_FUNCTION_NAME;
853
854    if ( OMX_StateInvalid == mComponentState )
855        {
856        CAMHAL_LOGEA("OMX component is in invalid state");
857        return NO_INIT;
858        }
859
860    OMX_INIT_STRUCT_PTR (&flicker, OMX_CONFIG_FLICKERCANCELTYPE);
861    flicker.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
862    flicker.eFlickerCancel = (OMX_COMMONFLICKERCANCELTYPE)Gen3A.Flicker;
863
864    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
865                            (OMX_INDEXTYPE)OMX_IndexConfigFlickerCancel,
866                            &flicker );
867    if ( OMX_ErrorNone != eError )
868        {
869        CAMHAL_LOGEB("Error while configuring Flicker mode 0x%x error = 0x%x",
870                     ( unsigned int ) flicker.eFlickerCancel,
871                     eError);
872        }
873    else
874        {
875        CAMHAL_LOGDB("Flicker mode 0x%x configured successfully",
876                     ( unsigned int ) flicker.eFlickerCancel);
877        }
878
879    LOG_FUNCTION_NAME_EXIT;
880
881    return ErrorUtils::omxToAndroidError(eError);
882}
883
884status_t OMXCameraAdapter::setBrightness(Gen3A_settings& Gen3A)
885{
886    OMX_ERRORTYPE eError = OMX_ErrorNone;
887    OMX_CONFIG_BRIGHTNESSTYPE brightness;
888
889    LOG_FUNCTION_NAME;
890
891    if ( OMX_StateInvalid == mComponentState )
892        {
893        CAMHAL_LOGEA("OMX component is in invalid state");
894        return NO_INIT;
895        }
896
897    OMX_INIT_STRUCT_PTR (&brightness, OMX_CONFIG_BRIGHTNESSTYPE);
898    brightness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
899    brightness.nBrightness = Gen3A.Brightness;
900
901    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
902                         OMX_IndexConfigCommonBrightness,
903                         &brightness);
904    if ( OMX_ErrorNone != eError )
905        {
906        CAMHAL_LOGEB("Error while configuring Brightness 0x%x error = 0x%x",
907                     ( unsigned int ) brightness.nBrightness,
908                     eError);
909        }
910    else
911        {
912        CAMHAL_LOGDB("Brightness 0x%x configured successfully",
913                     ( unsigned int ) brightness.nBrightness);
914        }
915
916    LOG_FUNCTION_NAME_EXIT;
917
918    return ErrorUtils::omxToAndroidError(eError);
919}
920
921status_t OMXCameraAdapter::setContrast(Gen3A_settings& Gen3A)
922{
923    OMX_ERRORTYPE eError = OMX_ErrorNone;
924    OMX_CONFIG_CONTRASTTYPE contrast;
925
926    LOG_FUNCTION_NAME;
927
928    if ( OMX_StateInvalid == mComponentState )
929        {
930        CAMHAL_LOGEA("OMX component is in invalid state");
931        return NO_INIT;
932        }
933
934    OMX_INIT_STRUCT_PTR (&contrast, OMX_CONFIG_CONTRASTTYPE);
935    contrast.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
936    contrast.nContrast = Gen3A.Contrast;
937
938    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
939                         OMX_IndexConfigCommonContrast,
940                         &contrast);
941    if ( OMX_ErrorNone != eError )
942        {
943        CAMHAL_LOGEB("Error while configuring Contrast 0x%x error = 0x%x",
944                     ( unsigned int ) contrast.nContrast,
945                     eError);
946        }
947    else
948        {
949        CAMHAL_LOGDB("Contrast 0x%x configured successfully",
950                     ( unsigned int ) contrast.nContrast);
951        }
952
953    LOG_FUNCTION_NAME_EXIT;
954
955    return eError;
956}
957
958status_t OMXCameraAdapter::setSharpness(Gen3A_settings& Gen3A)
959{
960    OMX_ERRORTYPE eError = OMX_ErrorNone;
961    OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE procSharpness;
962
963    LOG_FUNCTION_NAME;
964
965    if ( OMX_StateInvalid == mComponentState )
966        {
967        CAMHAL_LOGEA("OMX component is in invalid state");
968        return NO_INIT;
969        }
970
971    OMX_INIT_STRUCT_PTR (&procSharpness, OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE);
972    procSharpness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
973    procSharpness.nLevel = Gen3A.Sharpness;
974
975    if( procSharpness.nLevel == 0 )
976        {
977        procSharpness.bAuto = OMX_TRUE;
978        }
979    else
980        {
981        procSharpness.bAuto = OMX_FALSE;
982        }
983
984    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
985                         (OMX_INDEXTYPE)OMX_IndexConfigSharpeningLevel,
986                         &procSharpness);
987    if ( OMX_ErrorNone != eError )
988        {
989        CAMHAL_LOGEB("Error while configuring Sharpness 0x%x error = 0x%x",
990                     ( unsigned int ) procSharpness.nLevel,
991                     eError);
992        }
993    else
994        {
995        CAMHAL_LOGDB("Sharpness 0x%x configured successfully",
996                     ( unsigned int ) procSharpness.nLevel);
997        }
998
999    LOG_FUNCTION_NAME_EXIT;
1000
1001    return ErrorUtils::omxToAndroidError(eError);
1002}
1003
1004status_t OMXCameraAdapter::getSharpness(Gen3A_settings& Gen3A)
1005{
1006    OMX_ERRORTYPE eError = OMX_ErrorNone;
1007    OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE procSharpness;
1008
1009    LOG_FUNCTION_NAME;
1010
1011    if (OMX_StateInvalid == mComponentState) {
1012        CAMHAL_LOGEA("OMX component is in invalid state");
1013        return NO_INIT;
1014    }
1015
1016    OMX_INIT_STRUCT_PTR (&procSharpness, OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE);
1017    procSharpness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1018
1019    eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
1020                           (OMX_INDEXTYPE)OMX_IndexConfigSharpeningLevel,
1021                           &procSharpness);
1022
1023    if (OMX_ErrorNone != eError) {
1024        CAMHAL_LOGEB("Error while configuring Sharpness error = 0x%x", eError);
1025    } else {
1026        Gen3A.Sharpness = procSharpness.nLevel;
1027        CAMHAL_LOGDB("Gen3A.Sharpness 0x%x", Gen3A.Sharpness);
1028    }
1029
1030    LOG_FUNCTION_NAME_EXIT;
1031
1032    return ErrorUtils::omxToAndroidError(eError);
1033}
1034
1035status_t OMXCameraAdapter::setSaturation(Gen3A_settings& Gen3A)
1036{
1037    OMX_ERRORTYPE eError = OMX_ErrorNone;
1038    OMX_CONFIG_SATURATIONTYPE saturation;
1039
1040    LOG_FUNCTION_NAME;
1041
1042    if ( OMX_StateInvalid == mComponentState )
1043        {
1044        CAMHAL_LOGEA("OMX component is in invalid state");
1045        return NO_INIT;
1046        }
1047
1048    OMX_INIT_STRUCT_PTR (&saturation, OMX_CONFIG_SATURATIONTYPE);
1049    saturation.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1050    saturation.nSaturation = Gen3A.Saturation;
1051
1052    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
1053                         OMX_IndexConfigCommonSaturation,
1054                         &saturation);
1055    if ( OMX_ErrorNone != eError )
1056        {
1057        CAMHAL_LOGEB("Error while configuring Saturation 0x%x error = 0x%x",
1058                     ( unsigned int ) saturation.nSaturation,
1059                     eError);
1060        }
1061    else
1062        {
1063        CAMHAL_LOGDB("Saturation 0x%x configured successfully",
1064                     ( unsigned int ) saturation.nSaturation);
1065        }
1066
1067    LOG_FUNCTION_NAME_EXIT;
1068
1069    return ErrorUtils::omxToAndroidError(eError);
1070}
1071
1072status_t OMXCameraAdapter::getSaturation(Gen3A_settings& Gen3A)
1073{
1074    OMX_ERRORTYPE eError = OMX_ErrorNone;
1075    OMX_CONFIG_SATURATIONTYPE saturation;
1076
1077    LOG_FUNCTION_NAME;
1078
1079    if (OMX_StateInvalid == mComponentState) {
1080        CAMHAL_LOGEA("OMX component is in invalid state");
1081        return NO_INIT;
1082    }
1083
1084    OMX_INIT_STRUCT_PTR (&saturation, OMX_CONFIG_SATURATIONTYPE);
1085    saturation.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1086
1087    eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1088                         OMX_IndexConfigCommonSaturation,
1089                         &saturation);
1090
1091    if (OMX_ErrorNone != eError) {
1092        CAMHAL_LOGEB("Error while getting Saturation error = 0x%x", eError);
1093    } else {
1094        Gen3A.Saturation = saturation.nSaturation;
1095        CAMHAL_LOGDB("Gen3A.Saturation 0x%x", Gen3A.Saturation);
1096    }
1097
1098    LOG_FUNCTION_NAME_EXIT;
1099
1100    return ErrorUtils::omxToAndroidError(eError);
1101}
1102
1103status_t OMXCameraAdapter::setISO(Gen3A_settings& Gen3A)
1104{
1105    OMX_ERRORTYPE eError = OMX_ErrorNone;
1106    OMX_CONFIG_EXPOSUREVALUETYPE expValues;
1107
1108    LOG_FUNCTION_NAME;
1109
1110    if ( OMX_StateInvalid == mComponentState )
1111        {
1112        CAMHAL_LOGEA("OMX component is in invalid state");
1113        return NO_INIT;
1114        }
1115
1116    OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE);
1117    expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1118
1119    OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1120                   OMX_IndexConfigCommonExposureValue,
1121                   &expValues);
1122
1123    if( 0 == Gen3A.ISO )
1124        {
1125        expValues.bAutoSensitivity = OMX_TRUE;
1126        }
1127    else
1128        {
1129        expValues.bAutoSensitivity = OMX_FALSE;
1130        expValues.nSensitivity = Gen3A.ISO;
1131        }
1132
1133    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
1134                         OMX_IndexConfigCommonExposureValue,
1135                         &expValues);
1136    if ( OMX_ErrorNone != eError )
1137        {
1138        CAMHAL_LOGEB("Error while configuring ISO 0x%x error = 0x%x",
1139                     ( unsigned int ) expValues.nSensitivity,
1140                     eError);
1141        }
1142    else
1143        {
1144        CAMHAL_LOGDB("ISO 0x%x configured successfully",
1145                     ( unsigned int ) expValues.nSensitivity);
1146        }
1147
1148    LOG_FUNCTION_NAME_EXIT;
1149
1150    return ErrorUtils::omxToAndroidError(eError);
1151}
1152
1153status_t OMXCameraAdapter::getISO(Gen3A_settings& Gen3A)
1154{
1155    OMX_ERRORTYPE eError = OMX_ErrorNone;
1156    OMX_CONFIG_EXPOSUREVALUETYPE expValues;
1157
1158    LOG_FUNCTION_NAME;
1159
1160    if (OMX_StateInvalid == mComponentState) {
1161        CAMHAL_LOGEA("OMX component is in invalid state");
1162        return NO_INIT;
1163    }
1164
1165    OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE);
1166    expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1167
1168    OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1169                   OMX_IndexConfigCommonExposureValue,
1170                   &expValues);
1171
1172    if (OMX_ErrorNone != eError) {
1173        CAMHAL_LOGEB("Error while getting ISO error = 0x%x", eError);
1174    } else {
1175        Gen3A.ISO = expValues.nSensitivity;
1176        CAMHAL_LOGDB("Gen3A.ISO %d", Gen3A.ISO);
1177    }
1178
1179    LOG_FUNCTION_NAME_EXIT;
1180
1181    return ErrorUtils::omxToAndroidError(eError);
1182}
1183
1184status_t OMXCameraAdapter::setEffect(Gen3A_settings& Gen3A)
1185{
1186    OMX_ERRORTYPE eError = OMX_ErrorNone;
1187    OMX_CONFIG_IMAGEFILTERTYPE effect;
1188
1189    LOG_FUNCTION_NAME;
1190
1191    if ( OMX_StateInvalid == mComponentState )
1192        {
1193        CAMHAL_LOGEA("OMX component is in invalid state");
1194        return NO_INIT;
1195        }
1196
1197    OMX_INIT_STRUCT_PTR (&effect, OMX_CONFIG_IMAGEFILTERTYPE);
1198    effect.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1199    effect.eImageFilter = (OMX_IMAGEFILTERTYPE ) Gen3A.Effect;
1200
1201    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
1202                         OMX_IndexConfigCommonImageFilter,
1203                         &effect);
1204    if ( OMX_ErrorNone != eError )
1205        {
1206        CAMHAL_LOGEB("Error while configuring Effect 0x%x error = 0x%x",
1207                     ( unsigned int )  effect.eImageFilter,
1208                     eError);
1209        }
1210    else
1211        {
1212        CAMHAL_LOGDB("Effect 0x%x configured successfully",
1213                     ( unsigned int )  effect.eImageFilter);
1214        }
1215
1216    LOG_FUNCTION_NAME_EXIT;
1217
1218    return ErrorUtils::omxToAndroidError(eError);
1219}
1220
1221status_t OMXCameraAdapter::setWhiteBalanceLock(Gen3A_settings& Gen3A)
1222{
1223  OMX_ERRORTYPE eError = OMX_ErrorNone;
1224  OMX_IMAGE_CONFIG_LOCKTYPE lock;
1225
1226  LOG_FUNCTION_NAME
1227
1228  if ( OMX_StateInvalid == mComponentState )
1229    {
1230      CAMHAL_LOGEA("OMX component is in invalid state");
1231      return NO_INIT;
1232    }
1233
1234  OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1235  lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1236  lock.bLock = Gen3A.WhiteBalanceLock;
1237  eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
1238                          (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock,
1239                          &lock);
1240  if ( OMX_ErrorNone != eError )
1241    {
1242      CAMHAL_LOGEB("Error while configuring WhiteBalance Lock error = 0x%x", eError);
1243    }
1244  else
1245    {
1246      CAMHAL_LOGDB("WhiteBalance Lock configured successfully %d ", lock.bLock);
1247    }
1248  LOG_FUNCTION_NAME_EXIT
1249
1250  return ErrorUtils::omxToAndroidError(eError);
1251}
1252
1253status_t OMXCameraAdapter::setExposureLock(Gen3A_settings& Gen3A)
1254{
1255  OMX_ERRORTYPE eError = OMX_ErrorNone;
1256  OMX_IMAGE_CONFIG_LOCKTYPE lock;
1257
1258  LOG_FUNCTION_NAME
1259
1260  if ( OMX_StateInvalid == mComponentState )
1261    {
1262      CAMHAL_LOGEA("OMX component is in invalid state");
1263      return NO_INIT;
1264    }
1265
1266  OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1267  lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1268  lock.bLock = Gen3A.ExposureLock;
1269  eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
1270                          (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock,
1271                          &lock);
1272  if ( OMX_ErrorNone != eError )
1273    {
1274      CAMHAL_LOGEB("Error while configuring Exposure Lock error = 0x%x", eError);
1275    }
1276  else
1277    {
1278      CAMHAL_LOGDB("Exposure Lock configured successfully %d ", lock.bLock);
1279    }
1280  LOG_FUNCTION_NAME_EXIT
1281
1282    return ErrorUtils::omxToAndroidError(eError);
1283}
1284
1285status_t OMXCameraAdapter::setFocusLock(Gen3A_settings& Gen3A)
1286{
1287    OMX_ERRORTYPE eError = OMX_ErrorNone;
1288    OMX_IMAGE_CONFIG_LOCKTYPE lock;
1289
1290    LOG_FUNCTION_NAME
1291
1292    if ( OMX_StateInvalid == mComponentState ) {
1293        CAMHAL_LOGEA("OMX component is in invalid state");
1294        return NO_INIT;
1295    }
1296
1297    OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1298    lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1299
1300    lock.bLock = Gen3A.FocusLock;
1301    eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1302                           (OMX_INDEXTYPE)OMX_IndexConfigImageFocusLock,
1303                           &lock);
1304
1305    if ( OMX_ErrorNone != eError ) {
1306        CAMHAL_LOGEB("Error while configuring Focus Lock error = 0x%x", eError);
1307    } else {
1308        CAMHAL_LOGDB("Focus Lock configured successfully %d ", lock.bLock);
1309    }
1310
1311    LOG_FUNCTION_NAME_EXIT
1312
1313    return ErrorUtils::omxToAndroidError(eError);
1314}
1315
1316status_t OMXCameraAdapter::set3ALock(OMX_BOOL toggleExp, OMX_BOOL toggleWb, OMX_BOOL toggleFocus)
1317{
1318    OMX_ERRORTYPE eError = OMX_ErrorNone;
1319    OMX_IMAGE_CONFIG_LOCKTYPE lock;
1320
1321    LOG_FUNCTION_NAME
1322
1323    if ( OMX_StateInvalid == mComponentState )
1324    {
1325      CAMHAL_LOGEA("OMX component is in invalid state");
1326      return NO_INIT;
1327    }
1328
1329    OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1330    lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1331
1332    mParameters3A.ExposureLock = toggleExp;
1333    mParameters3A.FocusLock = toggleFocus;
1334    mParameters3A.WhiteBalanceLock = toggleWb;
1335
1336    eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1337                            (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock,
1338                            &lock);
1339
1340    if ( OMX_ErrorNone != eError )
1341    {
1342        CAMHAL_LOGEB("Error GetConfig Exposure Lock error = 0x%x", eError);
1343        goto EXIT;
1344    }
1345    else
1346    {
1347        const char *lock_state_exp = toggleExp ? TRUE : FALSE;
1348        CAMHAL_LOGDA("Exposure Lock GetConfig successfull");
1349
1350        /* Apply locks only when not applied already */
1351        if ( lock.bLock  != toggleExp )
1352        {
1353            setExposureLock(mParameters3A);
1354        }
1355
1356        mParams.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, lock_state_exp);
1357    }
1358
1359    OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1360    lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1361    eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1362                            (OMX_INDEXTYPE)OMX_IndexConfigImageFocusLock,
1363                            &lock);
1364
1365    if ( OMX_ErrorNone != eError )
1366    {
1367        CAMHAL_LOGEB("Error GetConfig Focus Lock error = 0x%x", eError);
1368        goto EXIT;
1369    }
1370    else
1371    {
1372        CAMHAL_LOGDB("Focus Lock GetConfig successfull bLock(%d)", lock.bLock);
1373
1374        /* Apply locks only when not applied already */
1375        if ( lock.bLock  != toggleFocus )
1376        {
1377            setFocusLock(mParameters3A);
1378        }
1379    }
1380
1381    OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1382    lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1383    eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1384                            (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock,
1385                            &lock);
1386
1387    if ( OMX_ErrorNone != eError )
1388    {
1389        CAMHAL_LOGEB("Error GetConfig WhiteBalance Lock error = 0x%x", eError);
1390        goto EXIT;
1391    }
1392    else
1393    {
1394        const char *lock_state_wb = toggleWb ? TRUE : FALSE;
1395        CAMHAL_LOGDA("WhiteBalance Lock GetConfig successfull");
1396
1397        /* Apply locks only when not applied already */
1398        if ( lock.bLock != toggleWb )
1399        {
1400            setWhiteBalanceLock(mParameters3A);
1401        }
1402
1403        mParams.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, lock_state_wb);
1404    }
1405 EXIT:
1406    return ErrorUtils::omxToAndroidError(eError);
1407}
1408
1409status_t OMXCameraAdapter::setMeteringAreas(Gen3A_settings& Gen3A)
1410{
1411  status_t ret = NO_ERROR;
1412  OMX_ERRORTYPE eError = OMX_ErrorNone;
1413
1414  OMX_ALGOAREASTYPE **meteringAreas;
1415  OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer;
1416  MemoryManager memMgr;
1417  int areasSize = 0;
1418
1419  LOG_FUNCTION_NAME
1420
1421  Mutex::Autolock lock(mMeteringAreasLock);
1422
1423  if ( OMX_StateInvalid == mComponentState )
1424    {
1425      CAMHAL_LOGEA("OMX component is in invalid state");
1426      return NO_INIT;
1427    }
1428
1429  areasSize = ((sizeof(OMX_ALGOAREASTYPE)+4095)/4096)*4096;
1430  meteringAreas = (OMX_ALGOAREASTYPE**) memMgr.allocateBuffer(0, 0, NULL, areasSize, 1);
1431
1432  OMXCameraPortParameters * mPreviewData = NULL;
1433  mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex];
1434
1435  if (!meteringAreas)
1436      {
1437      CAMHAL_LOGEB("Error allocating buffer for metering areas %d", eError);
1438      return -ENOMEM;
1439      }
1440
1441  OMX_INIT_STRUCT_PTR (meteringAreas[0], OMX_ALGOAREASTYPE);
1442
1443  meteringAreas[0]->nPortIndex = OMX_ALL;
1444  meteringAreas[0]->nNumAreas = mMeteringAreas.size();
1445  meteringAreas[0]->nAlgoAreaPurpose = OMX_AlgoAreaExposure;
1446
1447  for ( unsigned int n = 0; n < mMeteringAreas.size(); n++)
1448      {
1449      // transform the coordinates to 3A-type coordinates
1450      mMeteringAreas.itemAt(n)->transfrom((size_t)mPreviewData->mWidth,
1451                                      (size_t)mPreviewData->mHeight,
1452                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nTop,
1453                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nLeft,
1454                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nWidth,
1455                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nHeight);
1456
1457      meteringAreas[0]->tAlgoAreas[n].nLeft =
1458              ( meteringAreas[0]->tAlgoAreas[n].nLeft * METERING_AREAS_RANGE ) / mPreviewData->mWidth;
1459      meteringAreas[0]->tAlgoAreas[n].nTop =
1460              ( meteringAreas[0]->tAlgoAreas[n].nTop* METERING_AREAS_RANGE ) / mPreviewData->mHeight;
1461      meteringAreas[0]->tAlgoAreas[n].nWidth =
1462              ( meteringAreas[0]->tAlgoAreas[n].nWidth * METERING_AREAS_RANGE ) / mPreviewData->mWidth;
1463      meteringAreas[0]->tAlgoAreas[n].nHeight =
1464              ( meteringAreas[0]->tAlgoAreas[n].nHeight * METERING_AREAS_RANGE ) / mPreviewData->mHeight;
1465
1466      meteringAreas[0]->tAlgoAreas[n].nPriority = mMeteringAreas.itemAt(n)->getWeight();
1467
1468      CAMHAL_LOGDB("Metering area %d : top = %d left = %d width = %d height = %d prio = %d",
1469              n, (int)meteringAreas[0]->tAlgoAreas[n].nTop, (int)meteringAreas[0]->tAlgoAreas[n].nLeft,
1470              (int)meteringAreas[0]->tAlgoAreas[n].nWidth, (int)meteringAreas[0]->tAlgoAreas[n].nHeight,
1471              (int)meteringAreas[0]->tAlgoAreas[n].nPriority);
1472
1473      }
1474
1475  OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER);
1476
1477  sharedBuffer.nPortIndex = OMX_ALL;
1478  sharedBuffer.nSharedBuffSize = areasSize;
1479  sharedBuffer.pSharedBuff = (OMX_U8 *) meteringAreas[0];
1480
1481  if ( NULL == sharedBuffer.pSharedBuff )
1482      {
1483      CAMHAL_LOGEA("No resources to allocate OMX shared buffer");
1484      ret = -ENOMEM;
1485      goto EXIT;
1486      }
1487
1488      eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1489                                (OMX_INDEXTYPE) OMX_TI_IndexConfigAlgoAreas, &sharedBuffer);
1490
1491  if ( OMX_ErrorNone != eError )
1492      {
1493      CAMHAL_LOGEB("Error while setting Focus Areas configuration 0x%x", eError);
1494      ret = -EINVAL;
1495      }
1496  else
1497      {
1498      CAMHAL_LOGDA("Metering Areas SetConfig successfull.");
1499      }
1500
1501 EXIT:
1502  if (NULL != meteringAreas)
1503      {
1504      memMgr.freeBuffer((void*) meteringAreas);
1505      meteringAreas = NULL;
1506      }
1507
1508  return ret;
1509}
1510
1511status_t OMXCameraAdapter::apply3Asettings( Gen3A_settings& Gen3A )
1512{
1513    status_t ret = NO_ERROR;
1514    unsigned int currSett; // 32 bit
1515    int portIndex;
1516
1517    LOG_FUNCTION_NAME;
1518
1519    Mutex::Autolock lock(m3ASettingsUpdateLock);
1520
1521    /*
1522     * Scenes have a priority during the process
1523     * of applying 3A related parameters.
1524     * They can override pretty much all other 3A
1525     * settings and similarly get overridden when
1526     * for instance the focus mode gets switched.
1527     * There is only one exception to this rule,
1528     * the manual a.k.a. auto scene.
1529     */
1530    if (SetSceneMode & mPending3Asettings) {
1531        mPending3Asettings &= ~SetSceneMode;
1532        ret |= setScene(Gen3A);
1533        // re-apply EV compensation after setting scene mode since it probably reset it
1534        if(Gen3A.EVCompensation) {
1535            setEVCompensation(Gen3A);
1536        }
1537        return ret;
1538    } else if (OMX_Manual != Gen3A.SceneMode) {
1539        // only certain settings are allowed when scene mode is set
1540        mPending3Asettings &= (SetEVCompensation | SetFocus);
1541        if ( mPending3Asettings == 0 ) return NO_ERROR;
1542    }
1543
1544    for( currSett = 1; currSett < E3aSettingMax; currSett <<= 1)
1545        {
1546        if( currSett & mPending3Asettings )
1547            {
1548            switch( currSett )
1549                {
1550                case SetEVCompensation:
1551                    {
1552                    ret |= setEVCompensation(Gen3A);
1553                    break;
1554                    }
1555
1556                case SetWhiteBallance:
1557                    {
1558                    ret |= setWBMode(Gen3A);
1559                    break;
1560                    }
1561
1562                case SetFlicker:
1563                    {
1564                    ret |= setFlicker(Gen3A);
1565                    break;
1566                    }
1567
1568                case SetBrightness:
1569                    {
1570                    ret |= setBrightness(Gen3A);
1571                    break;
1572                    }
1573
1574                case SetContrast:
1575                    {
1576                    ret |= setContrast(Gen3A);
1577                    break;
1578                    }
1579
1580                case SetSharpness:
1581                    {
1582                    ret |= setSharpness(Gen3A);
1583                    break;
1584                    }
1585
1586                case SetSaturation:
1587                    {
1588                    ret |= setSaturation(Gen3A);
1589                    break;
1590                    }
1591
1592                case SetISO:
1593                    {
1594                    ret |= setISO(Gen3A);
1595                    break;
1596                    }
1597
1598                case SetEffect:
1599                    {
1600                    ret |= setEffect(Gen3A);
1601                    break;
1602                    }
1603
1604                case SetFocus:
1605                    {
1606                    ret |= setFocusMode(Gen3A);
1607                    break;
1608                    }
1609
1610                case SetExpMode:
1611                    {
1612                    ret |= setExposureMode(Gen3A);
1613                    break;
1614                    }
1615
1616                case SetFlash:
1617                    {
1618                    ret |= setFlashMode(Gen3A);
1619                    break;
1620                    }
1621
1622                case SetExpLock:
1623                  {
1624                    ret |= setExposureLock(Gen3A);
1625                    break;
1626                  }
1627
1628                case SetWBLock:
1629                  {
1630                    ret |= setWhiteBalanceLock(Gen3A);
1631                    break;
1632                  }
1633                case SetMeteringAreas:
1634                  {
1635                    ret |= setMeteringAreas(Gen3A);
1636                  }
1637                  break;
1638                default:
1639                    CAMHAL_LOGEB("this setting (0x%x) is still not supported in CameraAdapter ",
1640                                 currSett);
1641                    break;
1642                }
1643                mPending3Asettings &= ~currSett;
1644            }
1645        }
1646
1647        LOG_FUNCTION_NAME_EXIT;
1648
1649        return ret;
1650}
1651
1652};
1653