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