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