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