Home | History | Annotate | Download | only in OMXCameraAdapter
      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 OMXCap.cpp
     19 *
     20 * This file implements the OMX Capabilities feature.
     21 *
     22 */
     23 
     24 #include "CameraHal.h"
     25 #include "OMXCameraAdapter.h"
     26 #include "ErrorUtils.h"
     27 #include "TICameraParameters.h"
     28 
     29 namespace Ti {
     30 namespace Camera {
     31 
     32 /************************************
     33  * global constants and variables
     34  *************************************/
     35 
     36 #define ARRAY_SIZE(array) (sizeof((array)) / sizeof((array)[0]))
     37 
     38 static const char PARAM_SEP[] = ",";
     39 static const uint32_t VFR_OFFSET = 8;
     40 static const char FPS_STR_MAX_LEN = 10;
     41 
     42 static const unsigned int MANUAL_EXPOSURE_STEP = 1;
     43 static const unsigned int MANUAL_GAIN_ISO_MIN = 100;
     44 static const unsigned int MANUAL_GAIN_ISO_STEP = 100;
     45 
     46 const int OMXCameraAdapter::SENSORID_IMX060 = 300;
     47 const int OMXCameraAdapter::SENSORID_OV5650 = 301;
     48 const int OMXCameraAdapter::SENSORID_OV5640 = 302;
     49 const int OMXCameraAdapter::SENSORID_OV14825 = 304;
     50 const int OMXCameraAdapter::SENSORID_S5K4E1GA = 305;
     51 const int OMXCameraAdapter::SENSORID_S5K6A1GX03 = 306;
     52 const int OMXCameraAdapter::SENSORID_OV8830 = 310;
     53 const int OMXCameraAdapter::SENSORID_OV2722 = 311;
     54 
     55 
     56 const int OMXCameraAdapter::FPS_MIN = 5;
     57 const int OMXCameraAdapter::FPS_MAX = 30;
     58 const int OMXCameraAdapter::FPS_MAX_EXTENDED = 60;
     59 
     60 inline static int androidFromDucatiFrameRate(OMX_U32 frameRate) {
     61     return (frameRate >> VFR_OFFSET) * CameraHal::VFR_SCALE;
     62 }
     63 
     64 /**** look up tables to translate OMX Caps to Parameter ****/
     65 
     66 const CapResolution OMXCameraAdapter::mImageCapRes [] = {
     67     { 4416, 3312, "4416x3312" },
     68     { 4032, 3024, "4032x3024" },
     69     { 4000, 3000, "4000x3000" },
     70     { 3648, 2736, "3648x2736" },
     71     { 3264, 2448, "3264x2448" },
     72     { 2608, 1960, "2608x1960" },
     73     { 2592, 1944, "2592x1944" },
     74     { 2592, 1728, "2592x1728" },
     75     { 2592, 1458, "2592x1458" },
     76     { 2304, 1296, "2304x1296" },
     77     { 2240, 1344, "2240x1344" },
     78     { 2160, 1440, "2160x1440" },
     79     { 2112, 1728, "2112x1728" },
     80     { 2048, 1536, "2048x1536" },
     81     { 2016, 1512, "2016x1512" },
     82     { 2000, 1600, "2000x1600" },
     83     { 1600, 1200, "1600x1200" },
     84     { 1280, 1024, "1280x1024" },
     85     { 1152,  864, "1152x864" },
     86     { 1280,  960, "1280x960" },
     87     { 1024,  768, "1024x768" },
     88     {  640,  480, "640x480" },
     89     {  320,  240, "320x240" },
     90 };
     91 
     92 const CapResolution OMXCameraAdapter::mImageCapResSS [] = {
     93    { 4032*2, 3024, "8064x3024" },
     94    { 3648*2, 2736, "7296x2736" },
     95    { 3264*2, 2448, "6528x2448" },
     96    { 2592*2, 1944, "5184x1944" },
     97    { 2048*2, 1536, "4096x1536" },
     98    { 1600*2, 1200, "3200x1200" },
     99    { 1280*2,  960, "2560x960" },
    100    { 1024*2,  768, "2048x768" },
    101    {  640*2,  480, "1280x480" },
    102    {  320*2,  240, "640x240" },
    103 };
    104 
    105 const CapResolution OMXCameraAdapter::mImageCapResTB [] = {
    106    { 4032, 3024*2, "4032x6048" },
    107    { 3648, 2736*2, "3648x5472" },
    108    { 3264, 2448*2, "3264x4896" },
    109    { 2592, 1944*2, "2592x3888" },
    110    { 2048, 1536*2, "2048x3072" },
    111    { 1600, 1200*2, "1600x2400" },
    112    { 1280,  960*2, "1280x1920" },
    113    { 1024,  768*2, "1024x1536" },
    114    {  640,  480*2, "640x960" },
    115    {  320,  240*2, "320x480" },
    116 };
    117 
    118 const CapResolution OMXCameraAdapter::mPreviewRes [] = {
    119     { 1920, 1080, "1920x1080" },
    120     { 1280, 720, "1280x720" },
    121     { 960, 720, "960x720" },
    122     { 800, 480, "800x480" },
    123     { 720, 576, "720x576" },
    124     { 720, 480, "720x480" },
    125     { 768, 576, "768x576" },
    126     { 640, 480, "640x480" },
    127     { 320, 240, "320x240" },
    128     { 352, 288, "352x288" },
    129     { 240, 160, "240x160" },
    130     { 176, 144, "176x144" },
    131     { 160, 120, "160x120" },
    132     { 128, 96, "128x96" },
    133 };
    134 
    135 const CapResolution OMXCameraAdapter::mPreviewPortraitRes [] = {
    136     //Portrait resolutions
    137     { 1088, 1920, "1088x1920" },
    138     { 720, 1280, "720x1280" },
    139     { 480, 800, "480x800" },
    140     { 576, 720, "576x720" },
    141     { 576, 768, "576x768" },
    142     { 480, 720, "480x720" },
    143     { 480, 640, "480x640" },
    144     { 288, 352, "288x352" },
    145     { 240, 320, "240x320" },
    146     { 160, 240, "160x240" },
    147     { 144, 176, "144x176" },
    148     { 120, 160, "120x160"},
    149     { 96, 128, "96x128" }
    150 };
    151 
    152 const CapResolution OMXCameraAdapter::mPreviewResSS [] = {
    153    { 1920*2, 1080, "3840x1080" },
    154    { 1280*2,  720, "2560x720" },
    155    {  800*2,  480, "1600x480" },
    156    {  720*2,  576, "1440x576" },
    157    {  720*2,  480, "1440x480" },
    158    {  768*2,  576, "1536x576" },
    159    {  640*2,  480, "1280x480" },
    160    {  320*2,  240, "640x240" },
    161    {  352*2,  288, "704x288" },
    162    {  240*2,  160, "480x160" },
    163    {  176*2,  144, "352x144" },
    164    {  128*2,   96, "256x96" }
    165 };
    166 
    167 const CapResolution OMXCameraAdapter::mPreviewResTB [] = {
    168    { 1920, 1080*2, "1920x2160" },
    169    { 1280,  720*2, "1280x1440" },
    170    {  800,  480*2, "800x960" },
    171    {  720,  576*2, "720x1152" },
    172    {  720,  480*2, "720x960" },
    173    {  768,  576*2, "768x1152" },
    174    {  640,  480*2, "640x960" },
    175    {  320,  240*2, "320x480" },
    176    {  352,  288*2, "352x576" },
    177    {  240,  160*2, "240x320" },
    178    {  176,  144*2, "176x288" },
    179    {  128,   96*2, "128x192" },
    180 };
    181 
    182 const CapResolution OMXCameraAdapter::mThumbRes [] = {
    183     { 640, 480, "640x480" },
    184     { 160, 120, "160x120" },
    185     { 200, 120, "200x120" },
    186     { 320, 240, "320x240" },
    187     { 512, 384, "512x384" },
    188     { 352, 144, "352x144" },
    189     { 176, 144, "176x144" },
    190     { 96, 96, "96x96" },
    191 };
    192 
    193 const CapPixelformat OMXCameraAdapter::mPixelformats [] = {
    194     { OMX_COLOR_FormatCbYCrY, android::CameraParameters::PIXEL_FORMAT_YUV422I },
    195     { OMX_COLOR_FormatYUV420SemiPlanar, android::CameraParameters::PIXEL_FORMAT_YUV420SP },
    196     { OMX_COLOR_Format16bitRGB565, android::CameraParameters::PIXEL_FORMAT_RGB565 },
    197     { OMX_COLOR_FormatYUV420SemiPlanar, android::CameraParameters::PIXEL_FORMAT_YUV420P },
    198     { OMX_COLOR_FormatUnused, TICameraParameters::PIXEL_FORMAT_UNUSED },
    199     { OMX_COLOR_FormatRawBayer10bit, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB },
    200 };
    201 
    202 const userToOMX_LUT OMXCameraAdapter::mFrameLayout [] = {
    203    { TICameraParameters::S3D_NONE,          OMX_TI_StereoFrameLayout2D },
    204    { TICameraParameters::S3D_TB_FULL,       OMX_TI_StereoFrameLayoutTopBottom },
    205    { TICameraParameters::S3D_SS_FULL,       OMX_TI_StereoFrameLayoutLeftRight },
    206    { TICameraParameters::S3D_TB_SUBSAMPLED, OMX_TI_StereoFrameLayoutTopBottomSubsample },
    207    { TICameraParameters::S3D_SS_SUBSAMPLED, OMX_TI_StereoFrameLayoutLeftRightSubsample },
    208 };
    209 
    210 const LUTtype OMXCameraAdapter::mLayoutLUT = {
    211    ARRAY_SIZE(mFrameLayout),
    212    mFrameLayout
    213 };
    214 
    215 const CapCodingFormat OMXCameraAdapter::mImageCodingFormat [] = {
    216       { OMX_IMAGE_CodingJPEG, android::CameraParameters::PIXEL_FORMAT_JPEG },
    217       { (OMX_IMAGE_CODINGTYPE)OMX_TI_IMAGE_CodingJPS, TICameraParameters::PIXEL_FORMAT_JPS },
    218       { (OMX_IMAGE_CODINGTYPE)OMX_TI_IMAGE_CodingMPO, TICameraParameters::PIXEL_FORMAT_MPO },
    219 };
    220 
    221 const CapFramerate OMXCameraAdapter::mFramerates [] = {
    222     { 60, "60" },
    223     { 30, "30" },
    224     { 24, "24" },
    225     { 20, "20" },
    226     { 15, "15" },
    227     { 10, "10" },
    228 };
    229 
    230 const CapZoom OMXCameraAdapter::mZoomStages [] = {
    231     { 65536, "100" },
    232     { 68157, "104" },
    233     { 70124, "107" },
    234     { 72745, "111" },
    235     { 75366, "115" },
    236     { 77988, "119" },
    237     { 80609, "123" },
    238     { 83231, "127" },
    239     { 86508, "132" },
    240     { 89784, "137" },
    241     { 92406, "141" },
    242     { 95683, "146" },
    243     { 99615, "152" },
    244     { 102892, "157" },
    245     { 106168, "162" },
    246     { 110100, "168" },
    247     { 114033, "174" },
    248     { 117965, "180" },
    249     { 122552, "187" },
    250     { 126484, "193" },
    251     { 131072, "200" },
    252     { 135660, "207" },
    253     { 140247, "214" },
    254     { 145490, "222" },
    255     { 150733, "230" },
    256     { 155976, "238" },
    257     { 161219, "246" },
    258     { 167117, "255" },
    259     { 173015, "264" },
    260     { 178913, "273" },
    261     { 185467, "283" },
    262     { 192020, "293" },
    263     { 198574, "303" },
    264     { 205783, "314" },
    265     { 212992, "325" },
    266     { 220201, "336" },
    267     { 228065, "348" },
    268     { 236585, "361" },
    269     { 244449, "373" },
    270     { 252969, "386" },
    271     { 262144, "400" },
    272     { 271319, "414" },
    273     { 281149, "429" },
    274     { 290980, "444" },
    275     { 300810, "459" },
    276     { 311951, "476" },
    277     { 322437, "492" },
    278     { 334234, "510" },
    279     { 346030, "528" },
    280     { 357827, "546" },
    281     { 370934, "566" },
    282     { 384041, "586" },
    283     { 397148, "606" },
    284     { 411566, "628" },
    285     { 425984, "650" },
    286     { 441057, "673" },
    287     { 456131, "696" },
    288     { 472515, "721" },
    289     { 488899, "746" },
    290     { 506593, "773" },
    291     { 524288, "800" },
    292 };
    293 
    294 const CapISO OMXCameraAdapter::mISOStages [] = {
    295     { 0, "auto" },
    296     { 100, "100" },
    297     { 200, "200"},
    298     { 400, "400" },
    299     { 800, "800" },
    300     { 1000, "1000" },
    301     { 1200, "1200" },
    302     { 1600, "1600" },
    303 };
    304 
    305 // mapped values have to match with new_sensor_MSP.h
    306 const CapU32 OMXCameraAdapter::mSensorNames [] = {
    307     { SENSORID_IMX060, "IMX060" },
    308     { SENSORID_OV5650, "OV5650" },
    309     { SENSORID_OV5640, "OV5640" },
    310     { SENSORID_OV14825, "OV14825"},
    311     { SENSORID_S5K4E1GA, "S5K4E1GA"},
    312     { SENSORID_S5K6A1GX03, "S5K6A1GX03" },
    313     { SENSORID_OV8830, "OV8830" },
    314     { SENSORID_OV2722, "OV2722" }
    315     // TODO(XXX): need to account for S3D camera later
    316 };
    317 
    318 const userToOMX_LUT OMXCameraAdapter::mAutoConvergence [] = {
    319     { TICameraParameters::AUTOCONVERGENCE_MODE_DISABLE, OMX_TI_AutoConvergenceModeDisable },
    320     { TICameraParameters::AUTOCONVERGENCE_MODE_FRAME,   OMX_TI_AutoConvergenceModeFrame },
    321     { TICameraParameters::AUTOCONVERGENCE_MODE_CENTER,  OMX_TI_AutoConvergenceModeCenter },
    322     { TICameraParameters::AUTOCONVERGENCE_MODE_TOUCH,   OMX_TI_AutoConvergenceModeFocusFaceTouch },
    323     { TICameraParameters::AUTOCONVERGENCE_MODE_MANUAL,  OMX_TI_AutoConvergenceModeManual }
    324 };
    325 
    326 const LUTtype OMXCameraAdapter::mAutoConvergenceLUT = {
    327     ARRAY_SIZE(mAutoConvergence),
    328     mAutoConvergence
    329 };
    330 
    331 const userToOMX_LUT OMXCameraAdapter::mBracketingModes [] = {
    332     { TICameraParameters::TEMP_BRACKETING       , OMX_BracketTemporal               },
    333     { TICameraParameters::EXPOSURE_BRACKETING   , OMX_BracketExposureRelativeInEV   }
    334 };
    335 
    336 const LUTtype OMXCameraAdapter::mBracketingModesLUT = {
    337     ARRAY_SIZE(mBracketingModes),
    338     mBracketingModes
    339 };
    340 
    341 // values for supported camera facing direction
    342 const CapU32 OMXCameraAdapter::mFacing [] = {
    343     { OMX_TI_SENFACING_BACK , TICameraParameters::FACING_BACK },
    344     { OMX_TI_SENFACING_FRONT, TICameraParameters::FACING_FRONT},
    345 };
    346 
    347 /*****************************************
    348  * internal static function declarations
    349  *****************************************/
    350 
    351 /**** Utility functions to help translate OMX Caps to Parameter ****/
    352 
    353 status_t OMXCameraAdapter::encodeImageCodingFormatCap(OMX_IMAGE_CODINGTYPE format,
    354         const CapCodingFormat *cap,
    355         size_t capCount,
    356         char * buffer) {
    357 
    358     status_t ret = NO_ERROR;
    359 
    360     LOG_FUNCTION_NAME;
    361 
    362     if ( ( NULL == buffer ) || ( NULL == cap ) ) {
    363         CAMHAL_LOGEA("Invalid input arguments");
    364         ret = -EINVAL;
    365     }
    366 
    367     if ( NO_ERROR == ret ) {
    368         for ( unsigned int i = 0 ; i < capCount ; i++ ) {
    369             if ( format == cap[i].imageCodingFormat ) {
    370                 if (buffer[0] != '\0') {
    371                     strncat(buffer, PARAM_SEP, ((((int)MAX_PROP_VALUE_LENGTH - 1 - (int)strlen(buffer)) < 0) ? 0 : (MAX_PROP_VALUE_LENGTH - 1 - strlen(buffer))));
    372                 }
    373                 strncat(buffer, cap[i].param,  ((((int)MAX_PROP_VALUE_LENGTH - 1 - (int)strlen(buffer)) < 0) ? 0 : (MAX_PROP_VALUE_LENGTH - 1 - strlen(buffer))));
    374             }
    375         }
    376     }
    377 
    378     LOG_FUNCTION_NAME_EXIT;
    379 
    380     return ret;
    381 }
    382 
    383 status_t OMXCameraAdapter::encodePixelformatCap(OMX_COLOR_FORMATTYPE format,
    384                               const CapPixelformat *cap,
    385                               size_t capCount,
    386                               char * buffer,
    387                               size_t bufferSize)
    388 {
    389     status_t ret = NO_ERROR;
    390 
    391     LOG_FUNCTION_NAME;
    392 
    393     if ( ( NULL == buffer ) || ( NULL == cap ) ) {
    394         CAMHAL_LOGEA("Invalid input arguments");
    395         return -EINVAL;
    396     }
    397 
    398 
    399     for ( unsigned int i = 0 ; i < capCount ; i++ )
    400         {
    401         if ( format == cap[i].pixelformat )
    402             {
    403             if (buffer[0] != '\0') {
    404                 strncat(buffer, PARAM_SEP, bufferSize - 1);
    405             }
    406             strncat(buffer, cap[i].param, bufferSize - 1);
    407             }
    408         }
    409 
    410     LOG_FUNCTION_NAME_EXIT;
    411 
    412     return ret;
    413 }
    414 
    415 void OMXCameraAdapter::encodeFrameRates(const int minFrameRate, const int maxFrameRate,
    416         const OMX_TI_CAPTYPE & caps, const CapFramerate * const fixedFrameRates,
    417         const int frameRateCount, android::Vector<FpsRange> & fpsRanges) {
    418     LOG_FUNCTION_NAME;
    419 
    420     if ( minFrameRate == maxFrameRate ) {
    421         // single fixed frame rate supported
    422         fpsRanges.add(FpsRange(minFrameRate, maxFrameRate));
    423         return;
    424     }
    425 
    426     // insert min and max frame rates
    427     fpsRanges.add(FpsRange(minFrameRate, minFrameRate));
    428     fpsRanges.add(FpsRange(maxFrameRate, maxFrameRate));
    429 
    430     // insert variable frame rates
    431     for ( int i = 0; i < static_cast<int>(caps.ulPrvVarFPSModesCount); ++i ) {
    432         const FpsRange fpsRange = FpsRange(
    433                 max(androidFromDucatiFrameRate(caps.tPrvVarFPSModes[i].nVarFPSMin), minFrameRate),
    434                 min(androidFromDucatiFrameRate(caps.tPrvVarFPSModes[i].nVarFPSMax), maxFrameRate));
    435 
    436         if ( fpsRange.isFixed() ) {
    437             // this range is either min or max fixed frame rate, already added above
    438             continue;
    439         }
    440 
    441         fpsRanges.add(fpsRange);
    442     }
    443 
    444     // insert fixed frame rates
    445     for ( int i = 0; i < frameRateCount; ++i ) {
    446         const int fixedFrameRate = fixedFrameRates[i].num * CameraHal::VFR_SCALE;
    447 
    448         if ( fixedFrameRate < minFrameRate || fixedFrameRate > maxFrameRate ) {
    449             // not supported by hardware
    450             continue;
    451         }
    452 
    453         const FpsRange fpsRange = FpsRange(fixedFrameRate, fixedFrameRate);
    454         fpsRanges.add(fpsRange);
    455     }
    456 
    457     // sort first by max, then by min, according to Android API requirements
    458     fpsRanges.sort(FpsRange::compare);
    459 
    460     // remove duplicated frame rates
    461     for ( int i = 0; i < static_cast<int>(fpsRanges.size()) - 1; ) {
    462         const FpsRange & current = fpsRanges.itemAt(i);
    463         const FpsRange & next = fpsRanges.itemAt(i + 1);
    464         if ( current == next ) {
    465             fpsRanges.removeAt(i + 1);
    466         } else {
    467             i++;
    468         }
    469     }
    470 }
    471 
    472 size_t OMXCameraAdapter::encodeZoomCap(OMX_S32 maxZoom,
    473                      const CapZoom *cap,
    474                      size_t capCount,
    475                      char * buffer,
    476                      size_t bufferSize)
    477 {
    478     status_t res = NO_ERROR;
    479     size_t ret = 0;
    480 
    481     LOG_FUNCTION_NAME;
    482 
    483     if ( (NULL == buffer) || (NULL == cap) ) {
    484         CAMHAL_LOGEA("Invalid input arguments");
    485         return -EINVAL;
    486     }
    487 
    488 
    489     for ( unsigned int i = 0; i < capCount; i++ ) {
    490         if ( cap[i].num <= maxZoom ) {
    491             if (buffer[0] != '\0') {
    492                 strncat(buffer, PARAM_SEP, bufferSize - 1);
    493             }
    494             strncat(buffer, cap[i].param, bufferSize - 1);
    495             ret++;
    496         }
    497     }
    498 
    499     LOG_FUNCTION_NAME_EXIT;
    500 
    501     return ret;
    502 }
    503 
    504 status_t OMXCameraAdapter::encodeISOCap(OMX_U32 maxISO,
    505                       const CapISO *cap,
    506                       size_t capCount,
    507                       char * buffer,
    508                       size_t bufferSize)
    509 {
    510     status_t ret = NO_ERROR;
    511 
    512     LOG_FUNCTION_NAME;
    513 
    514     if ( (NULL == buffer) || (NULL == cap) ) {
    515         CAMHAL_LOGEA("Invalid input arguments");
    516         return -EINVAL;
    517     }
    518 
    519     for ( unsigned int i = 0; i < capCount; i++ ) {
    520         if ( cap[i].num <= maxISO) {
    521             if (buffer[0] != '\0') {
    522                 strncat(buffer, PARAM_SEP, bufferSize - 1);
    523             }
    524             strncat(buffer, cap[i].param, bufferSize - 1);
    525         }
    526     }
    527 
    528     LOG_FUNCTION_NAME_EXIT;
    529 
    530     return ret;
    531 }
    532 
    533 status_t OMXCameraAdapter::encodeSizeCap(OMX_TI_CAPRESTYPE &res,
    534                        const CapResolution *cap,
    535                        size_t capCount,
    536                        char * buffer,
    537                        size_t bufferSize)
    538 {
    539     status_t ret = NO_ERROR;
    540 
    541     LOG_FUNCTION_NAME;
    542 
    543     if ( (NULL == buffer) || (NULL == cap) ) {
    544         CAMHAL_LOGEA("Invalid input arguments");
    545         return -EINVAL;
    546     }
    547 
    548     for ( unsigned int i = 0 ; i < capCount ; i++ ) {
    549         if ( (cap[i].width <= res.nWidthMax) &&
    550              (cap[i].height <= res.nHeightMax) &&
    551              (cap[i].width >= res.nWidthMin) &&
    552              (cap[i].height >= res.nHeightMin) ) {
    553                 if (buffer[0] != '\0') {
    554                     strncat(buffer, PARAM_SEP, bufferSize - 1);
    555                 }
    556                 strncat(buffer, cap[i].param, bufferSize -1);
    557         }
    558     }
    559 
    560     LOG_FUNCTION_NAME_EXIT;
    561 
    562     return ret;
    563 }
    564 
    565 status_t OMXCameraAdapter::encodeSizeCap3D(OMX_TI_CAPRESTYPE &res,
    566                       const CapResolution *cap,
    567                       size_t capCount,
    568                       char * buffer,
    569                       size_t bufferSize)
    570 {
    571    status_t ret = NO_ERROR;
    572 
    573    LOG_FUNCTION_NAME;
    574 
    575    if ( (NULL == buffer) || (NULL == cap) ) {
    576        CAMHAL_LOGEA("Invalid input arguments");
    577        return -EINVAL;
    578    }
    579 
    580    for ( unsigned int i = 0 ; i < capCount ; i++ ) {
    581        if ( (cap[i].width <= res.nWidthMax) &&
    582             (cap[i].height <= res.nHeightMax) &&
    583             (cap[i].width >= res.nWidthMin) &&
    584             (cap[i].height >= res.nHeightMin)  &&
    585             (cap[i].width * cap[i].height <= res.nMaxResInPixels))  {
    586                if (buffer[0] != '\0') {
    587                    strncat(buffer, PARAM_SEP, bufferSize - 1);
    588                }
    589                strncat(buffer, cap[i].param, bufferSize -1);
    590        }
    591    }
    592 
    593    LOG_FUNCTION_NAME_EXIT;
    594 
    595    return ret;
    596 }
    597 
    598 status_t OMXCameraAdapter::insertImageSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
    599 {
    600     status_t ret = NO_ERROR;
    601     char supported[MAX_PROP_VALUE_LENGTH];
    602     int s3d_detected = 0;
    603     int s3d_ss_detected = 0;
    604     int s3d_tb_detected = 0;
    605 
    606     LOG_FUNCTION_NAME;
    607 
    608     for ( unsigned int i = 0 ; i < caps.ulCapFrameLayoutCount; i++ ) {
    609         if (caps.eCapFrameLayout[i] == OMX_TI_StereoFrameLayoutTopBottom)
    610         {
    611             s3d_tb_detected = 1;
    612         }
    613         else if (caps.eCapFrameLayout[i] == OMX_TI_StereoFrameLayoutLeftRight)
    614         {
    615             s3d_ss_detected = 1;
    616         }
    617         else if ( (caps.eCapFrameLayout[i] == OMX_TI_StereoFrameLayoutTopBottomSubsample)
    618                    || (caps.eCapFrameLayout[i] == OMX_TI_StereoFrameLayoutLeftRightSubsample) )
    619         {
    620             s3d_detected = 1;
    621         }
    622     }
    623 
    624     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    625 
    626     // Check if we are in 2d mode
    627     if (!s3d_ss_detected && !s3d_tb_detected && !s3d_detected)
    628     {
    629         ret = encodeSizeCap(caps.tImageResRange,
    630                         mImageCapRes,
    631                         ARRAY_SIZE(mImageCapRes),
    632                         supported,
    633                         MAX_PROP_VALUE_LENGTH);
    634 
    635         if ( NO_ERROR != ret ) {
    636             CAMHAL_LOGEB("Error inserting supported picture sizes 0x%x", ret);
    637         } else {
    638             params->set(CameraProperties::SUPPORTED_PICTURE_SIZES, supported);
    639         }
    640         params->set(CameraProperties::MAX_PICTURE_WIDTH, caps.tImageResRange.nWidthMax);
    641         params->set(CameraProperties::MAX_PICTURE_HEIGHT, caps.tImageResRange.nHeightMax);
    642     }
    643     else // 3d mode
    644     {
    645         if (s3d_tb_detected)
    646         {
    647             ret = encodeSizeCap3D(caps.tImageResRange,
    648                             mImageCapResTB,
    649                             ARRAY_SIZE(mImageCapResTB),
    650                             supported,
    651                             MAX_PROP_VALUE_LENGTH);
    652 
    653             if ( NO_ERROR != ret ) {
    654                 CAMHAL_LOGEB("Error inserting supported picture sizes 0x%x", ret);
    655             } else {
    656                 params->set(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES, supported);
    657             }
    658         }
    659         else
    660         {
    661             params->set(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES, supported);
    662         }
    663 
    664         memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    665 
    666         if (s3d_ss_detected)
    667         {
    668             ret = encodeSizeCap3D(caps.tImageResRange,
    669                             mImageCapResSS,
    670                             ARRAY_SIZE(mImageCapResSS),
    671                             supported,
    672                             MAX_PROP_VALUE_LENGTH);
    673 
    674             if ( NO_ERROR != ret ) {
    675                 CAMHAL_LOGEB("Error inserting supported picture sizes 0x%x", ret);
    676             } else {
    677                 params->set(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES, supported);
    678             }
    679         }
    680         else
    681         {
    682             params->set(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES, supported);
    683         }
    684 
    685         memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    686 
    687         if (s3d_detected)
    688         {
    689             ret = encodeSizeCap3D(caps.tImageResRange,
    690                             mImageCapRes,
    691                             ARRAY_SIZE(mImageCapRes),
    692                             supported,
    693                             MAX_PROP_VALUE_LENGTH);
    694 
    695             if ( NO_ERROR != ret ) {
    696                 CAMHAL_LOGEB("Error inserting supported picture sizes 0x%x", ret);
    697             } else {
    698                 params->set(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES, supported);
    699             }
    700         } else {
    701             params->set(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES, supported);
    702         }
    703     }
    704 
    705     LOG_FUNCTION_NAME_EXIT;
    706 
    707     return ret;
    708 }
    709 
    710 status_t OMXCameraAdapter::insertPreviewSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
    711 {
    712     status_t ret = NO_ERROR;
    713     char supported[MAX_PROP_VALUE_LENGTH];
    714     int s3d_detected = 0;
    715     int s3d_ss_detected = 0;
    716     int s3d_tb_detected = 0;
    717 
    718     LOG_FUNCTION_NAME;
    719 
    720     for ( unsigned int i = 0 ; i < caps.ulPrvFrameLayoutCount; i++ ) {
    721         if (caps.ePrvFrameLayout[i] == OMX_TI_StereoFrameLayoutTopBottom)
    722         {
    723             s3d_tb_detected = 1;
    724         }
    725         else if (caps.ePrvFrameLayout[i] == OMX_TI_StereoFrameLayoutLeftRight)
    726         {
    727             s3d_ss_detected = 1;
    728         }
    729         else if ( (caps.ePrvFrameLayout[i] == OMX_TI_StereoFrameLayoutTopBottomSubsample)
    730                     || (caps.ePrvFrameLayout[i] == OMX_TI_StereoFrameLayoutLeftRightSubsample) )
    731         {
    732             s3d_detected = 1;
    733         }
    734     }
    735 
    736     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    737 
    738     // Check if we are in 2d mode
    739     if (!s3d_ss_detected && !s3d_tb_detected && !s3d_detected)
    740     {
    741         ret = encodeSizeCap(caps.tPreviewResRange,
    742                         mPreviewRes,
    743                         ARRAY_SIZE(mPreviewRes),
    744                         supported,
    745                         MAX_PROP_VALUE_LENGTH);
    746 
    747         if ( NO_ERROR != ret ) {
    748             CAMHAL_LOGEB("Error inserting supported Landscape preview sizes 0x%x", ret);
    749             return ret;
    750         }
    751 
    752         /* Insert Portait Resolutions by verifying Potrait Capability Support */
    753         ret = encodeSizeCap(caps.tRotatedPreviewResRange,
    754                             mPreviewPortraitRes,
    755                             ARRAY_SIZE(mPreviewPortraitRes),
    756                             supported,
    757                             MAX_PROP_VALUE_LENGTH);
    758 
    759         if ( NO_ERROR != ret ) {
    760             CAMHAL_LOGEB("Error inserting supported Potrait preview sizes 0x%x", ret);
    761         } else {
    762             params->set(CameraProperties::SUPPORTED_PREVIEW_SIZES, supported);
    763         }
    764     }
    765     else // 3d mode
    766     {
    767         if (s3d_tb_detected)
    768         {
    769             ret = encodeSizeCap3D(caps.tPreviewResRange,
    770                             mPreviewResTB,
    771                             ARRAY_SIZE(mPreviewResTB),
    772                             supported,
    773                             MAX_PROP_VALUE_LENGTH);
    774             if ( NO_ERROR != ret ) {
    775                 CAMHAL_LOGEB("Error inserting supported 3D TB preview sizes 0x%x", ret);
    776                 return ret;
    777             } else {
    778                 params->set(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES, supported);
    779             }
    780         }
    781         else
    782         {
    783             params->set(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES, supported);
    784         }
    785 
    786         memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    787 
    788         if (s3d_ss_detected)
    789         {
    790             ret = encodeSizeCap3D(caps.tPreviewResRange,
    791                             mPreviewResSS,
    792                             ARRAY_SIZE(mPreviewResSS),
    793                             supported,
    794                             MAX_PROP_VALUE_LENGTH);
    795             if ( NO_ERROR != ret ) {
    796                 CAMHAL_LOGEB("Error inserting supported 3D SS preview sizes 0x%x", ret);
    797                 return ret;
    798             } else {
    799                 params->set(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES, supported);
    800             }
    801         }
    802         else
    803         {
    804             params->set(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES, supported);
    805         }
    806 
    807         memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    808 
    809         if (s3d_detected)
    810         {
    811             ret = encodeSizeCap3D(caps.tPreviewResRange,
    812                             mPreviewRes,
    813                             ARRAY_SIZE(mPreviewRes),
    814                             supported,
    815                             MAX_PROP_VALUE_LENGTH);
    816 
    817             if ( NO_ERROR != ret ) {
    818                 CAMHAL_LOGEB("Error inserting supported preview sizes 0x%x", ret);
    819                 return ret;
    820             } else {
    821                 params->set(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES, supported);
    822             }
    823         }
    824         else
    825         {
    826             params->set(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES, supported);
    827         }
    828      }
    829 
    830     LOG_FUNCTION_NAME_EXIT;
    831 
    832     return ret;
    833 }
    834 
    835 status_t OMXCameraAdapter::insertVideoSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
    836 {
    837     status_t ret = NO_ERROR;
    838     char supported[MAX_PROP_VALUE_LENGTH];
    839 
    840     LOG_FUNCTION_NAME;
    841 
    842     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    843 
    844     ret = encodeSizeCap(caps.tPreviewResRange,
    845                         mPreviewRes,
    846                         ARRAY_SIZE(mPreviewRes),
    847                         supported,
    848                         MAX_PROP_VALUE_LENGTH);
    849 
    850     if ( NO_ERROR != ret ) {
    851       CAMHAL_LOGEB("Error inserting supported video sizes 0x%x", ret);
    852     } else {
    853       params->set(CameraProperties::SUPPORTED_VIDEO_SIZES, supported);
    854     }
    855 
    856     LOG_FUNCTION_NAME_EXIT;
    857 
    858     return ret;
    859 }
    860 
    861 status_t OMXCameraAdapter::insertThumbSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
    862 {
    863     status_t ret = NO_ERROR;
    864     char supported[MAX_PROP_VALUE_LENGTH];
    865 
    866     LOG_FUNCTION_NAME;
    867 
    868     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    869 
    870     ret = encodeSizeCap(caps.tThumbResRange,
    871                         mThumbRes,
    872                         ARRAY_SIZE(mThumbRes),
    873                         supported,
    874                         MAX_PROP_VALUE_LENGTH);
    875 
    876     if ( NO_ERROR != ret ) {
    877         CAMHAL_LOGEB("Error inserting supported thumbnail sizes 0x%x", ret);
    878     } else {
    879         //CTS Requirement: 0x0 should always be supported
    880         if (supported[0] != '\0') {
    881             strncat(supported, PARAM_SEP, 1);
    882         }
    883         strncat(supported, "0x0", MAX_PROP_NAME_LENGTH);
    884         params->set(CameraProperties::SUPPORTED_THUMBNAIL_SIZES, supported);
    885     }
    886 
    887     LOG_FUNCTION_NAME_EXIT;
    888 
    889     return ret;
    890 }
    891 
    892 status_t OMXCameraAdapter::insertZoomStages(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
    893 {
    894     status_t ret = NO_ERROR;
    895     char supported[MAX_PROP_VALUE_LENGTH];
    896     size_t zoomStageCount = 0;
    897 
    898     LOG_FUNCTION_NAME;
    899 
    900     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    901 
    902     zoomStageCount = encodeZoomCap(caps.xMaxWidthZoom,
    903                                    mZoomStages,
    904                                    ARRAY_SIZE(mZoomStages),
    905                                    supported,
    906                                    MAX_PROP_VALUE_LENGTH);
    907 
    908     params->set(CameraProperties::SUPPORTED_ZOOM_RATIOS, supported);
    909     params->set(CameraProperties::SUPPORTED_ZOOM_STAGES, zoomStageCount - 1); //As per CTS requirement
    910 
    911     if ( 0 == zoomStageCount ) {
    912         params->set(CameraProperties::ZOOM_SUPPORTED, android::CameraParameters::FALSE);
    913         params->set(CameraProperties::SMOOTH_ZOOM_SUPPORTED, android::CameraParameters::FALSE);
    914     } else {
    915         params->set(CameraProperties::ZOOM_SUPPORTED, android::CameraParameters::TRUE);
    916         params->set(CameraProperties::SMOOTH_ZOOM_SUPPORTED, android::CameraParameters::TRUE);
    917     }
    918 
    919     LOG_FUNCTION_NAME_EXIT;
    920 
    921     return ret;
    922 }
    923 
    924 status_t OMXCameraAdapter::insertImageFormats(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
    925 {
    926     status_t ret = NO_ERROR;
    927     char supported[MAX_PROP_VALUE_LENGTH];
    928 
    929     LOG_FUNCTION_NAME;
    930 
    931     memset(supported, '\0', sizeof(supported));
    932 
    933     for ( int i = 0 ; i < caps.ulImageFormatCount ; i++ ) {
    934         ret = encodePixelformatCap(caps.eImageFormats[i],
    935                                    mPixelformats,
    936                                    ARRAY_SIZE(mPixelformats),
    937                                    supported,
    938                                    MAX_PROP_VALUE_LENGTH);
    939 
    940         if ( NO_ERROR != ret ) {
    941             CAMHAL_LOGEB("Error inserting supported picture formats 0x%x", ret);
    942             break;
    943         }
    944     }
    945 
    946     for (int i = 0; i < caps.ulImageCodingFormatCount ; i++) {
    947         ret = encodeImageCodingFormatCap(caps.eImageCodingFormat[i],
    948                                         mImageCodingFormat,
    949                                         ARRAY_SIZE(mImageCodingFormat),
    950                                         supported);
    951 
    952         if ( NO_ERROR != ret ) {
    953             CAMHAL_LOGEB("Error inserting supported picture formats 0x%x", ret);
    954             break;
    955         }
    956     }
    957 
    958     if ( NO_ERROR == ret ) {
    959         params->set(CameraProperties::SUPPORTED_PICTURE_FORMATS, supported);
    960     }
    961 
    962     LOG_FUNCTION_NAME_EXIT;
    963 
    964     return ret;
    965 }
    966 
    967 status_t OMXCameraAdapter::insertPreviewFormats(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
    968 {
    969     status_t ret = NO_ERROR;
    970     char supported[MAX_PROP_VALUE_LENGTH];
    971 
    972     LOG_FUNCTION_NAME;
    973 
    974     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
    975 
    976     for ( int i = 0 ; i < caps.ulPreviewFormatCount; i++ ) {
    977         ret = encodePixelformatCap(caps.ePreviewFormats[i],
    978                                    mPixelformats,
    979                                    ARRAY_SIZE(mPixelformats),
    980                                    supported,
    981                                    MAX_PROP_VALUE_LENGTH);
    982         if ( NO_ERROR != ret ) {
    983             CAMHAL_LOGEB("Error inserting supported preview formats 0x%x", ret);
    984             break;
    985         }
    986     }
    987 
    988     if ( NO_ERROR == ret ) {
    989         // need to advertise we support YV12 format
    990         // We will program preview port with NV21 when we see application set YV12
    991         if (supported[0] != '\0') {
    992             strncat(supported, PARAM_SEP, 1);
    993         }
    994         strncat(supported, android::CameraParameters::PIXEL_FORMAT_YUV420P, MAX_PROP_VALUE_LENGTH - 1);
    995         params->set(CameraProperties::SUPPORTED_PREVIEW_FORMATS, supported);
    996     }
    997 
    998     LOG_FUNCTION_NAME_EXIT;
    999 
   1000     return ret;
   1001 }
   1002 
   1003 status_t OMXCameraAdapter::insertFramerates(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1004 {
   1005     // collect supported normal frame rates
   1006     {
   1007         android::Vector<FpsRange> fpsRanges;
   1008 
   1009         const int minFrameRate = max<int>(FPS_MIN * CameraHal::VFR_SCALE,
   1010                 androidFromDucatiFrameRate(caps.xFramerateMin));
   1011         const int maxFrameRate = min<int>(FPS_MAX * CameraHal::VFR_SCALE,
   1012                 androidFromDucatiFrameRate(caps.xFramerateMax));
   1013 
   1014         if ( minFrameRate > maxFrameRate ) {
   1015             CAMHAL_LOGE("Invalid frame rate range: [%d .. %d]", caps.xFramerateMin, caps.xFramerateMax);
   1016             return BAD_VALUE;
   1017         }
   1018 
   1019         encodeFrameRates(minFrameRate, maxFrameRate, caps, mFramerates, ARRAY_SIZE(mFramerates), fpsRanges);
   1020 
   1021         // populate variable frame rates
   1022         char supported[MAX_PROP_VALUE_LENGTH];
   1023         char defaultRange[MAX_PROP_VALUE_LENGTH];
   1024 
   1025         memset(supported, 0, sizeof(supported));
   1026         memset(defaultRange, 0, sizeof(defaultRange));
   1027 
   1028         for ( int i = 0; i < static_cast<int>(fpsRanges.size()); ++i ) {
   1029             const FpsRange & fpsRange = fpsRanges.itemAt(i);
   1030             if ( supported[0] ) strncat(supported, PARAM_SEP, 1);
   1031             char tmp[MAX_PROP_VALUE_LENGTH];
   1032             snprintf(tmp, sizeof(tmp) - 1, "(%d,%d)", fpsRange.min(), fpsRange.max());
   1033             strcat(supported, tmp);
   1034         }
   1035 
   1036         const FpsRange & defaultFpsRange = fpsRanges.itemAt(fpsRanges.size() - 1);
   1037         snprintf(defaultRange, sizeof(defaultRange) - 1, "%d,%d", defaultFpsRange.min(), defaultFpsRange.max());
   1038 
   1039         CAMHAL_LOGD("Supported framerate ranges: %s", supported);
   1040         CAMHAL_LOGD("Default framerate range: [%s]", defaultRange);
   1041 
   1042         params->set(CameraProperties::FRAMERATE_RANGE_SUPPORTED, supported);
   1043         params->set(CameraProperties::FRAMERATE_RANGE, defaultRange);
   1044 
   1045         // populate fixed frame rates
   1046         memset(supported, 0, sizeof(supported));
   1047         memset(defaultRange, 0, sizeof(defaultRange));
   1048 
   1049         for ( int i = 0; i < static_cast<int>(fpsRanges.size()); ++i ) {
   1050             const FpsRange & fpsRange = fpsRanges.itemAt(i);
   1051             if ( fpsRange.isFixed() && (fpsRange.min()%CameraHal::VFR_SCALE) == 0 ) {
   1052                 if ( supported[0] ) strncat(supported, PARAM_SEP, 1);
   1053                 char tmp[MAX_PROP_VALUE_LENGTH];
   1054                 snprintf(tmp, sizeof(tmp) - 1, "%d", fpsRange.min()/CameraHal::VFR_SCALE);
   1055                 strcat(supported, tmp);
   1056             }
   1057         }
   1058 
   1059         CAMHAL_LOGD("Supported preview framerates: %s", supported);
   1060         params->set(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES, supported);
   1061 
   1062         // insert default frame rate only if it is fixed
   1063         if ( defaultFpsRange.isFixed() && (defaultFpsRange.min()%CameraHal::VFR_SCALE) == 0 ) {
   1064             snprintf(defaultRange, sizeof(defaultRange) - 1, "%d", defaultFpsRange.min()/CameraHal::VFR_SCALE);
   1065             params->set(CameraProperties::PREVIEW_FRAME_RATE, defaultRange);
   1066         }
   1067     }
   1068 
   1069     // collect supported extended frame rates
   1070     {
   1071         android::Vector<FpsRange> fpsRanges;
   1072 
   1073         const int minFrameRate = max<int>(FPS_MIN * CameraHal::VFR_SCALE,
   1074                 androidFromDucatiFrameRate(caps.xFramerateMin));
   1075         const int maxFrameRate = min<int>(FPS_MAX_EXTENDED * CameraHal::VFR_SCALE,
   1076                 androidFromDucatiFrameRate(caps.xFramerateMax));
   1077 
   1078         encodeFrameRates(minFrameRate, maxFrameRate, caps, mFramerates, ARRAY_SIZE(mFramerates), fpsRanges);
   1079 
   1080         // populate variable frame rates
   1081         char supported[MAX_PROP_VALUE_LENGTH];
   1082         memset(supported, 0, sizeof(supported) - 1);
   1083 
   1084         for ( int i = 0; i < static_cast<int>(fpsRanges.size()); ++i ) {
   1085             const FpsRange & fpsRange = fpsRanges.itemAt(i);
   1086             if ( supported[0] ) strncat(supported, PARAM_SEP, 1);
   1087             char tmp[MAX_PROP_VALUE_LENGTH];
   1088             snprintf(tmp, sizeof(tmp) - 1, "(%d,%d)", fpsRange.min(), fpsRange.max());
   1089             strcat(supported, tmp);
   1090         }
   1091 
   1092         CAMHAL_LOGD("Supported framerate ranges extended: %s", supported);
   1093         params->set(CameraProperties::FRAMERATE_RANGE_EXT_SUPPORTED, supported);
   1094 
   1095         // populate fixed frame rates
   1096         memset(supported, 0, sizeof(supported) - 1);
   1097 
   1098         for ( int i = 0; i < static_cast<int>(fpsRanges.size()); ++i ) {
   1099             const FpsRange & fpsRange = fpsRanges.itemAt(i);
   1100             if ( fpsRange.isFixed() && (fpsRange.min()%CameraHal::VFR_SCALE) == 0 ) {
   1101                 if ( supported[0] ) strncat(supported, PARAM_SEP, 1);
   1102                 char tmp[MAX_PROP_VALUE_LENGTH];
   1103                 snprintf(tmp, sizeof(tmp) - 1, "%d", fpsRange.min()/CameraHal::VFR_SCALE);
   1104                 strcat(supported, tmp);
   1105             }
   1106         }
   1107 
   1108         CAMHAL_LOGD("Supported extended preview framerates: %s", supported);
   1109         params->set(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES_EXT, supported);
   1110     }
   1111 
   1112     return OK;
   1113 }
   1114 
   1115 status_t OMXCameraAdapter::insertEVs(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1116 {
   1117     status_t ret = NO_ERROR;
   1118     char supported[MAX_PROP_VALUE_LENGTH];
   1119 
   1120     LOG_FUNCTION_NAME;
   1121 
   1122     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1123 
   1124     snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", ( int ) ( caps.xEVCompensationMin * 10 ));
   1125     params->set(CameraProperties::SUPPORTED_EV_MIN, supported);
   1126 
   1127     snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", ( int ) ( caps.xEVCompensationMax * 10 ));
   1128     params->set(CameraProperties::SUPPORTED_EV_MAX, supported);
   1129 
   1130     LOG_FUNCTION_NAME_EXIT;
   1131 
   1132     return ret;
   1133 }
   1134 
   1135 status_t OMXCameraAdapter::insertISOModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1136 {
   1137     status_t ret = NO_ERROR;
   1138     char supported[MAX_PROP_VALUE_LENGTH];
   1139 
   1140     LOG_FUNCTION_NAME;
   1141 
   1142     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1143 
   1144     ret = encodeISOCap(caps.nSensitivityMax,
   1145                        mISOStages,
   1146                        ARRAY_SIZE(mISOStages),
   1147                        supported,
   1148                        MAX_PROP_VALUE_LENGTH);
   1149     if ( NO_ERROR != ret ) {
   1150         CAMHAL_LOGEB("Error inserting supported ISO modes 0x%x", ret);
   1151     } else {
   1152         params->set(CameraProperties::SUPPORTED_ISO_VALUES, supported);
   1153     }
   1154 
   1155     LOG_FUNCTION_NAME_EXIT;
   1156 
   1157     return ret;
   1158 }
   1159 
   1160 status_t OMXCameraAdapter::insertIPPModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1161 {
   1162     status_t ret = NO_ERROR;
   1163     char supported[MAX_PROP_VALUE_LENGTH];
   1164 
   1165     LOG_FUNCTION_NAME;
   1166 
   1167     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1168 
   1169     //Off is always supported
   1170     strncat(supported, TICameraParameters::IPP_NONE, MAX_PROP_NAME_LENGTH);
   1171 
   1172     if ( caps.bLensDistortionCorrectionSupported ) {
   1173         strncat(supported, PARAM_SEP, 1);
   1174         strncat(supported, TICameraParameters::IPP_LDC, MAX_PROP_NAME_LENGTH);
   1175     }
   1176 
   1177     if ( caps.bISONoiseFilterSupported ) {
   1178         strncat(supported, PARAM_SEP, 1);
   1179         strncat(supported, TICameraParameters::IPP_NSF, MAX_PROP_NAME_LENGTH);
   1180     }
   1181 
   1182     if ( caps.bISONoiseFilterSupported && caps.bLensDistortionCorrectionSupported ) {
   1183         strncat(supported, PARAM_SEP, 1);
   1184         strncat(supported, TICameraParameters::IPP_LDCNSF, MAX_PROP_NAME_LENGTH);
   1185     }
   1186 
   1187     params->set(CameraProperties::SUPPORTED_IPP_MODES, supported);
   1188 
   1189     LOG_FUNCTION_NAME_EXIT;
   1190 
   1191     return ret;
   1192 }
   1193 
   1194 status_t OMXCameraAdapter::insertWBModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1195 {
   1196     status_t ret = NO_ERROR;
   1197     char supported[MAX_PROP_VALUE_LENGTH];
   1198     const char *p;
   1199 
   1200     LOG_FUNCTION_NAME;
   1201 
   1202     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1203 
   1204     for ( unsigned int i = 0 ; i < caps.ulWhiteBalanceCount ; i++ ) {
   1205         p = getLUTvalue_OMXtoHAL(caps.eWhiteBalanceModes[i], WBalLUT);
   1206         if ( NULL != p ) {
   1207             if (supported[0] != '\0') {
   1208                 strncat(supported, PARAM_SEP, 1);
   1209             }
   1210             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1211         }
   1212     }
   1213 
   1214     params->set(CameraProperties::SUPPORTED_WHITE_BALANCE, supported);
   1215 
   1216     LOG_FUNCTION_NAME_EXIT;
   1217 
   1218     return ret;
   1219 }
   1220 
   1221 status_t OMXCameraAdapter::insertEffects(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1222 {
   1223     status_t ret = NO_ERROR;
   1224     char supported[MAX_PROP_VALUE_LENGTH];
   1225     const char *p;
   1226 
   1227     LOG_FUNCTION_NAME;
   1228 
   1229     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1230 
   1231     for ( unsigned int i = 0 ; i < caps.ulColorEffectCount; i++ ) {
   1232         p = getLUTvalue_OMXtoHAL(caps.eColorEffects[i], EffLUT);
   1233         if ( NULL != p ) {
   1234             if (supported[0] != '\0') {
   1235                 strncat(supported, PARAM_SEP, 1);
   1236             }
   1237             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1238         }
   1239     }
   1240 
   1241     params->set(CameraProperties::SUPPORTED_EFFECTS, supported);
   1242 
   1243     LOG_FUNCTION_NAME_EXIT;
   1244 
   1245     return ret;
   1246 }
   1247 
   1248 status_t OMXCameraAdapter::insertExpModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1249 {
   1250     status_t ret = NO_ERROR;
   1251     char supported[MAX_PROP_VALUE_LENGTH];
   1252     const char *p;
   1253 
   1254     LOG_FUNCTION_NAME;
   1255 
   1256     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1257 
   1258     for ( unsigned int i = 0 ; i < caps.ulExposureModeCount; i++ ) {
   1259         p = getLUTvalue_OMXtoHAL(caps.eExposureModes[i], ExpLUT);
   1260         if ( NULL != p ) {
   1261             if (supported[0] != '\0') {
   1262                 strncat(supported, PARAM_SEP, 1);
   1263             }
   1264             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1265         }
   1266     }
   1267 
   1268     params->set(CameraProperties::SUPPORTED_EXPOSURE_MODES, supported);
   1269 
   1270     LOG_FUNCTION_NAME_EXIT;
   1271 
   1272     return ret;
   1273 }
   1274 
   1275 status_t OMXCameraAdapter::insertManualExpRanges(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) {
   1276     status_t ret = NO_ERROR;
   1277     char supported[MAX_PROP_VALUE_LENGTH];
   1278 
   1279     LOG_FUNCTION_NAME;
   1280 
   1281     if (caps.nManualExpMin > caps.nManualExpMax) {
   1282         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) 0);
   1283         params->set(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN, supported);
   1284 
   1285         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) 0);
   1286         params->set(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MAX, supported);
   1287 
   1288         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) 0);
   1289         params->set(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_STEP, supported);
   1290     } else {
   1291         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) caps.nManualExpMin);
   1292         params->set(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN, supported);
   1293 
   1294         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) caps.nManualExpMax);
   1295         params->set(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MAX, supported);
   1296 
   1297         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) MANUAL_EXPOSURE_STEP);
   1298         params->set(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_STEP, supported);
   1299     }
   1300 
   1301     if (MANUAL_GAIN_ISO_MIN > caps.nSensitivityMax) {
   1302         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) 0);
   1303         params->set(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN, supported);
   1304 
   1305         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) 0);
   1306         params->set(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MAX, supported);
   1307 
   1308         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) 0);
   1309         params->set(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_STEP, supported);    }
   1310     else {
   1311         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) MANUAL_GAIN_ISO_MIN);
   1312         params->set(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN, supported);
   1313 
   1314         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) caps.nSensitivityMax);
   1315         params->set(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MAX, supported);
   1316 
   1317         snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", (int) MANUAL_GAIN_ISO_STEP);
   1318         params->set(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_STEP, supported);
   1319     }
   1320 
   1321     LOG_FUNCTION_NAME_EXIT;
   1322 
   1323     return ret;
   1324 }
   1325 
   1326 status_t OMXCameraAdapter::insertFlashModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1327 {
   1328     status_t ret = NO_ERROR;
   1329     char supported[MAX_PROP_VALUE_LENGTH];
   1330     const char *p;
   1331 
   1332     LOG_FUNCTION_NAME;
   1333 
   1334     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1335 
   1336     for ( unsigned int i = 0 ; i < caps.ulFlashCount; i++ ) {
   1337         p = getLUTvalue_OMXtoHAL(caps.eFlashModes[i], FlashLUT);
   1338         if ( NULL != p ) {
   1339             if (supported[0] != '\0') {
   1340                 strncat(supported, PARAM_SEP, 1);
   1341             }
   1342             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1343         }
   1344     }
   1345 
   1346     if ( strlen(supported) == 0 ) {
   1347         strncpy(supported, DEFAULT_FLASH_MODE, MAX_PROP_NAME_LENGTH);
   1348     }
   1349 
   1350     params->set(CameraProperties::SUPPORTED_FLASH_MODES, supported);
   1351 
   1352     LOG_FUNCTION_NAME_EXIT;
   1353 
   1354     return ret;
   1355 }
   1356 
   1357 status_t OMXCameraAdapter::insertSceneModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1358 {
   1359     status_t ret = NO_ERROR;
   1360     char supported[MAX_PROP_VALUE_LENGTH];
   1361     const char *p;
   1362 
   1363     LOG_FUNCTION_NAME;
   1364 
   1365     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1366 
   1367     for ( unsigned int i = 0 ; i < caps.ulSceneCount; i++ ) {
   1368         p = getLUTvalue_OMXtoHAL(caps.eSceneModes[i], SceneLUT);
   1369         if ( NULL != p ) {
   1370             if (supported[0] != '\0') {
   1371                 strncat(supported, PARAM_SEP, 1);
   1372             }
   1373             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1374         }
   1375     }
   1376 
   1377     params->set(CameraProperties::SUPPORTED_SCENE_MODES, supported);
   1378 
   1379     LOG_FUNCTION_NAME_EXIT;
   1380 
   1381     return ret;
   1382 }
   1383 
   1384 status_t OMXCameraAdapter::insertFocusModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1385 {
   1386     status_t ret = NO_ERROR;
   1387     char supported[MAX_PROP_VALUE_LENGTH];
   1388 
   1389     LOG_FUNCTION_NAME;
   1390 
   1391     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1392 
   1393     for ( unsigned int i = 0 ; i < caps.ulFocusModeCount; i++ ) {
   1394         getMultipleLUTvalue_OMXtoHAL(caps.eFocusModes[i], FocusLUT, supported);
   1395     }
   1396 
   1397     // Check if focus is supported by camera
   1398     if (caps.ulFocusModeCount == 1 &&
   1399         caps.eFocusModes[0] == OMX_IMAGE_FocusControlOff) {
   1400         // Focus is not supported by camera
   1401         // Advertise this to app as infinitiy focus mode
   1402         if (supported[0] != '\0') {
   1403             strncat(supported, PARAM_SEP, 1);
   1404         }
   1405         strncat(supported, android::CameraParameters::FOCUS_MODE_INFINITY, MAX_PROP_NAME_LENGTH);
   1406     }
   1407 
   1408     params->set(CameraProperties::SUPPORTED_FOCUS_MODES, supported);
   1409 
   1410     LOG_FUNCTION_NAME_EXIT;
   1411 
   1412     return ret;
   1413 }
   1414 
   1415 status_t OMXCameraAdapter::insertFlickerModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1416 {
   1417     status_t ret = NO_ERROR;
   1418     char supported[MAX_PROP_VALUE_LENGTH];
   1419     const char *p;
   1420 
   1421     LOG_FUNCTION_NAME;
   1422 
   1423     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1424 
   1425     for ( unsigned int i = 0 ; i < caps.ulFlickerCount; i++ ) {
   1426         p = getLUTvalue_OMXtoHAL(caps.eFlicker[i], FlickerLUT);
   1427         if ( NULL != p ) {
   1428             if (supported[0] != '\0') {
   1429                 strncat(supported, PARAM_SEP, 1);
   1430             }
   1431             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1432         }
   1433     }
   1434 
   1435     params->set(CameraProperties::SUPPORTED_ANTIBANDING, supported);
   1436 
   1437     LOG_FUNCTION_NAME_EXIT;
   1438 
   1439     return ret;
   1440 }
   1441 
   1442 status_t OMXCameraAdapter::insertAreas(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1443 {
   1444     status_t ret = NO_ERROR;
   1445     char supported[MAX_PROP_VALUE_LENGTH];
   1446     const char *p;
   1447 
   1448     LOG_FUNCTION_NAME;
   1449 
   1450     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1451 
   1452     sprintf(supported, "%d", caps.ulAlgoAreasFocusCount);
   1453     params->set(CameraProperties::MAX_FOCUS_AREAS, supported);
   1454     CAMHAL_LOGDB("Maximum supported focus areas %s", supported);
   1455 
   1456     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1457     sprintf(supported, "%d", caps.ulAlgoAreasExposureCount);
   1458     params->set(CameraProperties::MAX_NUM_METERING_AREAS, supported);
   1459     CAMHAL_LOGDB("Maximum supported exposure areas %s", supported);
   1460 
   1461     LOG_FUNCTION_NAME_EXIT;
   1462 
   1463     return ret;
   1464 }
   1465 
   1466 status_t OMXCameraAdapter::insertVNFSupported(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) {
   1467     status_t ret = NO_ERROR;
   1468 
   1469     LOG_FUNCTION_NAME;
   1470 
   1471     if ( OMX_TRUE == caps.bVideoNoiseFilterSupported ) {
   1472         params->set(CameraProperties::VNF_SUPPORTED, android::CameraParameters::TRUE);
   1473     } else {
   1474         params->set(CameraProperties::VNF_SUPPORTED, android::CameraParameters::FALSE);
   1475     }
   1476 
   1477     LOG_FUNCTION_NAME_EXIT;
   1478 
   1479     return ret;
   1480 }
   1481 
   1482 status_t OMXCameraAdapter::insertVSTABSupported(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) {
   1483     status_t ret = NO_ERROR;
   1484 
   1485     LOG_FUNCTION_NAME;
   1486 
   1487     if ( OMX_TRUE == caps.bVideoStabilizationSupported ) {
   1488         params->set(CameraProperties::VSTAB_SUPPORTED, android::CameraParameters::TRUE);
   1489     } else {
   1490         params->set(CameraProperties::VSTAB_SUPPORTED, android::CameraParameters::FALSE);
   1491     }
   1492 
   1493     LOG_FUNCTION_NAME_EXIT;
   1494 
   1495     return ret;
   1496 }
   1497 
   1498 status_t OMXCameraAdapter::insertLocks(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1499 {
   1500     status_t ret = NO_ERROR;
   1501 
   1502     LOG_FUNCTION_NAME
   1503 
   1504     if ( caps.bAELockSupported ) {
   1505         params->set(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED, android::CameraParameters::TRUE);
   1506     } else {
   1507         params->set(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED, android::CameraParameters::FALSE);
   1508     }
   1509 
   1510     if ( caps.bAWBLockSupported ) {
   1511         params->set(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED, android::CameraParameters::TRUE);
   1512     } else {
   1513         params->set(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED, android::CameraParameters::FALSE);
   1514     }
   1515 
   1516     LOG_FUNCTION_NAME_EXIT
   1517 
   1518     return ret;
   1519 }
   1520 
   1521 status_t OMXCameraAdapter::insertSenMount(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1522 {
   1523     status_t ret = NO_ERROR;
   1524     char supported[MAX_PROP_VALUE_LENGTH];
   1525     const char *p;
   1526     unsigned int i = 0;
   1527 
   1528     LOG_FUNCTION_NAME;
   1529 
   1530     memset(supported, '\0', sizeof(supported));
   1531 
   1532     // 1) Look up and assign sensor name
   1533     for (i = 0; i < ARRAY_SIZE(mSensorNames); i++) {
   1534         if(mSensorNames[i].num == caps.tSenMounting.nSenId) {
   1535             // sensor found
   1536             break;
   1537         }
   1538     }
   1539     if ( i == ARRAY_SIZE(mSensorNames) ) {
   1540         p = "UNKNOWN_SENSOR";
   1541     } else {
   1542         p = mSensorNames[i].param;
   1543     }
   1544     strncat(supported, p, REMAINING_BYTES(supported));
   1545     params->set(CameraProperties::CAMERA_NAME, supported);
   1546     params->set(CameraProperties::CAMERA_SENSOR_ID, caps.tSenMounting.nSenId);
   1547 
   1548     // 2) Assign mounting rotation
   1549     params->set(CameraProperties::ORIENTATION_INDEX, caps.tSenMounting.nRotation);
   1550 
   1551     LOG_FUNCTION_NAME_EXIT;
   1552 
   1553     return ret;
   1554 }
   1555 
   1556 status_t OMXCameraAdapter::insertRaw(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) {
   1557 
   1558     status_t ret = NO_ERROR;
   1559     char supported[MAX_PROP_VALUE_LENGTH];
   1560     unsigned int i = 0;
   1561 
   1562     LOG_FUNCTION_NAME;
   1563 
   1564     memset(supported, '\0', sizeof(supported));
   1565     sprintf(supported,"%d",int(caps.uSenNativeResWidth));
   1566     params->set(CameraProperties::RAW_WIDTH, supported);
   1567 
   1568     memset(supported, '\0', sizeof(supported));
   1569     if (caps.bMechanicalMisalignmentSupported) {
   1570         sprintf(supported,"%d",int(caps.uSenNativeResHeight) * 2);
   1571     } else {
   1572         sprintf(supported,"%d",int(caps.uSenNativeResHeight));
   1573     }
   1574     params->set(CameraProperties::RAW_HEIGHT, supported);
   1575 
   1576     LOG_FUNCTION_NAME_EXIT;
   1577 
   1578     return ret;
   1579 }
   1580 
   1581 status_t OMXCameraAdapter::insertFacing(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1582 {
   1583     status_t ret = NO_ERROR;
   1584     char supported[MAX_PROP_VALUE_LENGTH];
   1585     const char *p;
   1586     unsigned int i = 0;
   1587 
   1588     LOG_FUNCTION_NAME;
   1589 
   1590     memset(supported, '\0', sizeof(supported));
   1591 
   1592     for (i = 0; i < ARRAY_SIZE(mFacing); i++) {
   1593         if((OMX_TI_SENFACING_TYPE)mFacing[i].num == caps.tSenMounting.eFacing) {
   1594             break;
   1595         }
   1596     }
   1597     if ( i == ARRAY_SIZE(mFacing) ) {
   1598         p = "UNKNOWN_FACING";
   1599     } else {
   1600         p = mFacing[i].param;
   1601     }
   1602     strncat(supported, p, REMAINING_BYTES(supported));
   1603     params->set(CameraProperties::FACING_INDEX, supported);
   1604 
   1605     LOG_FUNCTION_NAME_EXIT;
   1606 
   1607     return ret;
   1608 }
   1609 
   1610 status_t OMXCameraAdapter::insertFocalLength(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1611 {
   1612     status_t ret = NO_ERROR;
   1613     char supported[MAX_PROP_VALUE_LENGTH];
   1614 
   1615     LOG_FUNCTION_NAME;
   1616 
   1617     memset(supported, '\0', sizeof(supported));
   1618 
   1619     sprintf(supported, "%d", caps.nFocalLength / 100);
   1620     strncat(supported, ".", REMAINING_BYTES(supported));
   1621     sprintf(supported+(strlen(supported)*sizeof(char)), "%d", caps.nFocalLength % 100);
   1622 
   1623     params->set(CameraProperties::FOCAL_LENGTH, supported);
   1624 
   1625     LOG_FUNCTION_NAME_EXIT
   1626 
   1627     return ret;
   1628 }
   1629 
   1630 status_t OMXCameraAdapter::insertAutoConvergenceModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1631 {
   1632     status_t ret = NO_ERROR;
   1633     char supported[MAX_PROP_VALUE_LENGTH];
   1634     const char *p;
   1635     unsigned int i = 0;
   1636 
   1637     LOG_FUNCTION_NAME;
   1638 
   1639     memset(supported, '\0', sizeof(supported));
   1640 
   1641     for ( unsigned int i = 0 ; i < caps.ulAutoConvModesCount; i++ ) {
   1642         p = getLUTvalue_OMXtoHAL(caps.eAutoConvModes[i], mAutoConvergenceLUT);
   1643         if ( NULL != p ) {
   1644             if (supported[0] != '\0') {
   1645                 strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1646             }
   1647             strncat(supported, p, REMAINING_BYTES(supported));
   1648         }
   1649     }
   1650     params->set(CameraProperties::AUTOCONVERGENCE_MODE_VALUES, supported);
   1651 
   1652     LOG_FUNCTION_NAME_EXIT;
   1653 
   1654     return ret;
   1655 }
   1656 
   1657 status_t OMXCameraAdapter::insertManualConvergenceRange(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1658 {
   1659     status_t ret = NO_ERROR;
   1660     char supported[MAX_PROP_VALUE_LENGTH];
   1661 
   1662     LOG_FUNCTION_NAME;
   1663 
   1664     snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", ( int ) ( caps.nManualConvMin ));
   1665     params->set(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN, supported);
   1666 
   1667     snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", ( int ) ( caps.nManualConvMax ));
   1668     params->set(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX, supported);
   1669 
   1670     snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", ( int ) ( caps.nManualConvMax != caps.nManualConvMin ));
   1671     params->set(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_STEP, supported);
   1672 
   1673     LOG_FUNCTION_NAME_EXIT;
   1674 
   1675     return ret;
   1676 }
   1677 
   1678 status_t OMXCameraAdapter::insertMechanicalMisalignmentCorrection(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1679 {
   1680     LOG_FUNCTION_NAME;
   1681 
   1682     params->set(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED,
   1683             caps.bMechanicalMisalignmentSupported == OMX_TRUE ?
   1684             android::CameraParameters::TRUE : android::CameraParameters::FALSE);
   1685 
   1686     return OK;
   1687 }
   1688 
   1689 status_t OMXCameraAdapter::insertCaptureModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1690 {
   1691     status_t ret = NO_ERROR;
   1692     char supported[MAX_PROP_VALUE_LENGTH];
   1693     const char *p;
   1694 
   1695     LOG_FUNCTION_NAME;
   1696 
   1697     memset(supported, '\0', sizeof(supported));
   1698 
   1699     // 3D mode detect: Misalignment is present only in 3d mode
   1700     if (caps.bMechanicalMisalignmentSupported)
   1701     {
   1702         strncat(supported, TICameraParameters::HIGH_QUALITY_MODE, REMAINING_BYTES(supported));
   1703         strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1704         strncat(supported, TICameraParameters::VIDEO_MODE, REMAINING_BYTES(supported));
   1705     }
   1706     else // 2D mode detect: Misalignment is present only in 3d mode
   1707     {
   1708         strncat(supported, TICameraParameters::HIGH_QUALITY_MODE, REMAINING_BYTES(supported));
   1709         strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1710         strncat(supported, TICameraParameters::VIDEO_MODE, REMAINING_BYTES(supported));
   1711         strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1712         strncat(supported, TICameraParameters::HIGH_PERFORMANCE_MODE, REMAINING_BYTES(supported));
   1713         strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1714         strncat(supported, TICameraParameters::HIGH_QUALITY_ZSL_MODE, REMAINING_BYTES(supported));
   1715 #ifdef OMAP_ENHANCEMENT_CPCAM
   1716         strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1717         strncat(supported, TICameraParameters::CP_CAM_MODE, REMAINING_BYTES(supported));
   1718 #endif
   1719 #ifdef  CAMERAHAL_OMAP5_CAPTURE_MODES
   1720         strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1721         strncat(supported, TICameraParameters::VIDEO_MODE_HQ, REMAINING_BYTES(supported));
   1722 #endif
   1723         strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1724         strncat(supported, TICameraParameters::ZOOM_BRACKETING, REMAINING_BYTES(supported));
   1725     }
   1726 
   1727     for ( unsigned int i = 0 ; i < caps.ulBracketingModesCount; i++ ) {
   1728         p = getLUTvalue_OMXtoHAL(caps.eBracketingModes[i], mBracketingModesLUT);
   1729         if ( NULL != p ) {
   1730             if (supported[0] != '\0') {
   1731                 strncat(supported, PARAM_SEP, REMAINING_BYTES(supported));
   1732             }
   1733             strncat(supported, p, REMAINING_BYTES(supported));
   1734         }
   1735     }
   1736 
   1737     params->set(CameraProperties::CAP_MODE_VALUES, supported);
   1738 
   1739     LOG_FUNCTION_NAME_EXIT;
   1740 
   1741     return ret;
   1742 }
   1743 
   1744 status_t OMXCameraAdapter::insertLayout(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1745 {
   1746     status_t ret = NO_ERROR;
   1747     char supported[MAX_PROP_VALUE_LENGTH];
   1748     const char *p;
   1749     unsigned int i = 0;
   1750 
   1751     LOG_FUNCTION_NAME;
   1752 
   1753     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1754     for ( unsigned int i = 0 ; i < caps.ulPrvFrameLayoutCount; i++ ) {
   1755         p = getLUTvalue_OMXtoHAL(caps.ePrvFrameLayout[i], mLayoutLUT);
   1756         if ( NULL != p ) {
   1757             if (supported[0] != '\0') {
   1758                 strncat(supported, PARAM_SEP, 1);
   1759             }
   1760             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1761         }
   1762     }
   1763     params->set(CameraProperties::S3D_PRV_FRAME_LAYOUT_VALUES, supported);
   1764 
   1765     memset(supported, '\0', MAX_PROP_VALUE_LENGTH);
   1766     for ( unsigned int i = 0 ; i < caps.ulCapFrameLayoutCount; i++ ) {
   1767         p = getLUTvalue_OMXtoHAL(caps.eCapFrameLayout[i], mLayoutLUT);
   1768         if ( NULL != p ) {
   1769             if (supported[0] != '\0') {
   1770                 strncat(supported, PARAM_SEP, 1);
   1771             }
   1772             strncat(supported, p, MAX_PROP_NAME_LENGTH);
   1773         }
   1774     }
   1775     params->set(CameraProperties::S3D_CAP_FRAME_LAYOUT_VALUES, supported);
   1776 
   1777     LOG_FUNCTION_NAME_EXIT;
   1778 
   1779     return ret;
   1780 }
   1781 
   1782 status_t OMXCameraAdapter::insertVideoSnapshotSupported(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1783 {
   1784     status_t ret = NO_ERROR;
   1785 
   1786     LOG_FUNCTION_NAME;
   1787 
   1788     if (caps.bStillCapDuringVideoSupported)
   1789     {
   1790         params->set(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED, android::CameraParameters::TRUE);
   1791     }
   1792     else
   1793     {
   1794         params->set(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED, android::CameraParameters::FALSE);
   1795     }
   1796 
   1797     LOG_FUNCTION_NAME_EXIT;
   1798 
   1799     return ret;
   1800 }
   1801 
   1802 status_t OMXCameraAdapter::insertGBCESupported(CameraProperties::Properties* params,
   1803                                                const OMX_TI_CAPTYPE &caps)
   1804 {
   1805     status_t ret = NO_ERROR;
   1806 
   1807     LOG_FUNCTION_NAME;
   1808 
   1809     if (caps.bGbceSupported) {
   1810         params->set(CameraProperties::SUPPORTED_GBCE,
   1811                     android::CameraParameters::TRUE);
   1812     } else {
   1813         params->set(CameraProperties::SUPPORTED_GBCE,
   1814                     android::CameraParameters::FALSE);
   1815     }
   1816 
   1817     LOG_FUNCTION_NAME_EXIT;
   1818 
   1819     return ret;
   1820 }
   1821 
   1822 status_t OMXCameraAdapter::insertGLBCESupported(CameraProperties::Properties* params,
   1823                                                 const OMX_TI_CAPTYPE &caps)
   1824 {
   1825     status_t ret = NO_ERROR;
   1826 
   1827     LOG_FUNCTION_NAME;
   1828 
   1829     if (caps.bGlbceSupported) {
   1830         params->set(CameraProperties::SUPPORTED_GLBCE,
   1831                     android::CameraParameters::TRUE);
   1832     } else {
   1833         params->set(CameraProperties::SUPPORTED_GLBCE,
   1834                     android::CameraParameters::FALSE);
   1835     }
   1836 
   1837     LOG_FUNCTION_NAME_EXIT;
   1838 
   1839     return ret;
   1840 }
   1841 
   1842 status_t OMXCameraAdapter::insertDefaults(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   1843 {
   1844     status_t ret = NO_ERROR;
   1845     char *pos, *str, *def;
   1846     char temp[MAX_PROP_VALUE_LENGTH];
   1847 
   1848     LOG_FUNCTION_NAME;
   1849 
   1850     /* If default is supported - set it, else - set first supported */
   1851     if (strstr(params->get(CameraProperties::S3D_PRV_FRAME_LAYOUT_VALUES), DEFAULT_S3D_PREVIEW_LAYOUT)) {
   1852         strncpy(temp, DEFAULT_S3D_PREVIEW_LAYOUT, MAX_PROP_VALUE_LENGTH - 1);
   1853     } else {
   1854         strncpy(temp, params->get(CameraProperties::S3D_PRV_FRAME_LAYOUT_VALUES),
   1855                     MAX_PROP_VALUE_LENGTH - 1);
   1856         if ((pos = strstr(temp, PARAM_SEP))) {
   1857             *pos = '\0';
   1858         }
   1859     }
   1860     params->set(CameraProperties::S3D_PRV_FRAME_LAYOUT, temp);
   1861 
   1862     if (!strcmp(TICameraParameters::S3D_TB_FULL, temp)) {
   1863         params->set(CameraProperties::SUPPORTED_PREVIEW_SIZES, params->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
   1864     } else if (!strcmp(TICameraParameters::S3D_SS_FULL, temp)) {
   1865         params->set(CameraProperties::SUPPORTED_PREVIEW_SIZES, params->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
   1866     } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, temp))
   1867               || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, temp))) {
   1868         params->set(CameraProperties::SUPPORTED_PREVIEW_SIZES, params->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
   1869     }
   1870 
   1871     /* If default is supported - set it, else - set first supported */
   1872     if (strstr(params->get(CameraProperties::S3D_CAP_FRAME_LAYOUT_VALUES), DEFAULT_S3D_PICTURE_LAYOUT)) {
   1873         strncpy(temp, DEFAULT_S3D_PICTURE_LAYOUT, MAX_PROP_VALUE_LENGTH - 1);
   1874     } else {
   1875         strncpy(temp, params->get(CameraProperties::S3D_CAP_FRAME_LAYOUT_VALUES),
   1876                     MAX_PROP_VALUE_LENGTH - 1);
   1877         if ((pos = strstr(temp, PARAM_SEP))) {
   1878             *pos = '\0';
   1879         }
   1880     }
   1881     params->set(CameraProperties::S3D_CAP_FRAME_LAYOUT, temp);
   1882 
   1883     if (!strcmp(TICameraParameters::S3D_TB_FULL, temp)) {
   1884         params->set(CameraProperties::SUPPORTED_PICTURE_SIZES, params->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
   1885     } else if (!strcmp(TICameraParameters::S3D_SS_FULL, temp)) {
   1886         params->set(CameraProperties::SUPPORTED_PICTURE_SIZES, params->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
   1887     } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, temp))
   1888               || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, temp))) {
   1889         params->set(CameraProperties::SUPPORTED_PICTURE_SIZES, params->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES));
   1890     }
   1891 
   1892     params->set(CameraProperties::ANTIBANDING, DEFAULT_ANTIBANDING);
   1893     params->set(CameraProperties::BRIGHTNESS, DEFAULT_BRIGHTNESS);
   1894     params->set(CameraProperties::CONTRAST, DEFAULT_CONTRAST);
   1895     params->set(CameraProperties::EFFECT, DEFAULT_EFFECT);
   1896     params->set(CameraProperties::EV_COMPENSATION, DEFAULT_EV_COMPENSATION);
   1897     params->set(CameraProperties::SUPPORTED_EV_STEP, DEFAULT_EV_STEP);
   1898     params->set(CameraProperties::EXPOSURE_MODE, DEFAULT_EXPOSURE_MODE);
   1899     params->set(CameraProperties::FLASH_MODE, DEFAULT_FLASH_MODE);
   1900     pos = strstr(params->get(CameraProperties::SUPPORTED_FOCUS_MODES), DEFAULT_FOCUS_MODE_PREFERRED);
   1901     if ( NULL != pos )
   1902         {
   1903         params->set(CameraProperties::FOCUS_MODE, DEFAULT_FOCUS_MODE_PREFERRED);
   1904         }
   1905     else
   1906         {
   1907         params->set(CameraProperties::FOCUS_MODE, DEFAULT_FOCUS_MODE);
   1908         }
   1909     params->set(CameraProperties::IPP, DEFAULT_IPP);
   1910     params->set(CameraProperties::GBCE, android::CameraParameters::FALSE);
   1911     params->set(CameraProperties::GLBCE, android::CameraParameters::FALSE);
   1912     params->set(CameraProperties::ISO_MODE, DEFAULT_ISO_MODE);
   1913     params->set(CameraProperties::JPEG_QUALITY, DEFAULT_JPEG_QUALITY);
   1914     params->set(CameraProperties::JPEG_THUMBNAIL_QUALITY, DEFAULT_THUMBNAIL_QUALITY);
   1915     params->set(CameraProperties::JPEG_THUMBNAIL_SIZE, DEFAULT_THUMBNAIL_SIZE);
   1916     params->set(CameraProperties::PICTURE_FORMAT, DEFAULT_PICTURE_FORMAT);
   1917 
   1918     if (!strcmp(params->get(CameraProperties::S3D_CAP_FRAME_LAYOUT),
   1919                 TICameraParameters::S3D_TB_FULL)) {
   1920         params->set(CameraProperties::PICTURE_SIZE, DEFAULT_PICTURE_TB_SIZE);
   1921     } else if (!strcmp(params->get(CameraProperties::S3D_CAP_FRAME_LAYOUT),
   1922                 TICameraParameters::S3D_SS_FULL)) {
   1923         params->set(CameraProperties::PICTURE_SIZE, DEFAULT_PICTURE_SS_SIZE);
   1924     } else {
   1925         params->set(CameraProperties::PICTURE_SIZE, DEFAULT_PICTURE_SIZE);
   1926     }
   1927 
   1928     if (!strcmp(params->get(CameraProperties::S3D_PRV_FRAME_LAYOUT),
   1929                 TICameraParameters::S3D_TB_FULL)) {
   1930         params->set(CameraProperties::PREVIEW_SIZE, DEFAULT_PREVIEW_TB_SIZE);
   1931     } else if (!strcmp(params->get(CameraProperties::S3D_PRV_FRAME_LAYOUT),
   1932                 TICameraParameters::S3D_SS_FULL)) {
   1933         params->set(CameraProperties::PREVIEW_SIZE, DEFAULT_PREVIEW_SS_SIZE);
   1934     } else {
   1935         params->set(CameraProperties::PREVIEW_SIZE, DEFAULT_PREVIEW_SIZE);
   1936     }
   1937 
   1938     params->set(CameraProperties::PREVIEW_FORMAT, DEFAULT_PREVIEW_FORMAT);
   1939 
   1940     /* Set default value if supported, otherwise set max supported value */
   1941     strncpy(temp, params->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES),
   1942             MAX_PROP_VALUE_LENGTH - 1);
   1943     def = str = temp;
   1944     while (1) {
   1945         if ((pos = strstr(str, PARAM_SEP))) {
   1946             *pos = '\0';
   1947         }
   1948         if (!strcmp(str, DEFAULT_FRAMERATE)) {
   1949             def = str;
   1950             break;
   1951         }
   1952         if (atoi(str) > atoi(def)) {
   1953             def = str;
   1954         }
   1955         if (pos == NULL) {
   1956             break;
   1957         }
   1958         str = pos + strlen(PARAM_SEP);
   1959     }
   1960     params->set(CameraProperties::PREVIEW_FRAME_RATE, def);
   1961 
   1962     params->set(CameraProperties::REQUIRED_PREVIEW_BUFS, DEFAULT_NUM_PREV_BUFS);
   1963     params->set(CameraProperties::REQUIRED_IMAGE_BUFS, DEFAULT_NUM_PIC_BUFS);
   1964     params->set(CameraProperties::SATURATION, DEFAULT_SATURATION);
   1965     params->set(CameraProperties::SCENE_MODE, DEFAULT_SCENE_MODE);
   1966     params->set(CameraProperties::SHARPNESS, DEFAULT_SHARPNESS);
   1967     params->set(CameraProperties::VSTAB, DEFAULT_VSTAB);
   1968     params->set(CameraProperties::VNF, DEFAULT_VNF);
   1969     params->set(CameraProperties::WHITEBALANCE, DEFAULT_WB);
   1970     params->set(CameraProperties::ZOOM, DEFAULT_ZOOM);
   1971     params->set(CameraProperties::MAX_FD_HW_FACES, DEFAULT_MAX_FD_HW_FACES);
   1972     params->set(CameraProperties::MAX_FD_SW_FACES, DEFAULT_MAX_FD_SW_FACES);
   1973     params->set(CameraProperties::AUTO_EXPOSURE_LOCK, DEFAULT_AE_LOCK);
   1974     params->set(CameraProperties::AUTO_WHITEBALANCE_LOCK, DEFAULT_AWB_LOCK);
   1975     params->set(CameraProperties::HOR_ANGLE, DEFAULT_HOR_ANGLE);
   1976     params->set(CameraProperties::VER_ANGLE, DEFAULT_VER_ANGLE);
   1977     params->set(CameraProperties::VIDEO_SIZE, DEFAULT_VIDEO_SIZE);
   1978     params->set(CameraProperties::SENSOR_ORIENTATION, DEFAULT_SENSOR_ORIENTATION);
   1979     params->set(CameraProperties::AUTOCONVERGENCE_MODE, DEFAULT_AUTOCONVERGENCE_MODE);
   1980     params->set(CameraProperties::MANUAL_CONVERGENCE, DEFAULT_MANUAL_CONVERGENCE);
   1981     params->set(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION, DEFAULT_MECHANICAL_MISALIGNMENT_CORRECTION_MODE);
   1982 
   1983     char property[PROPERTY_VALUE_MAX];
   1984     property_get("ro.product.manufacturer",
   1985                  property,
   1986                  DEFAULT_EXIF_MAKE);
   1987     property[0] = toupper(property[0]);
   1988     params->set(CameraProperties::EXIF_MAKE, property);
   1989     property_get("ro.product.model",
   1990                  property,
   1991                  DEFAULT_EXIF_MODEL);
   1992     property[0] = toupper(property[0]);
   1993     params->set(CameraProperties::EXIF_MODEL, property);
   1994 
   1995     LOG_FUNCTION_NAME_EXIT;
   1996 
   1997     return ret;
   1998 }
   1999 
   2000 status_t OMXCameraAdapter::insertCapabilities(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps)
   2001 {
   2002     status_t ret = NO_ERROR;
   2003 
   2004     LOG_FUNCTION_NAME;
   2005 
   2006     if ( NO_ERROR == ret ) {
   2007         ret = insertImageSizes(params, caps);
   2008     }
   2009 
   2010     if ( NO_ERROR == ret ) {
   2011         ret = insertPreviewSizes(params, caps);
   2012     }
   2013 
   2014     if ( NO_ERROR == ret ) {
   2015         ret = insertThumbSizes(params, caps);
   2016     }
   2017 
   2018     if ( NO_ERROR == ret ) {
   2019         ret = insertZoomStages(params, caps);
   2020     }
   2021 
   2022     if ( NO_ERROR == ret ) {
   2023         ret = insertImageFormats(params, caps);
   2024     }
   2025 
   2026     if ( NO_ERROR == ret ) {
   2027         ret = insertPreviewFormats(params, caps);
   2028     }
   2029 
   2030     if ( NO_ERROR == ret ) {
   2031         ret = insertFramerates(params, caps);
   2032     }
   2033 
   2034     if ( NO_ERROR == ret ) {
   2035         ret = insertEVs(params, caps);
   2036     }
   2037 
   2038     if ( NO_ERROR == ret ) {
   2039         ret = insertISOModes(params, caps);
   2040     }
   2041 
   2042     if ( NO_ERROR == ret ) {
   2043         ret = insertIPPModes(params, caps);
   2044     }
   2045 
   2046     if ( NO_ERROR == ret ) {
   2047         ret = insertWBModes(params, caps);
   2048     }
   2049 
   2050     if ( NO_ERROR == ret ) {
   2051         ret = insertEffects(params, caps);
   2052     }
   2053 
   2054     if ( NO_ERROR == ret ) {
   2055         ret = insertExpModes(params, caps);
   2056     }
   2057 
   2058     if ( NO_ERROR == ret ) {
   2059         ret = insertManualExpRanges(params, caps);
   2060     }
   2061 
   2062     if ( NO_ERROR == ret ) {
   2063         ret = insertFlashModes(params, caps);
   2064     }
   2065 
   2066     if ( NO_ERROR == ret ) {
   2067         ret = insertSceneModes(params, caps);
   2068     }
   2069 
   2070     if ( NO_ERROR == ret ) {
   2071         ret = insertFocusModes(params, caps);
   2072     }
   2073 
   2074     if ( NO_ERROR == ret ) {
   2075         ret = insertFlickerModes(params, caps);
   2076     }
   2077 
   2078     if ( NO_ERROR == ret ) {
   2079         ret = insertSenMount(params, caps);
   2080     }
   2081 
   2082     if ( NO_ERROR == ret ) {
   2083         ret = insertLocks(params, caps);
   2084     }
   2085 
   2086     if ( NO_ERROR == ret) {
   2087         ret = insertAreas(params, caps);
   2088     }
   2089 
   2090     if ( NO_ERROR == ret) {
   2091         ret = insertFacing(params, caps);
   2092     }
   2093 
   2094     if ( NO_ERROR == ret) {
   2095         ret = insertFocalLength(params, caps);
   2096     }
   2097 
   2098     if ( NO_ERROR == ret) {
   2099         ret = insertAutoConvergenceModes(params, caps);
   2100     }
   2101 
   2102     if ( NO_ERROR == ret) {
   2103         ret = insertManualConvergenceRange(params, caps);
   2104     }
   2105 
   2106     if ( NO_ERROR == ret) {
   2107         ret = insertMechanicalMisalignmentCorrection(params, caps);
   2108     }
   2109 
   2110     if ( NO_ERROR == ret) {
   2111         ret = insertRaw(params, caps);
   2112     }
   2113 
   2114     if ( NO_ERROR == ret) {
   2115         ret = insertCaptureModes(params, caps);
   2116     }
   2117 
   2118     if ( NO_ERROR == ret) {
   2119         ret = insertLayout(params, caps);
   2120     }
   2121 
   2122     if ( NO_ERROR == ret) {
   2123         ret = insertVideoSnapshotSupported(params, caps);
   2124     }
   2125 
   2126     if ( NO_ERROR == ret ) {
   2127         ret = insertVSTABSupported(params, caps);
   2128     }
   2129 
   2130     if ( NO_ERROR == ret) {
   2131         ret = insertVNFSupported(params, caps);
   2132     }
   2133 
   2134     //NOTE: Ensure that we always call insertDefaults after inserting the supported capabilities
   2135     //as there are checks inside insertDefaults to make sure a certain default is supported
   2136     // or not
   2137     if ( NO_ERROR == ret ) {
   2138         ret = insertVideoSizes(params, caps);
   2139     }
   2140 
   2141     if ( NO_ERROR == ret) {
   2142         ret = insertGBCESupported(params, caps);
   2143     }
   2144 
   2145     if ( NO_ERROR == ret) {
   2146         ret = insertGLBCESupported(params, caps);
   2147     }
   2148 
   2149     if ( NO_ERROR == ret ) {
   2150         ret = insertDefaults(params, caps);
   2151     }
   2152 
   2153     LOG_FUNCTION_NAME_EXIT;
   2154 
   2155     return ret;
   2156 }
   2157 
   2158 
   2159 bool OMXCameraAdapter::_checkOmxTiCap(const OMX_TI_CAPTYPE & caps)
   2160 {
   2161 #define CAMHAL_CHECK_OMX_TI_CAP(countVar, arrayVar)              \
   2162     do {                                                         \
   2163         const int count = static_cast<int>(caps.countVar);  \
   2164         const int maxSize = CAMHAL_SIZE_OF_ARRAY(caps.arrayVar); \
   2165         if ( count < 0 || count > maxSize )                      \
   2166         {                                                        \
   2167             CAMHAL_LOGE("OMX_TI_CAPTYPE verification failed");   \
   2168             CAMHAL_LOGE("  variable: OMX_TI_CAPTYPE::" #countVar \
   2169                     ", value: %d, max allowed: %d",              \
   2170                     count, maxSize);                             \
   2171             return false;                                        \
   2172         }                                                        \
   2173     } while (0)
   2174 
   2175     CAMHAL_CHECK_OMX_TI_CAP(ulPreviewFormatCount, ePreviewFormats);
   2176     CAMHAL_CHECK_OMX_TI_CAP(ulImageFormatCount, eImageFormats);
   2177     CAMHAL_CHECK_OMX_TI_CAP(ulWhiteBalanceCount, eWhiteBalanceModes);
   2178     CAMHAL_CHECK_OMX_TI_CAP(ulColorEffectCount, eColorEffects);
   2179     CAMHAL_CHECK_OMX_TI_CAP(ulFlickerCount, eFlicker);
   2180     CAMHAL_CHECK_OMX_TI_CAP(ulExposureModeCount, eExposureModes);
   2181     CAMHAL_CHECK_OMX_TI_CAP(ulFocusModeCount, eFocusModes);
   2182     CAMHAL_CHECK_OMX_TI_CAP(ulSceneCount, eSceneModes);
   2183     CAMHAL_CHECK_OMX_TI_CAP(ulFlashCount, eFlashModes);
   2184     CAMHAL_CHECK_OMX_TI_CAP(ulPrvVarFPSModesCount, tPrvVarFPSModes);
   2185     CAMHAL_CHECK_OMX_TI_CAP(ulCapVarFPSModesCount, tCapVarFPSModes);
   2186     CAMHAL_CHECK_OMX_TI_CAP(ulAutoConvModesCount, eAutoConvModes);
   2187     CAMHAL_CHECK_OMX_TI_CAP(ulBracketingModesCount, eBracketingModes);
   2188     CAMHAL_CHECK_OMX_TI_CAP(ulImageCodingFormatCount, eImageCodingFormat);
   2189     CAMHAL_CHECK_OMX_TI_CAP(ulPrvFrameLayoutCount, ePrvFrameLayout);
   2190     CAMHAL_CHECK_OMX_TI_CAP(ulCapFrameLayoutCount, eCapFrameLayout);
   2191 
   2192 #undef CAMHAL_CHECK_OMX_TI_CAP
   2193 
   2194     return true;
   2195 }
   2196 
   2197 
   2198 bool OMXCameraAdapter::_dumpOmxTiCap(const int sensorId, const OMX_TI_CAPTYPE & caps)
   2199 {
   2200     if ( !_checkOmxTiCap(caps) )
   2201     {
   2202         CAMHAL_LOGE("OMX_TI_CAPTYPE structure is invalid");
   2203         return false;
   2204     }
   2205 
   2206     CAMHAL_LOGD("===================================================");
   2207     CAMHAL_LOGD("---- Dumping OMX capabilities for sensor id: %d ----", sensorId);
   2208 
   2209     CAMHAL_LOGD("");
   2210     CAMHAL_LOGD("ulPreviewFormatCount = %d", int(caps.ulPreviewFormatCount));
   2211     for ( int i = 0; i < int(caps.ulPreviewFormatCount); ++i )
   2212         CAMHAL_LOGD("  ePreviewFormats[%2d] = %d", i, int(caps.ePreviewFormats[i]));
   2213 
   2214     CAMHAL_LOGD("");
   2215     CAMHAL_LOGD("ulImageFormatCount = %d", int(caps.ulImageFormatCount));
   2216     for ( int i = 0; i < int(caps.ulImageFormatCount); ++i )
   2217         CAMHAL_LOGD("  eImageFormats[%2d] = %d", i, int(caps.eImageFormats[i]));
   2218 
   2219     CAMHAL_LOGD("");
   2220     CAMHAL_LOGD("tPreviewResRange.nWidthMin  = %d", int(caps.tPreviewResRange.nWidthMin));
   2221     CAMHAL_LOGD("tPreviewResRange.nHeightMin = %d", int(caps.tPreviewResRange.nHeightMin));
   2222     CAMHAL_LOGD("tPreviewResRange.nWidthMax  = %d", int(caps.tPreviewResRange.nWidthMax));
   2223     CAMHAL_LOGD("tPreviewResRange.nHeightMax = %d", int(caps.tPreviewResRange.nHeightMax));
   2224     CAMHAL_LOGD("tPreviewResRange.nMaxResInPixels = %d", int(caps.tPreviewResRange.nMaxResInPixels));
   2225 
   2226     CAMHAL_LOGD("");
   2227     CAMHAL_LOGD("tRotatedPreviewResRange.nWidthMin  = %d", int(caps.tRotatedPreviewResRange.nWidthMin));
   2228     CAMHAL_LOGD("tRotatedPreviewResRange.nHeightMin = %d", int(caps.tRotatedPreviewResRange.nHeightMin));
   2229     CAMHAL_LOGD("tRotatedPreviewResRange.nWidthMax  = %d", int(caps.tRotatedPreviewResRange.nWidthMax));
   2230     CAMHAL_LOGD("tRotatedPreviewResRange.nHeightMax = %d", int(caps.tRotatedPreviewResRange.nHeightMax));
   2231     CAMHAL_LOGD("tRotatedPreviewResRange.nMaxResInPixels = %d", int(caps.tRotatedPreviewResRange.nMaxResInPixels));
   2232 
   2233     CAMHAL_LOGD("");
   2234     CAMHAL_LOGD("tImageResRange.nWidthMin  = %d", int(caps.tImageResRange.nWidthMin));
   2235     CAMHAL_LOGD("tImageResRange.nHeightMin = %d", int(caps.tImageResRange.nHeightMin));
   2236     CAMHAL_LOGD("tImageResRange.nWidthMax  = %d", int(caps.tImageResRange.nWidthMax));
   2237     CAMHAL_LOGD("tImageResRange.nHeightMax = %d", int(caps.tImageResRange.nHeightMax));
   2238     CAMHAL_LOGD("tImageResRange.nMaxResInPixels = %d", int(caps.tImageResRange.nMaxResInPixels));
   2239 
   2240     CAMHAL_LOGD("");
   2241     CAMHAL_LOGD("tThumbResRange.nWidthMin  = %d", int(caps.tThumbResRange.nWidthMin));
   2242     CAMHAL_LOGD("tThumbResRange.nHeightMin = %d", int(caps.tThumbResRange.nHeightMin));
   2243     CAMHAL_LOGD("tThumbResRange.nWidthMax  = %d", int(caps.tThumbResRange.nWidthMax));
   2244     CAMHAL_LOGD("tThumbResRange.nHeightMax = %d", int(caps.tThumbResRange.nHeightMax));
   2245     CAMHAL_LOGD("tThumbResRange.nMaxResInPixels = %d", int(caps.tThumbResRange.nMaxResInPixels));
   2246 
   2247     CAMHAL_LOGD("");
   2248     CAMHAL_LOGD("ulWhiteBalanceCount = %d", int(caps.ulWhiteBalanceCount));
   2249     for ( int i = 0; i < int(caps.ulWhiteBalanceCount); ++i )
   2250         CAMHAL_LOGD("  eWhiteBalanceModes[%2d] = 0x%08x", i, int(caps.eWhiteBalanceModes[i]));
   2251 
   2252     CAMHAL_LOGD("");
   2253     CAMHAL_LOGD("ulColorEffectCount = %d", int(caps.ulColorEffectCount));
   2254     for ( int i = 0; i < int(caps.ulColorEffectCount); ++i )
   2255         CAMHAL_LOGD("  eColorEffects[%2d] = 0x%08x", i, int(caps.eColorEffects[i]));
   2256 
   2257     CAMHAL_LOGD("");
   2258     CAMHAL_LOGD("xMaxWidthZoom  = %d", int(caps.xMaxWidthZoom));
   2259     CAMHAL_LOGD("xMaxHeightZoom = %d", int(caps.xMaxHeightZoom));
   2260 
   2261     CAMHAL_LOGD("");
   2262     CAMHAL_LOGD("ulFlickerCount = %d", int(caps.ulFlickerCount));
   2263     for ( int i = 0; i < int(caps.ulFlickerCount); ++i )
   2264         CAMHAL_LOGD("  eFlicker[%2d] = %d", i, int(caps.eFlicker[i]));
   2265 
   2266     CAMHAL_LOGD("");
   2267     CAMHAL_LOGD("ulExposureModeCount = %d", int(caps.ulExposureModeCount));
   2268     for ( int i = 0; i < int(caps.ulExposureModeCount); ++i )
   2269         CAMHAL_LOGD("  eExposureModes[%2d] = 0x%08x", i, int(caps.eExposureModes[i]));
   2270 
   2271     CAMHAL_LOGD("");
   2272     CAMHAL_LOGD("bLensDistortionCorrectionSupported = %d", int(caps.bLensDistortionCorrectionSupported));
   2273     CAMHAL_LOGD("bISONoiseFilterSupported = %d", int(caps.bISONoiseFilterSupported));
   2274     CAMHAL_LOGD("xEVCompensationMin = %d", int(caps.xEVCompensationMin));
   2275     CAMHAL_LOGD("xEVCompensationMax = %d", int(caps.xEVCompensationMax));
   2276     CAMHAL_LOGD("nSensitivityMax = %d", int(caps.nSensitivityMax));
   2277 
   2278     CAMHAL_LOGD("");
   2279     CAMHAL_LOGD("ulFocusModeCount = %d", int(caps.ulFocusModeCount));
   2280     for ( int i = 0; i < int(caps.ulFocusModeCount); ++i )
   2281         CAMHAL_LOGD("  eFocusModes[%2d] = 0x%08x", i, int(caps.eFocusModes[i]));
   2282 
   2283     CAMHAL_LOGD("");
   2284     CAMHAL_LOGD("ulSceneCount = %d", int(caps.ulSceneCount));
   2285     for ( int i = 0; i < int(caps.ulSceneCount); ++i )
   2286         CAMHAL_LOGD("  eSceneModes[%2d] = %d", i, int(caps.eSceneModes[i]));
   2287 
   2288     CAMHAL_LOGD("");
   2289     CAMHAL_LOGD("ulFlashCount = %d", int(caps.ulFlashCount));
   2290     for ( int i = 0; i < int(caps.ulFlashCount); ++i )
   2291         CAMHAL_LOGD("  eFlashModes[%2d] = %d", i, int(caps.eFlashModes[i]));
   2292 
   2293     CAMHAL_LOGD("xFramerateMin = %d", int(caps.xFramerateMin));
   2294     CAMHAL_LOGD("xFramerateMax = %d", int(caps.xFramerateMax));
   2295     CAMHAL_LOGD("bContrastSupported = %d", int(caps.bContrastSupported));
   2296     CAMHAL_LOGD("bSaturationSupported = %d", int(caps.bSaturationSupported));
   2297     CAMHAL_LOGD("bBrightnessSupported = %d", int(caps.bBrightnessSupported));
   2298     CAMHAL_LOGD("bProcessingLevelSupported = %d", int(caps.bProcessingLevelSupported));
   2299     CAMHAL_LOGD("bQFactorSupported = %d", int(caps.bQFactorSupported));
   2300 
   2301     CAMHAL_LOGD("");
   2302     CAMHAL_LOGD("ulPrvVarFPSModesCount = %d", int(caps.ulPrvVarFPSModesCount));
   2303     for ( int i = 0; i < int(caps.ulPrvVarFPSModesCount); ++i )
   2304     {
   2305         CAMHAL_LOGD("  tPrvVarFPSModes[%d].nVarFPSMin = %d", i, int(caps.tPrvVarFPSModes[i].nVarFPSMin));
   2306         CAMHAL_LOGD("  tPrvVarFPSModes[%d].nVarFPSMax = %d", i, int(caps.tPrvVarFPSModes[i].nVarFPSMax));
   2307     }
   2308 
   2309     CAMHAL_LOGD("");
   2310     CAMHAL_LOGD("ulCapVarFPSModesCount = %d", int(caps.ulCapVarFPSModesCount));
   2311     for ( int i = 0; i < int(caps.ulCapVarFPSModesCount); ++i )
   2312     {
   2313         CAMHAL_LOGD("  tCapVarFPSModes[%d].nVarFPSMin = %d", i, int(caps.tCapVarFPSModes[i].nVarFPSMin));
   2314         CAMHAL_LOGD("  tCapVarFPSModes[%d].nVarFPSMax = %d", i, int(caps.tCapVarFPSModes[i].nVarFPSMax));
   2315     }
   2316 
   2317     CAMHAL_LOGD("");
   2318     CAMHAL_LOGD("tSenMounting.nSenId    = %d", int(caps.tSenMounting.nSenId));
   2319     CAMHAL_LOGD("tSenMounting.nRotation = %d", int(caps.tSenMounting.nRotation));
   2320     CAMHAL_LOGD("tSenMounting.bMirror   = %d", int(caps.tSenMounting.bMirror));
   2321     CAMHAL_LOGD("tSenMounting.bFlip     = %d", int(caps.tSenMounting.bFlip));
   2322     CAMHAL_LOGD("tSenMounting.eFacing   = %d", int(caps.tSenMounting.eFacing));
   2323 
   2324     CAMHAL_LOGD("");
   2325     CAMHAL_LOGD("ulAutoConvModesCount = %d", int(caps.ulAutoConvModesCount));
   2326     for ( int i = 0; i < int(caps.ulAutoConvModesCount); ++i )
   2327         CAMHAL_LOGD("  eAutoConvModes[%2d] = %d", i, int(caps.eAutoConvModes[i]));
   2328 
   2329     CAMHAL_LOGD("");
   2330     CAMHAL_LOGD("ulBracketingModesCount = %d", int(caps.ulBracketingModesCount));
   2331     for ( int i = 0; i < int(caps.ulBracketingModesCount); ++i )
   2332         CAMHAL_LOGD("  eBracketingModes[%2d] = %d", i, int(caps.eBracketingModes[i]));
   2333 
   2334     CAMHAL_LOGD("");
   2335     CAMHAL_LOGD("bGbceSupported    = %d", int(caps.bGbceSupported));
   2336     CAMHAL_LOGD("bRawJpegSupported = %d", int(caps.bRawJpegSupported));
   2337 
   2338     CAMHAL_LOGD("");
   2339     CAMHAL_LOGD("ulImageCodingFormatCount = %d", int(caps.ulImageCodingFormatCount));
   2340     for ( int i = 0; i < int(caps.ulImageCodingFormatCount); ++i )
   2341         CAMHAL_LOGD("  eImageCodingFormat[%2d] = %d", i, int(caps.eImageCodingFormat[i]));
   2342 
   2343     CAMHAL_LOGD("");
   2344     CAMHAL_LOGD("uSenNativeResWidth       = %d", int(caps.uSenNativeResWidth));
   2345     CAMHAL_LOGD("uSenNativeResHeight      = %d", int(caps.uSenNativeResHeight));
   2346     CAMHAL_LOGD("ulAlgoAreasFocusCount    = %d", int(caps.ulAlgoAreasFocusCount));
   2347     CAMHAL_LOGD("ulAlgoAreasExposureCount = %d", int(caps.ulAlgoAreasExposureCount));
   2348     CAMHAL_LOGD("bAELockSupported         = %d", int(caps.bAELockSupported));
   2349     CAMHAL_LOGD("bAWBLockSupported        = %d", int(caps.bAWBLockSupported));
   2350     CAMHAL_LOGD("bAFLockSupported         = %d", int(caps.bAFLockSupported));
   2351     CAMHAL_LOGD("nFocalLength             = %d", int(caps.nFocalLength));
   2352 
   2353     CAMHAL_LOGD("");
   2354     CAMHAL_LOGD("ulPrvFrameLayoutCount = %d", int(caps.ulPrvFrameLayoutCount));
   2355     for ( int i = 0; i < int(caps.ulPrvFrameLayoutCount); ++i )
   2356         CAMHAL_LOGD("  ePrvFrameLayout[%2d] = %d", i, int(caps.ePrvFrameLayout[i]));
   2357 
   2358     CAMHAL_LOGD("");
   2359     CAMHAL_LOGD("ulCapFrameLayoutCount = %d", int(caps.ulCapFrameLayoutCount));
   2360     for ( int i = 0; i < int(caps.ulCapFrameLayoutCount); ++i )
   2361         CAMHAL_LOGD("  eCapFrameLayout[%2d] = %d", i, int(caps.eCapFrameLayout[i]));
   2362 
   2363     CAMHAL_LOGD("");
   2364     CAMHAL_LOGD("bVideoNoiseFilterSupported         = %d", int(caps.bVideoNoiseFilterSupported      ));
   2365     CAMHAL_LOGD("bVideoStabilizationSupported       = %d", int(caps.bVideoStabilizationSupported    ));
   2366     CAMHAL_LOGD("bStillCapDuringVideoSupported      = %d", int(caps.bStillCapDuringVideoSupported   ));
   2367     CAMHAL_LOGD("bMechanicalMisalignmentSupported   = %d", int(caps.bMechanicalMisalignmentSupported));
   2368     CAMHAL_LOGD("bFacePrioritySupported             = %d", int(caps.bFacePrioritySupported          ));
   2369     CAMHAL_LOGD("bRegionPrioritySupported           = %d", int(caps.bRegionPrioritySupported        ));
   2370     CAMHAL_LOGD("bGlbceSupported                    = %d", int(caps.bGlbceSupported));
   2371 
   2372     CAMHAL_LOGD("");
   2373     CAMHAL_LOGD("nManualConvMin     = %d", int(caps.nManualConvMin     ));
   2374     CAMHAL_LOGD("nManualConvMax     = %d", int(caps.nManualConvMax     ));
   2375     CAMHAL_LOGD("nManualExpMin      = %d", int(caps.nManualExpMin      ));
   2376     CAMHAL_LOGD("nManualExpMax      = %d", int(caps.nManualExpMax      ));
   2377     CAMHAL_LOGD("nBrightnessMin     = %d", int(caps.nBrightnessMin     ));
   2378     CAMHAL_LOGD("nBrightnessMax     = %d", int(caps.nBrightnessMax     ));
   2379     CAMHAL_LOGD("nContrastMin       = %d", int(caps.nContrastMin       ));
   2380     CAMHAL_LOGD("nContrastMax       = %d", int(caps.nContrastMax       ));
   2381     CAMHAL_LOGD("nSharpnessMin      = %d", int(caps.nSharpnessMin      ));
   2382     CAMHAL_LOGD("nSharpnessMax      = %d", int(caps.nSharpnessMax      ));
   2383     CAMHAL_LOGD("nSaturationMin     = %d", int(caps.nSaturationMin     ));
   2384     CAMHAL_LOGD("nSaturationMax     = %d", int(caps.nSaturationMax     ));
   2385 
   2386     CAMHAL_LOGD("");
   2387     CAMHAL_LOGD("------------------- end of dump -------------------");
   2388     CAMHAL_LOGD("===================================================");
   2389 
   2390     return true;
   2391 }
   2392 
   2393 /*****************************************
   2394  * public exposed function declarations
   2395  *****************************************/
   2396 
   2397 status_t OMXCameraAdapter::getCaps(const int sensorId, CameraProperties::Properties* params, OMX_HANDLETYPE handle)
   2398 {
   2399     status_t ret = NO_ERROR;
   2400     int caps_size = 0;
   2401     OMX_ERRORTYPE eError = OMX_ErrorNone;
   2402     CameraBuffer *bufferlist;
   2403     OMX_TI_CAPTYPE* caps;
   2404     OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer;
   2405     MemoryManager memMgr;
   2406 
   2407     LOG_FUNCTION_NAME;
   2408 
   2409     ret = memMgr.initialize();
   2410     if ( ret != OK ) {
   2411         CAMHAL_LOGE("MemoryManager initialization failed, error: %d", ret);
   2412         return ret;
   2413     }
   2414 
   2415     // allocate tiler (or ion) buffer for caps (size is always a multiple of 4K)
   2416     caps_size = ((sizeof(OMX_TI_CAPTYPE)+4095)/4096)*4096;
   2417     bufferlist = memMgr.allocateBufferList(0, 0, NULL, caps_size, 1);
   2418     caps = (OMX_TI_CAPTYPE*) bufferlist[0].opaque;
   2419 
   2420     if (!caps) {
   2421         CAMHAL_LOGEB("Error allocating buffer for caps %d", eError);
   2422         ret = -ENOMEM;
   2423         goto EXIT;
   2424     }
   2425 
   2426     // initialize structures to be passed to OMX Camera
   2427     OMX_INIT_STRUCT_PTR (caps, OMX_TI_CAPTYPE);
   2428     caps->nPortIndex = OMX_ALL;
   2429 
   2430     OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER);
   2431     sharedBuffer.nPortIndex = OMX_ALL;
   2432     sharedBuffer.nSharedBuffSize = caps_size;
   2433     sharedBuffer.pSharedBuff = (OMX_U8 *) camera_buffer_get_omx_ptr (&bufferlist[0]);
   2434 
   2435     // Get capabilities from OMX Camera
   2436     eError =  OMX_GetConfig(handle, (OMX_INDEXTYPE) OMX_TI_IndexConfigCamCapabilities, &sharedBuffer);
   2437     if ( OMX_ErrorNone != eError ) {
   2438         CAMHAL_LOGEB("Error during capabilities query 0x%x", eError);
   2439         ret = UNKNOWN_ERROR;
   2440         goto EXIT;
   2441     } else {
   2442         CAMHAL_LOGDA("OMX capability query success");
   2443     }
   2444 
   2445 #ifdef CAMERAHAL_DEBUG
   2446     _dumpOmxTiCap(sensorId, *caps);
   2447 #endif
   2448 
   2449     // Translate and insert Ducati capabilities to CameraProperties
   2450     if ( NO_ERROR == ret ) {
   2451         ret = insertCapabilities(params, *caps);
   2452     }
   2453 
   2454     CAMHAL_LOGDB("sen mount id=%u", (unsigned int)caps->tSenMounting.nSenId);
   2455     CAMHAL_LOGDB("facing id=%u", (unsigned int)caps->tSenMounting.eFacing);
   2456 
   2457  EXIT:
   2458     if (bufferlist) {
   2459         memMgr.freeBufferList(bufferlist);
   2460     }
   2461 
   2462     LOG_FUNCTION_NAME_EXIT;
   2463     return ret;
   2464 }
   2465 
   2466 } // namespace Camera
   2467 } // namespace Ti
   2468