OMX3A.cpp revision 708ed7306c85286aa50d05ba15e0c33106e52ed0
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
33#define TRUE "true"
34#define FALSE "false"
35
36#define METERING_AREAS_RANGE 0xFF
37
38namespace android {
39
40status_t OMXCameraAdapter::setParameters3A(const CameraParameters &params,
41                                           BaseCameraAdapter::AdapterState state)
42{
43    status_t ret = NO_ERROR;
44    int mode = 0;
45    const char *str = NULL;
46
47    LOG_FUNCTION_NAME;
48
49    str = params.get(TICameraParameters::KEY_EXPOSURE_MODE);
50    mode = getLUTvalue_HALtoOMX( str, ExpLUT);
51    if ( ( str != NULL ) && ( mParameters3A.Exposure != mode ))
52        {
53        mParameters3A.Exposure = mode;
54        CAMHAL_LOGDB("Exposure mode %d", mode);
55        if ( 0 <= mParameters3A.Exposure )
56            {
57            mPending3Asettings |= SetExpMode;
58            }
59        }
60
61    str = params.get(CameraParameters::KEY_WHITE_BALANCE);
62    mode = getLUTvalue_HALtoOMX( str, WBalLUT);
63    if (mFirstTimeInit || ((str != NULL) && (mode != mParameters3A.WhiteBallance)))
64        {
65        mParameters3A.WhiteBallance = mode;
66        CAMHAL_LOGDB("Whitebalance mode %d", mode);
67        if ( 0 <= mParameters3A.WhiteBallance )
68            {
69            mPending3Asettings |= SetWhiteBallance;
70            }
71        }
72
73    if ( 0 <= params.getInt(TICameraParameters::KEY_CONTRAST) )
74        {
75        if ( mFirstTimeInit ||
76             ( (mParameters3A.Contrast  + CONTRAST_OFFSET) !=
77                     params.getInt(TICameraParameters::KEY_CONTRAST)) )
78            {
79            mParameters3A.Contrast = params.getInt(TICameraParameters::KEY_CONTRAST) - CONTRAST_OFFSET;
80            CAMHAL_LOGDB("Contrast %d", mParameters3A.Contrast);
81            mPending3Asettings |= SetContrast;
82            }
83        }
84
85    if ( 0 <= params.getInt(TICameraParameters::KEY_SHARPNESS) )
86        {
87        if ( mFirstTimeInit ||
88             ((mParameters3A.Sharpness + SHARPNESS_OFFSET) !=
89                     params.getInt(TICameraParameters::KEY_SHARPNESS)))
90            {
91            mParameters3A.Sharpness = params.getInt(TICameraParameters::KEY_SHARPNESS) - SHARPNESS_OFFSET;
92            CAMHAL_LOGDB("Sharpness %d", mParameters3A.Sharpness);
93            mPending3Asettings |= SetSharpness;
94            }
95        }
96
97    if ( 0 <= params.getInt(TICameraParameters::KEY_SATURATION) )
98        {
99        if ( mFirstTimeInit ||
100             ((mParameters3A.Saturation + SATURATION_OFFSET) !=
101                     params.getInt(TICameraParameters::KEY_SATURATION)) )
102            {
103            mParameters3A.Saturation = params.getInt(TICameraParameters::KEY_SATURATION) - SATURATION_OFFSET;
104            CAMHAL_LOGDB("Saturation %d", mParameters3A.Saturation);
105            mPending3Asettings |= SetSaturation;
106            }
107        }
108
109    if ( 0 <= params.getInt(TICameraParameters::KEY_BRIGHTNESS) )
110        {
111        if ( mFirstTimeInit ||
112             (( mParameters3A.Brightness !=
113                     ( unsigned int ) params.getInt(TICameraParameters::KEY_BRIGHTNESS))) )
114            {
115            mParameters3A.Brightness = (unsigned)params.getInt(TICameraParameters::KEY_BRIGHTNESS);
116            CAMHAL_LOGDB("Brightness %d", mParameters3A.Brightness);
117            mPending3Asettings |= SetBrightness;
118            }
119        }
120
121    str = params.get(CameraParameters::KEY_ANTIBANDING);
122    mode = getLUTvalue_HALtoOMX(str,FlickerLUT);
123    if ( mFirstTimeInit || ( ( str != NULL ) && ( mParameters3A.Flicker != mode ) ))
124        {
125        mParameters3A.Flicker = mode;
126        CAMHAL_LOGDB("Flicker %d", mParameters3A.Flicker);
127        if ( 0 <= mParameters3A.Flicker )
128            {
129            mPending3Asettings |= SetFlicker;
130            }
131        }
132
133    str = params.get(TICameraParameters::KEY_ISO);
134    mode = getLUTvalue_HALtoOMX(str, IsoLUT);
135    CAMHAL_LOGVB("ISO mode arrived in HAL : %s", str);
136    if ( mFirstTimeInit || (  ( str != NULL ) && ( mParameters3A.ISO != mode )) )
137        {
138        mParameters3A.ISO = mode;
139        CAMHAL_LOGDB("ISO %d", mParameters3A.ISO);
140        if ( 0 <= mParameters3A.ISO )
141            {
142            mPending3Asettings |= SetISO;
143            }
144        }
145
146    str = params.get(CameraParameters::KEY_FOCUS_MODE);
147    mode = getLUTvalue_HALtoOMX(str, FocusLUT);
148    if ( (mFirstTimeInit || ((str != NULL) && (mParameters3A.Focus != mode))))
149        {
150        //Apply focus mode immediatly only if  CAF  or Inifinity are selected
151        if ( ( mode == OMX_IMAGE_FocusControlAuto ) ||
152             ( mode == OMX_IMAGE_FocusControlAutoInfinity ) )
153            {
154            mPending3Asettings |= SetFocus;
155            }
156
157        mParameters3A.Focus = mode;
158        CAMHAL_LOGDB("Focus %x", mParameters3A.Focus);
159        }
160
161    str = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION);
162    if ( mFirstTimeInit ||
163          (( str != NULL ) &&
164                  (mParameters3A.EVCompensation !=
165                          params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION))))
166        {
167        CAMHAL_LOGDB("Setting EV Compensation to %d",
168                     params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION));
169
170        mParameters3A.EVCompensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
171        mPending3Asettings |= SetEVCompensation;
172        }
173
174    str = params.get(CameraParameters::KEY_SCENE_MODE);
175    mode = getLUTvalue_HALtoOMX( str, SceneLUT);
176    if (  mFirstTimeInit || (( str != NULL ) && ( mParameters3A.SceneMode != mode )) )
177        {
178        if ( 0 <= mode )
179            {
180            mParameters3A.SceneMode = mode;
181            mPending3Asettings |= SetSceneMode;
182            }
183        else
184            {
185            mParameters3A.SceneMode = OMX_Manual;
186            }
187
188        CAMHAL_LOGDB("SceneMode %d", mParameters3A.SceneMode);
189        }
190
191    str = params.get(CameraParameters::KEY_FLASH_MODE);
192    mode = getLUTvalue_HALtoOMX( str, FlashLUT);
193    if (  mFirstTimeInit || (( str != NULL ) && ( mParameters3A.FlashMode != mode )) )
194        {
195        if ( 0 <= mode )
196            {
197            mParameters3A.FlashMode = mode;
198            mPending3Asettings |= SetFlash;
199            }
200        else
201            {
202            mParameters3A.FlashMode = OMX_Manual;
203            }
204        }
205
206    CAMHAL_LOGVB("Flash Setting %s", str);
207    CAMHAL_LOGVB("FlashMode %d", mParameters3A.FlashMode);
208
209    str = params.get(CameraParameters::KEY_EFFECT);
210    mode = getLUTvalue_HALtoOMX( str, EffLUT);
211    if (  mFirstTimeInit || (( str != NULL ) && ( mParameters3A.Effect != mode )) )
212        {
213        mParameters3A.Effect = mode;
214        CAMHAL_LOGDB("Effect %d", mParameters3A.Effect);
215        if ( 0 <= mParameters3A.Effect )
216            {
217            mPending3Asettings |= SetEffect;
218            }
219        }
220
221    str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED);
222    if ( (str != NULL) && (!strcmp(str, "true")) )
223      {
224        OMX_BOOL lock = OMX_FALSE;
225        str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK);
226        if ( (strcmp(str, "true")) == 0)
227          {
228            CAMHAL_LOGVA("Locking Exposure");
229            lock = OMX_TRUE;
230          }
231        else
232          {
233            CAMHAL_LOGVA("UnLocking Exposure");
234          }
235        if (mParameters3A.ExposureLock != lock)
236          {
237            mParameters3A.ExposureLock = lock;
238            CAMHAL_LOGDB("ExposureLock %d", lock);
239            mPending3Asettings |= SetExpLock;
240          }
241      }
242
243    str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED);
244    if ( (str != NULL) && (!strcmp(str, "true")) )
245      {
246        OMX_BOOL lock = OMX_FALSE;
247        str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK);
248        if ( (strcmp(str, "true")) == 0)
249          {
250            CAMHAL_LOGVA("Locking WhiteBalance");
251            lock = OMX_TRUE;
252          }
253        else
254          {
255            CAMHAL_LOGVA("UnLocking WhiteBalance");
256          }
257        if (mParameters3A.WhiteBalanceLock != lock)
258          {
259            mParameters3A.WhiteBalanceLock = lock;
260            CAMHAL_LOGDB("WhiteBalanceLock %d", lock);
261            mPending3Asettings |= SetWBLock;
262          }
263      }
264
265    str = params.get(CameraParameters::KEY_METERING_AREAS);
266    if ( (str != NULL) )
267        {
268        size_t MAX_METERING_AREAS;
269        MAX_METERING_AREAS = atoi(params.get(CameraParameters::KEY_MAX_NUM_METERING_AREAS));
270
271        mMeteringAreas.clear();
272
273        CameraArea::parseFocusArea(str, strlen(str), mMeteringAreas);
274
275        if ( MAX_METERING_AREAS > mMeteringAreas.size() )
276            {
277            CAMHAL_LOGDB("Setting Metering Areas %s",
278                    params.get(CameraParameters::KEY_METERING_AREAS));
279
280            mPending3Asettings |= SetMeteringAreas;
281            }
282        else
283            {
284            CAMHAL_LOGEB("Metering areas supported %d, metering areas set %d",
285                         MAX_METERING_AREAS, mMeteringAreas.size());
286            }
287        }
288
289    LOG_FUNCTION_NAME_EXIT;
290
291    return ret;
292}
293
294int OMXCameraAdapter::getLUTvalue_HALtoOMX(const char * HalValue, LUTtype LUT)
295{
296    int LUTsize = LUT.size;
297    if( HalValue )
298        for(int i = 0; i < LUTsize; i++)
299            if( 0 == strcmp(LUT.Table[i].userDefinition, HalValue) )
300                return LUT.Table[i].omxDefinition;
301
302    return -ENOENT;
303}
304
305const char* OMXCameraAdapter::getLUTvalue_OMXtoHAL(int OMXValue, LUTtype LUT)
306{
307    int LUTsize = LUT.size;
308    for(int i = 0; i < LUTsize; i++)
309        if( LUT.Table[i].omxDefinition == OMXValue )
310            return LUT.Table[i].userDefinition;
311
312    return NULL;
313}
314
315status_t OMXCameraAdapter::apply3ADefaults(Gen3A_settings &Gen3A)
316{
317    status_t ret = NO_ERROR;
318
319    LOG_FUNCTION_NAME;
320
321    Gen3A.Effect = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EFFECT, EffLUT);
322    ret |= setEffect(Gen3A);
323
324    Gen3A.FlashMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FLASH_MODE, FlashLUT);
325    ret |= setFlashMode(Gen3A);
326
327    Gen3A.SceneMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_SCENE_MODE, SceneLUT);
328    ret |= setScene(Gen3A);
329
330    Gen3A.EVCompensation = atoi(OMXCameraAdapter::DEFAULT_EV_COMPENSATION);
331    ret |= setEVCompensation(Gen3A);
332
333    Gen3A.Focus = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FOCUS_MODE, FocusLUT);
334    ret |= setFocusMode(Gen3A);
335
336    Gen3A.ISO = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ISO_MODE, IsoLUT);
337    ret |= setISO(Gen3A);
338
339    Gen3A.Flicker = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ANTIBANDING, FlickerLUT);
340    ret |= setFlicker(Gen3A);
341
342    Gen3A.Brightness = atoi(OMXCameraAdapter::DEFAULT_BRIGHTNESS);
343    ret |= setBrightness(Gen3A);
344
345    Gen3A.Saturation = atoi(OMXCameraAdapter::DEFAULT_SATURATION);
346    ret |= setSaturation(Gen3A);
347
348    Gen3A.Sharpness = atoi(OMXCameraAdapter::DEFAULT_SHARPNESS);
349    ret |= setSharpness(Gen3A);
350
351    Gen3A.Contrast = atoi(OMXCameraAdapter::DEFAULT_CONTRAST);
352    ret |= setContrast(Gen3A);
353
354    Gen3A.WhiteBallance = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_WB, WBalLUT);
355    ret |= setWBMode(Gen3A);
356
357    Gen3A.Exposure = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EXPOSURE_MODE, ExpLUT);
358    ret |= setExposureMode(Gen3A);
359
360    Gen3A.ExposureLock = OMX_FALSE;
361    ret |= setExposureLock(Gen3A);
362
363    Gen3A.WhiteBalanceLock = OMX_FALSE;
364    ret |= setWhiteBalanceLock(Gen3A);
365
366    LOG_FUNCTION_NAME_EXIT;
367
368    return NO_ERROR;
369}
370
371status_t OMXCameraAdapter::setExposureMode(Gen3A_settings& Gen3A)
372{
373    OMX_ERRORTYPE eError = OMX_ErrorNone;
374    OMX_CONFIG_EXPOSURECONTROLTYPE exp;
375
376    LOG_FUNCTION_NAME;
377
378    if ( OMX_StateInvalid == mComponentState )
379        {
380        CAMHAL_LOGEA("OMX component is in invalid state");
381        return NO_INIT;
382        }
383
384    OMX_INIT_STRUCT_PTR (&exp, OMX_CONFIG_EXPOSURECONTROLTYPE);
385    exp.nPortIndex = OMX_ALL;
386    exp.eExposureControl = (OMX_EXPOSURECONTROLTYPE)Gen3A.Exposure;
387
388///FIXME: Face priority exposure metering is not stable because of varying face sizes
389///coming from the FD module. So disabling it for now.
390#if 0
391    if ( mFaceDetectionRunning )
392        {
393        //Disable Region priority and enable Face priority
394        setAlgoPriority(REGION_PRIORITY, EXPOSURE_ALGO, false);
395        setAlgoPriority(FACE_PRIORITY, EXPOSURE_ALGO, true);
396        }
397    else
398#endif
399        {
400        //Disable Region priority and Face priority
401        setAlgoPriority(REGION_PRIORITY, EXPOSURE_ALGO, false);
402        setAlgoPriority(FACE_PRIORITY, EXPOSURE_ALGO, false);
403        }
404
405    eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
406                            OMX_IndexConfigCommonExposure,
407                            &exp);
408    if ( OMX_ErrorNone != eError )
409        {
410        CAMHAL_LOGEB("Error while configuring exposure mode 0x%x", eError);
411        }
412    else
413        {
414        CAMHAL_LOGDA("Camera exposure mode configured successfully");
415        }
416
417    LOG_FUNCTION_NAME_EXIT;
418
419    return ErrorUtils::omxToAndroidError(eError);
420}
421
422status_t OMXCameraAdapter::setFlashMode(Gen3A_settings& Gen3A)
423{
424    status_t ret = NO_ERROR;
425    OMX_ERRORTYPE eError = OMX_ErrorNone;
426    OMX_IMAGE_PARAM_FLASHCONTROLTYPE flash;
427
428    LOG_FUNCTION_NAME;
429
430    if ( OMX_StateInvalid == mComponentState )
431        {
432        CAMHAL_LOGEA("OMX component is in invalid state");
433        return NO_INIT;
434        }
435
436    OMX_INIT_STRUCT_PTR (&flash, OMX_IMAGE_PARAM_FLASHCONTROLTYPE);
437    flash.nPortIndex = OMX_ALL;
438    flash.eFlashControl = ( OMX_IMAGE_FLASHCONTROLTYPE ) Gen3A.FlashMode;
439
440    CAMHAL_LOGDB("Configuring flash mode 0x%x", flash.eFlashControl);
441    eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
442                            (OMX_INDEXTYPE) OMX_IndexConfigFlashControl,
443                            &flash);
444    if ( OMX_ErrorNone != eError )
445        {
446        CAMHAL_LOGEB("Error while configuring flash mode 0x%x", eError);
447        }
448    else
449        {
450        CAMHAL_LOGDA("Camera flash mode configured successfully");
451        }
452
453    LOG_FUNCTION_NAME_EXIT;
454
455    return ErrorUtils::omxToAndroidError(eError);
456}
457
458status_t OMXCameraAdapter::setFocusMode(Gen3A_settings& Gen3A)
459{
460    status_t ret = NO_ERROR;
461    OMX_ERRORTYPE eError = OMX_ErrorNone;
462    OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focus;
463    size_t top, left, width, height, weight;
464    sp<CameraArea> focusArea = NULL;
465
466    LOG_FUNCTION_NAME;
467
468    BaseCameraAdapter::AdapterState state;
469    BaseCameraAdapter::getState(state);
470
471    if ( OMX_StateInvalid == mComponentState )
472        {
473        CAMHAL_LOGEA("OMX component is in invalid state");
474        return NO_INIT;
475        }
476
477        {
478        Mutex::Autolock lock(mFocusAreasLock);
479
480        if ( !mFocusAreas.isEmpty() )
481            {
482            focusArea = mFocusAreas.itemAt(0);
483            }
484        }
485
486    ///Face detection takes precedence over touch AF
487    if ( mFaceDetectionRunning )
488        {
489        //Disable region priority first
490        setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false);
491
492        //Enable face algorithm priority for focus
493        setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO , true);
494
495        //Do normal focus afterwards
496        ////FIXME: Check if the extended focus control is needed? this overrides caf
497        //focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended;
498        }
499    else if ( ( NULL != focusArea.get() ) && ( focusArea->isValid() ) )
500        {
501
502        //Disable face priority first
503        setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false);
504
505        //Enable region algorithm priority
506        setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true);
507
508        setTouchFocus();
509
510        //Do normal focus afterwards
511        //FIXME: Check if the extended focus control is needed? this overrides caf
512        //focus.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlExtended;
513
514        }
515    else
516        {
517
518        //Disable both region and face priority
519        setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false);
520
521        setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false);
522
523        }
524
525    if ( NO_ERROR == ret && ((state & AF_ACTIVE) == 0) )
526        {
527        OMX_INIT_STRUCT_PTR (&focus, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
528        focus.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
529        focus.eFocusControl = (OMX_IMAGE_FOCUSCONTROLTYPE)Gen3A.Focus;
530
531        CAMHAL_LOGDB("Configuring focus mode 0x%x", focus.eFocusControl);
532        eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp, OMX_IndexConfigFocusControl, &focus);
533        if ( OMX_ErrorNone != eError )
534            {
535            CAMHAL_LOGEB("Error while configuring focus mode 0x%x", eError);
536            }
537        else
538            {
539            CAMHAL_LOGDA("Camera focus mode configured successfully");
540            }
541        }
542
543    LOG_FUNCTION_NAME_EXIT;
544
545    return ErrorUtils::omxToAndroidError(eError);
546}
547
548status_t OMXCameraAdapter::setScene(Gen3A_settings& Gen3A)
549{
550    OMX_ERRORTYPE eError = OMX_ErrorNone;
551    OMX_CONFIG_SCENEMODETYPE scene;
552
553    LOG_FUNCTION_NAME;
554
555    if ( OMX_StateInvalid == mComponentState )
556        {
557        CAMHAL_LOGEA("OMX component is in invalid state");
558        return NO_INIT;
559        }
560
561    OMX_INIT_STRUCT_PTR (&scene, OMX_CONFIG_SCENEMODETYPE);
562    scene.nPortIndex = OMX_ALL;
563    scene.eSceneMode = ( OMX_SCENEMODETYPE ) Gen3A.SceneMode;
564
565    CAMHAL_LOGDB("Configuring scene mode 0x%x", scene.eSceneMode);
566    eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
567                            ( OMX_INDEXTYPE ) OMX_TI_IndexConfigSceneMode,
568                            &scene);
569    if ( OMX_ErrorNone != eError )
570        {
571        CAMHAL_LOGEB("Error while configuring scene mode 0x%x", eError);
572        }
573    else
574        {
575        CAMHAL_LOGDA("Camera scene configured successfully");
576        }
577
578    LOG_FUNCTION_NAME_EXIT;
579
580    return ErrorUtils::omxToAndroidError(eError);
581}
582
583status_t OMXCameraAdapter::setEVCompensation(Gen3A_settings& Gen3A)
584{
585    OMX_ERRORTYPE eError = OMX_ErrorNone;
586    OMX_CONFIG_EXPOSUREVALUETYPE expValues;
587
588    LOG_FUNCTION_NAME;
589
590    if ( OMX_StateInvalid == mComponentState )
591        {
592        CAMHAL_LOGEA("OMX component is in invalid state");
593        return NO_INIT;
594        }
595
596    OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE);
597    expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
598
599    OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
600                   OMX_IndexConfigCommonExposureValue,
601                   &expValues);
602    CAMHAL_LOGDB("old EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation);
603    CAMHAL_LOGDB("EV Compensation for HAL = %d", Gen3A.EVCompensation);
604
605    expValues.xEVCompensation = ( Gen3A.EVCompensation * ( 1 << Q16_OFFSET ) )  / 10;
606    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
607                            OMX_IndexConfigCommonExposureValue,
608                            &expValues);
609    CAMHAL_LOGDB("new EV Compensation for OMX = 0x%x", (int)expValues.xEVCompensation);
610    if ( OMX_ErrorNone != eError )
611        {
612        CAMHAL_LOGEB("Error while configuring EV Compensation 0x%x error = 0x%x",
613                     ( unsigned int ) expValues.xEVCompensation,
614                     eError);
615        }
616    else
617        {
618        CAMHAL_LOGDB("EV Compensation 0x%x configured successfully",
619                     ( unsigned int ) expValues.xEVCompensation);
620        }
621
622    LOG_FUNCTION_NAME_EXIT;
623
624    return ErrorUtils::omxToAndroidError(eError);
625}
626
627status_t OMXCameraAdapter::setWBMode(Gen3A_settings& Gen3A)
628{
629    OMX_ERRORTYPE eError = OMX_ErrorNone;
630    OMX_CONFIG_WHITEBALCONTROLTYPE wb;
631
632    LOG_FUNCTION_NAME;
633
634    if ( OMX_StateInvalid == mComponentState )
635        {
636        CAMHAL_LOGEA("OMX component is in invalid state");
637        return NO_INIT;
638        }
639
640    OMX_INIT_STRUCT_PTR (&wb, OMX_CONFIG_WHITEBALCONTROLTYPE);
641    wb.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
642    wb.eWhiteBalControl = ( OMX_WHITEBALCONTROLTYPE ) Gen3A.WhiteBallance;
643
644    if ( WB_FACE_PRIORITY == Gen3A.WhiteBallance )
645        {
646        //Disable Region priority and enable Face priority
647        setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false);
648        setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, true);
649
650        //Then set the mode to auto
651        wb.eWhiteBalControl = OMX_WhiteBalControlAuto;
652        }
653    else
654        {
655        //Disable Face and Region priority
656        setAlgoPriority(FACE_PRIORITY, WHITE_BALANCE_ALGO, false);
657        setAlgoPriority(REGION_PRIORITY, WHITE_BALANCE_ALGO, false);
658        }
659
660    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
661                         OMX_IndexConfigCommonWhiteBalance,
662                         &wb);
663    if ( OMX_ErrorNone != eError )
664        {
665        CAMHAL_LOGEB("Error while configuring Whitebalance mode 0x%x error = 0x%x",
666                     ( unsigned int ) wb.eWhiteBalControl,
667                     eError);
668        }
669    else
670        {
671        CAMHAL_LOGDB("Whitebalance mode 0x%x configured successfully",
672                     ( unsigned int ) wb.eWhiteBalControl);
673        }
674
675    LOG_FUNCTION_NAME_EXIT;
676
677    return eError;
678}
679
680status_t OMXCameraAdapter::setFlicker(Gen3A_settings& Gen3A)
681{
682    OMX_ERRORTYPE eError = OMX_ErrorNone;
683    OMX_CONFIG_FLICKERCANCELTYPE flicker;
684
685    LOG_FUNCTION_NAME;
686
687    if ( OMX_StateInvalid == mComponentState )
688        {
689        CAMHAL_LOGEA("OMX component is in invalid state");
690        return NO_INIT;
691        }
692
693    OMX_INIT_STRUCT_PTR (&flicker, OMX_CONFIG_FLICKERCANCELTYPE);
694    flicker.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
695    flicker.eFlickerCancel = (OMX_COMMONFLICKERCANCELTYPE)Gen3A.Flicker;
696
697    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
698                            (OMX_INDEXTYPE)OMX_IndexConfigFlickerCancel,
699                            &flicker );
700    if ( OMX_ErrorNone != eError )
701        {
702        CAMHAL_LOGEB("Error while configuring Flicker mode 0x%x error = 0x%x",
703                     ( unsigned int ) flicker.eFlickerCancel,
704                     eError);
705        }
706    else
707        {
708        CAMHAL_LOGDB("Flicker mode 0x%x configured successfully",
709                     ( unsigned int ) flicker.eFlickerCancel);
710        }
711
712    LOG_FUNCTION_NAME_EXIT;
713
714    return ErrorUtils::omxToAndroidError(eError);
715}
716
717status_t OMXCameraAdapter::setBrightness(Gen3A_settings& Gen3A)
718{
719    OMX_ERRORTYPE eError = OMX_ErrorNone;
720    OMX_CONFIG_BRIGHTNESSTYPE brightness;
721
722    LOG_FUNCTION_NAME;
723
724    if ( OMX_StateInvalid == mComponentState )
725        {
726        CAMHAL_LOGEA("OMX component is in invalid state");
727        return NO_INIT;
728        }
729
730    OMX_INIT_STRUCT_PTR (&brightness, OMX_CONFIG_BRIGHTNESSTYPE);
731    brightness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
732    brightness.nBrightness = Gen3A.Brightness;
733
734    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
735                         OMX_IndexConfigCommonBrightness,
736                         &brightness);
737    if ( OMX_ErrorNone != eError )
738        {
739        CAMHAL_LOGEB("Error while configuring Brightness 0x%x error = 0x%x",
740                     ( unsigned int ) brightness.nBrightness,
741                     eError);
742        }
743    else
744        {
745        CAMHAL_LOGDB("Brightness 0x%x configured successfully",
746                     ( unsigned int ) brightness.nBrightness);
747        }
748
749    LOG_FUNCTION_NAME_EXIT;
750
751    return ErrorUtils::omxToAndroidError(eError);
752}
753
754status_t OMXCameraAdapter::setContrast(Gen3A_settings& Gen3A)
755{
756    OMX_ERRORTYPE eError = OMX_ErrorNone;
757    OMX_CONFIG_CONTRASTTYPE contrast;
758
759    LOG_FUNCTION_NAME;
760
761    if ( OMX_StateInvalid == mComponentState )
762        {
763        CAMHAL_LOGEA("OMX component is in invalid state");
764        return NO_INIT;
765        }
766
767    OMX_INIT_STRUCT_PTR (&contrast, OMX_CONFIG_CONTRASTTYPE);
768    contrast.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
769    contrast.nContrast = Gen3A.Contrast;
770
771    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
772                         OMX_IndexConfigCommonContrast,
773                         &contrast);
774    if ( OMX_ErrorNone != eError )
775        {
776        CAMHAL_LOGEB("Error while configuring Contrast 0x%x error = 0x%x",
777                     ( unsigned int ) contrast.nContrast,
778                     eError);
779        }
780    else
781        {
782        CAMHAL_LOGDB("Contrast 0x%x configured successfully",
783                     ( unsigned int ) contrast.nContrast);
784        }
785
786    LOG_FUNCTION_NAME_EXIT;
787
788    return eError;
789}
790
791status_t OMXCameraAdapter::setSharpness(Gen3A_settings& Gen3A)
792{
793    OMX_ERRORTYPE eError = OMX_ErrorNone;
794    OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE procSharpness;
795
796    LOG_FUNCTION_NAME;
797
798    if ( OMX_StateInvalid == mComponentState )
799        {
800        CAMHAL_LOGEA("OMX component is in invalid state");
801        return NO_INIT;
802        }
803
804    OMX_INIT_STRUCT_PTR (&procSharpness, OMX_IMAGE_CONFIG_PROCESSINGLEVELTYPE);
805    procSharpness.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
806    procSharpness.nLevel = Gen3A.Sharpness;
807
808    if( procSharpness.nLevel == 0 )
809        {
810        procSharpness.bAuto = OMX_TRUE;
811        }
812    else
813        {
814        procSharpness.bAuto = OMX_FALSE;
815        }
816
817    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
818                         (OMX_INDEXTYPE)OMX_IndexConfigSharpeningLevel,
819                         &procSharpness);
820    if ( OMX_ErrorNone != eError )
821        {
822        CAMHAL_LOGEB("Error while configuring Sharpness 0x%x error = 0x%x",
823                     ( unsigned int ) procSharpness.nLevel,
824                     eError);
825        }
826    else
827        {
828        CAMHAL_LOGDB("Sharpness 0x%x configured successfully",
829                     ( unsigned int ) procSharpness.nLevel);
830        }
831
832    LOG_FUNCTION_NAME_EXIT;
833
834    return ErrorUtils::omxToAndroidError(eError);
835}
836
837status_t OMXCameraAdapter::setSaturation(Gen3A_settings& Gen3A)
838{
839    OMX_ERRORTYPE eError = OMX_ErrorNone;
840    OMX_CONFIG_SATURATIONTYPE saturation;
841
842    LOG_FUNCTION_NAME;
843
844    if ( OMX_StateInvalid == mComponentState )
845        {
846        CAMHAL_LOGEA("OMX component is in invalid state");
847        return NO_INIT;
848        }
849
850    OMX_INIT_STRUCT_PTR (&saturation, OMX_CONFIG_SATURATIONTYPE);
851    saturation.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
852    saturation.nSaturation = Gen3A.Saturation;
853
854    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
855                         OMX_IndexConfigCommonSaturation,
856                         &saturation);
857    if ( OMX_ErrorNone != eError )
858        {
859        CAMHAL_LOGEB("Error while configuring Saturation 0x%x error = 0x%x",
860                     ( unsigned int ) saturation.nSaturation,
861                     eError);
862        }
863    else
864        {
865        CAMHAL_LOGDB("Saturation 0x%x configured successfully",
866                     ( unsigned int ) saturation.nSaturation);
867        }
868
869    LOG_FUNCTION_NAME_EXIT;
870
871    return ErrorUtils::omxToAndroidError(eError);
872}
873
874status_t OMXCameraAdapter::setISO(Gen3A_settings& Gen3A)
875{
876    OMX_ERRORTYPE eError = OMX_ErrorNone;
877    OMX_CONFIG_EXPOSUREVALUETYPE expValues;
878
879    LOG_FUNCTION_NAME;
880
881    if ( OMX_StateInvalid == mComponentState )
882        {
883        CAMHAL_LOGEA("OMX component is in invalid state");
884        return NO_INIT;
885        }
886
887    OMX_INIT_STRUCT_PTR (&expValues, OMX_CONFIG_EXPOSUREVALUETYPE);
888    expValues.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
889
890    OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
891                   OMX_IndexConfigCommonExposureValue,
892                   &expValues);
893
894    if( 0 == Gen3A.ISO )
895        {
896        expValues.bAutoSensitivity = OMX_TRUE;
897        }
898    else
899        {
900        expValues.bAutoSensitivity = OMX_FALSE;
901        expValues.nSensitivity = Gen3A.ISO;
902        }
903
904    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
905                         OMX_IndexConfigCommonExposureValue,
906                         &expValues);
907    if ( OMX_ErrorNone != eError )
908        {
909        CAMHAL_LOGEB("Error while configuring ISO 0x%x error = 0x%x",
910                     ( unsigned int ) expValues.nSensitivity,
911                     eError);
912        }
913    else
914        {
915        CAMHAL_LOGDB("ISO 0x%x configured successfully",
916                     ( unsigned int ) expValues.nSensitivity);
917        }
918
919    LOG_FUNCTION_NAME_EXIT;
920
921    return ErrorUtils::omxToAndroidError(eError);
922}
923
924status_t OMXCameraAdapter::setEffect(Gen3A_settings& Gen3A)
925{
926    OMX_ERRORTYPE eError = OMX_ErrorNone;
927    OMX_CONFIG_IMAGEFILTERTYPE effect;
928
929    LOG_FUNCTION_NAME;
930
931    if ( OMX_StateInvalid == mComponentState )
932        {
933        CAMHAL_LOGEA("OMX component is in invalid state");
934        return NO_INIT;
935        }
936
937    OMX_INIT_STRUCT_PTR (&effect, OMX_CONFIG_IMAGEFILTERTYPE);
938    effect.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
939    effect.eImageFilter = (OMX_IMAGEFILTERTYPE ) Gen3A.Effect;
940
941    eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
942                         OMX_IndexConfigCommonImageFilter,
943                         &effect);
944    if ( OMX_ErrorNone != eError )
945        {
946        CAMHAL_LOGEB("Error while configuring Effect 0x%x error = 0x%x",
947                     ( unsigned int )  effect.eImageFilter,
948                     eError);
949        }
950    else
951        {
952        CAMHAL_LOGDB("Effect 0x%x configured successfully",
953                     ( unsigned int )  effect.eImageFilter);
954        }
955
956    LOG_FUNCTION_NAME_EXIT;
957
958    return ErrorUtils::omxToAndroidError(eError);
959}
960
961status_t OMXCameraAdapter::setWhiteBalanceLock(Gen3A_settings& Gen3A)
962{
963  OMX_ERRORTYPE eError = OMX_ErrorNone;
964  OMX_IMAGE_CONFIG_LOCKTYPE lock;
965
966  LOG_FUNCTION_NAME
967
968  if ( OMX_StateInvalid == mComponentState )
969    {
970      CAMHAL_LOGEA("OMX component is in invalid state");
971      return NO_INIT;
972    }
973
974  OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
975  lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
976  lock.bLock = Gen3A.WhiteBalanceLock;
977  eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
978                          (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock,
979                          &lock);
980  if ( OMX_ErrorNone != eError )
981    {
982      CAMHAL_LOGEB("Error while configuring WhiteBalance Lock error = 0x%x", eError);
983    }
984  else
985    {
986      CAMHAL_LOGDB("WhiteBalance Lock configured successfully %d ", lock.bLock);
987    }
988  LOG_FUNCTION_NAME_EXIT
989
990  return ErrorUtils::omxToAndroidError(eError);
991}
992
993status_t OMXCameraAdapter::setExposureLock(Gen3A_settings& Gen3A)
994{
995  OMX_ERRORTYPE eError = OMX_ErrorNone;
996  OMX_IMAGE_CONFIG_LOCKTYPE lock;
997
998  LOG_FUNCTION_NAME
999
1000  if ( OMX_StateInvalid == mComponentState )
1001    {
1002      CAMHAL_LOGEA("OMX component is in invalid state");
1003      return NO_INIT;
1004    }
1005
1006  OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1007  lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1008  lock.bLock = Gen3A.ExposureLock;
1009  eError = OMX_SetConfig( mCameraAdapterParameters.mHandleComp,
1010                          (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock,
1011                          &lock);
1012  if ( OMX_ErrorNone != eError )
1013    {
1014      CAMHAL_LOGEB("Error while configuring Exposure Lock error = 0x%x", eError);
1015    }
1016  else
1017    {
1018      CAMHAL_LOGDB("Exposure Lock configured successfully %d ", lock.bLock);
1019    }
1020  LOG_FUNCTION_NAME_EXIT
1021
1022    return ErrorUtils::omxToAndroidError(eError);
1023}
1024
1025status_t OMXCameraAdapter::set3ALock(OMX_BOOL toggle)
1026{
1027  OMX_ERRORTYPE eError = OMX_ErrorNone;
1028  OMX_IMAGE_CONFIG_LOCKTYPE lock;
1029  char* index = FALSE;
1030
1031  LOG_FUNCTION_NAME
1032
1033  if ( OMX_StateInvalid == mComponentState )
1034    {
1035      CAMHAL_LOGEA("OMX component is in invalid state");
1036      return NO_INIT;
1037    }
1038
1039  OMX_INIT_STRUCT_PTR (&lock, OMX_IMAGE_CONFIG_LOCKTYPE);
1040  lock.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
1041
1042  mParameters3A.ExposureLock = toggle;
1043  mParameters3A.WhiteBalanceLock = toggle;
1044
1045  eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1046                          (OMX_INDEXTYPE)OMX_IndexConfigImageExposureLock,
1047                          &lock);
1048  if ( OMX_ErrorNone != eError )
1049    {
1050      CAMHAL_LOGEB("Error GetConfig Exposure Lock error = 0x%x", eError);
1051    }
1052  else
1053    {
1054      CAMHAL_LOGDA("Exposure Lock GetConfig successfull");
1055    }
1056
1057  /* Apply locks only when not applied already */
1058  if ( lock.bLock  != toggle )
1059    {
1060      setExposureLock(mParameters3A);
1061    }
1062
1063  eError = OMX_GetConfig( mCameraAdapterParameters.mHandleComp,
1064                          (OMX_INDEXTYPE)OMX_IndexConfigImageWhiteBalanceLock,
1065                          &lock);
1066  if ( OMX_ErrorNone != eError )
1067    {
1068      CAMHAL_LOGEB("Error GetConfig WhiteBalance Lock error = 0x%x", eError);
1069    }
1070  else
1071    {
1072      CAMHAL_LOGDA("WhiteBalance Lock GetConfig successfull");
1073    }
1074
1075  /* Apply locks only when not applied already */
1076  if ( lock.bLock != toggle )
1077    {
1078      setWhiteBalanceLock(mParameters3A);
1079    }
1080
1081  const char *lock_state = toggle ? TRUE : FALSE;
1082  mParams.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, lock_state);
1083  mParams.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, lock_state);
1084
1085  return ErrorUtils::omxToAndroidError(eError);
1086
1087}
1088
1089status_t OMXCameraAdapter::setMeteringAreas(Gen3A_settings& Gen3A)
1090{
1091  status_t ret = NO_ERROR;
1092  OMX_ERRORTYPE eError = OMX_ErrorNone;
1093
1094  OMX_ALGOAREASTYPE **meteringAreas;
1095  OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer;
1096  MemoryManager memMgr;
1097  int areasSize = 0;
1098
1099  LOG_FUNCTION_NAME
1100
1101  if ( OMX_StateInvalid == mComponentState )
1102    {
1103      CAMHAL_LOGEA("OMX component is in invalid state");
1104      return NO_INIT;
1105    }
1106
1107  areasSize = ((sizeof(OMX_ALGOAREASTYPE)+4095)/4096)*4096;
1108  meteringAreas = (OMX_ALGOAREASTYPE**) memMgr.allocateBuffer(0, 0, NULL, areasSize, 1);
1109
1110  OMXCameraPortParameters * mPreviewData = NULL;
1111  mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex];
1112
1113  if (!meteringAreas)
1114      {
1115      CAMHAL_LOGEB("Error allocating buffer for metering areas %d", eError);
1116      return -ENOMEM;
1117      }
1118
1119  OMX_INIT_STRUCT_PTR (meteringAreas[0], OMX_ALGOAREASTYPE);
1120
1121  meteringAreas[0]->nPortIndex = OMX_ALL;
1122  meteringAreas[0]->nNumAreas = mMeteringAreas.size();
1123  meteringAreas[0]->nAlgoAreaPurpose = OMX_AlgoAreaExposure;
1124
1125  for ( unsigned int n = 0; n < mMeteringAreas.size(); n++)
1126      {
1127      // transform the coordinates to 3A-type coordinates
1128      mMeteringAreas.itemAt(n)->transfrom((size_t)mPreviewData->mWidth,
1129                                      (size_t)mPreviewData->mHeight,
1130                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nTop,
1131                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nLeft,
1132                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nWidth,
1133                                      (size_t&)meteringAreas[0]->tAlgoAreas[n].nHeight);
1134
1135      meteringAreas[0]->tAlgoAreas[n].nLeft =
1136              ( meteringAreas[0]->tAlgoAreas[n].nLeft * METERING_AREAS_RANGE ) / mPreviewData->mWidth;
1137      meteringAreas[0]->tAlgoAreas[n].nTop =
1138              ( meteringAreas[0]->tAlgoAreas[n].nTop* METERING_AREAS_RANGE ) / mPreviewData->mHeight;
1139      meteringAreas[0]->tAlgoAreas[n].nWidth =
1140              ( meteringAreas[0]->tAlgoAreas[n].nWidth * METERING_AREAS_RANGE ) / mPreviewData->mWidth;
1141      meteringAreas[0]->tAlgoAreas[n].nHeight =
1142              ( meteringAreas[0]->tAlgoAreas[n].nHeight * METERING_AREAS_RANGE ) / mPreviewData->mHeight;
1143
1144      meteringAreas[0]->tAlgoAreas[n].nPriority = mMeteringAreas.itemAt(n)->getWeight();
1145
1146      CAMHAL_LOGDB("Metering area %d : top = %d left = %d width = %d height = %d prio = %d",
1147              n, (int)meteringAreas[0]->tAlgoAreas[n].nTop, (int)meteringAreas[0]->tAlgoAreas[n].nLeft,
1148              (int)meteringAreas[0]->tAlgoAreas[n].nWidth, (int)meteringAreas[0]->tAlgoAreas[n].nHeight,
1149              (int)meteringAreas[0]->tAlgoAreas[n].nPriority);
1150
1151      }
1152
1153  OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER);
1154
1155  sharedBuffer.nPortIndex = OMX_ALL;
1156  sharedBuffer.nSharedBuffSize = areasSize;
1157  sharedBuffer.pSharedBuff = (OMX_U8 *) meteringAreas[0];
1158
1159  if ( NULL == sharedBuffer.pSharedBuff )
1160      {
1161      CAMHAL_LOGEA("No resources to allocate OMX shared buffer");
1162      ret = -ENOMEM;
1163      goto EXIT;
1164      }
1165
1166      eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1167                                (OMX_INDEXTYPE) OMX_TI_IndexConfigAlgoAreas, &sharedBuffer);
1168
1169  if ( OMX_ErrorNone != eError )
1170      {
1171      CAMHAL_LOGEB("Error while setting Focus Areas configuration 0x%x", eError);
1172      ret = -EINVAL;
1173      }
1174  else
1175      {
1176      CAMHAL_LOGDA("Metering Areas SetConfig successfull.");
1177      }
1178
1179 EXIT:
1180  if (NULL != meteringAreas)
1181      {
1182      memMgr.freeBuffer((void*) meteringAreas);
1183      meteringAreas = NULL;
1184      }
1185
1186  return ret;
1187}
1188
1189status_t OMXCameraAdapter::apply3Asettings( Gen3A_settings& Gen3A )
1190{
1191    status_t ret = NO_ERROR;
1192    unsigned int currSett; // 32 bit
1193    int portIndex;
1194
1195    /*
1196     * Scenes have a priority during the process
1197     * of applying 3A related parameters.
1198     * They can override pretty much all other 3A
1199     * settings and similarly get overridden when
1200     * for instance the focus mode gets switched.
1201     * There is only one exception to this rule,
1202     * the manual a.k.a. auto scene.
1203     */
1204    if ( ( SetSceneMode & mPending3Asettings ) )
1205        {
1206        mPending3Asettings &= ~SetSceneMode;
1207        return setScene(Gen3A);
1208        }
1209    else if ( OMX_Manual != Gen3A.SceneMode )
1210        {
1211        mPending3Asettings = 0;
1212        return NO_ERROR;
1213        }
1214
1215    for( currSett = 1; currSett < E3aSettingMax; currSett <<= 1)
1216        {
1217        if( currSett & mPending3Asettings )
1218            {
1219            switch( currSett )
1220                {
1221                case SetEVCompensation:
1222                    {
1223                    ret |= setEVCompensation(Gen3A);
1224                    break;
1225                    }
1226
1227                case SetWhiteBallance:
1228                    {
1229                    ret |= setWBMode(Gen3A);
1230                    break;
1231                    }
1232
1233                case SetFlicker:
1234                    {
1235                    ret |= setFlicker(Gen3A);
1236                    break;
1237                    }
1238
1239                case SetBrightness:
1240                    {
1241                    ret |= setBrightness(Gen3A);
1242                    break;
1243                    }
1244
1245                case SetContrast:
1246                    {
1247                    ret |= setContrast(Gen3A);
1248                    break;
1249                    }
1250
1251                case SetSharpness:
1252                    {
1253                    ret |= setSharpness(Gen3A);
1254                    break;
1255                    }
1256
1257                case SetSaturation:
1258                    {
1259                    ret |= setSaturation(Gen3A);
1260                    break;
1261                    }
1262
1263                case SetISO:
1264                    {
1265                    ret |= setISO(Gen3A);
1266                    break;
1267                    }
1268
1269                case SetEffect:
1270                    {
1271                    ret |= setEffect(Gen3A);
1272                    break;
1273                    }
1274
1275                case SetFocus:
1276                    {
1277                    ret |= setFocusMode(Gen3A);
1278                    break;
1279                    }
1280
1281                case SetExpMode:
1282                    {
1283                    ret |= setExposureMode(Gen3A);
1284                    break;
1285                    }
1286
1287                case SetFlash:
1288                    {
1289                    ret |= setFlashMode(Gen3A);
1290                    break;
1291                    }
1292
1293                case SetExpLock:
1294                  {
1295                    ret |= setExposureLock(Gen3A);
1296                    break;
1297                  }
1298
1299                case SetWBLock:
1300                  {
1301                    ret |= setWhiteBalanceLock(Gen3A);
1302                    break;
1303                  }
1304                case SetMeteringAreas:
1305                  {
1306                    ret |= setMeteringAreas(Gen3A);
1307                  }
1308
1309                default:
1310                    CAMHAL_LOGEB("this setting (0x%x) is still not supported in CameraAdapter ",
1311                                 currSett);
1312                    break;
1313                }
1314                mPending3Asettings &= ~currSett;
1315            }
1316        }
1317        return ret;
1318}
1319
1320};
1321