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