Home | History | Annotate | Download | only in libcamera2
      1 /*
      2 **
      3 ** Copyright 2008, The Android Open Source Project
      4 ** Copyright 2012, Samsung Electronics Co. LTD
      5 **
      6 ** Licensed under the Apache License, Version 2.0 (the "License");
      7 ** you may not use this file except in compliance with the License.
      8 ** You may obtain a copy of the License at
      9 **
     10 **     http://www.apache.org/licenses/LICENSE-2.0
     11 **
     12 ** Unless required by applicable law or agreed to in writing, software
     13 ** distributed under the License is distributed on an "AS IS" BASIS,
     14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15 ** See the License for the specific language governing permissions and
     16 ** limitations under the License.
     17 */
     18 
     19 /*!
     20  * \file      MetadataConverter.cpp
     21  * \brief     source file for Metadata converter ( for camera hal2 implementation )
     22  * \author    Sungjoong Kang(sj3.kang (at) samsung.com)
     23  * \date      2012/05/31
     24  *
     25  * <b>Revision History: </b>
     26  * - 2012/05/31 : Sungjoong Kang(sj3.kang (at) samsung.com) \n
     27  *   Initial Release
     28  */
     29 
     30 //#define LOG_NDEBUG 0
     31 #define LOG_TAG "MetadataConverter"
     32 #include <utils/Log.h>
     33 
     34 #include "MetadataConverter.h"
     35 #include "exynos_format.h"
     36 
     37 namespace android {
     38 
     39 
     40 MetadataConverter::MetadataConverter()
     41 {
     42     return;
     43 }
     44 
     45 
     46 MetadataConverter::~MetadataConverter()
     47 {
     48     ALOGV("DEBUG(%s)destroy!!:", __FUNCTION__);
     49     return;
     50 }
     51 
     52 status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry,
     53     uint8_t type)
     54 {
     55     if (!(entry->type==type))
     56     {
     57         ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)",
     58             __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count);
     59         return BAD_VALUE;
     60     }
     61     return NO_ERROR;
     62 }
     63 
     64 status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry,
     65     uint8_t type, size_t count)
     66 {
     67     if (!((entry->type==type)&&(entry->count==count)))
     68     {
     69         ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)",
     70             __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count);
     71         return BAD_VALUE;
     72     }
     73     return NO_ERROR;
     74 }
     75 
     76 status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
     77 {
     78     uint32_t    num_entry = 0;
     79     uint32_t    index = 0;
     80     uint32_t    i = 0;
     81     uint32_t    cnt = 0;
     82     camera_metadata_entry_t curr_entry;
     83     struct camera2_shot * dst = NULL;
     84 
     85     if (request == NULL || dst_ext == NULL)
     86         return BAD_VALUE;
     87 
     88     memset((void*)dst_ext, 0, sizeof(struct camera2_shot_ext));
     89     dst = &dst_ext->shot;
     90 
     91     dst->magicNumber = 0x23456789;
     92     dst->ctl.aa.aeTargetFpsRange[0] = 15;
     93     dst->ctl.aa.aeTargetFpsRange[1] = 30;
     94     dst->ctl.aa.aeExpCompensation = 5;
     95 
     96     num_entry = (uint32_t)get_camera_metadata_entry_count(request);
     97     for (index = 0 ; index < num_entry ; index++) {
     98 
     99         if (get_camera_metadata_entry(request, index, &curr_entry)==0) {
    100             switch (curr_entry.tag) {
    101 
    102             case ANDROID_LENS_FOCUS_DISTANCE:
    103                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
    104                     break;
    105                 dst->ctl.lens.focusDistance = curr_entry.data.f[0];
    106                 break;
    107 
    108             case ANDROID_LENS_APERTURE:
    109                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
    110                     break;
    111                 dst->ctl.lens.aperture = curr_entry.data.f[0];
    112                 break;
    113 
    114             case ANDROID_LENS_FOCAL_LENGTH:
    115                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
    116                     break;
    117                 dst->ctl.lens.focalLength = curr_entry.data.f[0];
    118                 break;
    119 
    120             case ANDROID_LENS_FILTER_DENSITY:
    121                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
    122                     break;
    123                 dst->ctl.lens.filterDensity = curr_entry.data.f[0];
    124                 break;
    125 
    126             case ANDROID_LENS_OPTICAL_STABILIZATION_MODE:
    127                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    128                     break;
    129                 dst->ctl.lens.opticalStabilizationMode =
    130                     (enum optical_stabilization_mode)curr_entry.data.u8[0];
    131                 break;
    132 
    133 
    134             case ANDROID_SENSOR_TIMESTAMP:
    135                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
    136                     break;
    137                 dst->dm.sensor.timeStamp = curr_entry.data.i64[0];
    138                 break;
    139 
    140 
    141             case ANDROID_SENSOR_SENSITIVITY:
    142                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
    143                     break;
    144                 dst->dm.aa.isoValue = curr_entry.data.i32[0];
    145                 break;
    146 
    147             case ANDROID_SENSOR_EXPOSURE_TIME:
    148                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
    149                     break;
    150                 dst->dm.sensor.exposureTime = curr_entry.data.i64[0];
    151                 break;
    152 
    153 
    154             case ANDROID_FLASH_MODE:
    155                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    156                     break;
    157                 dst->ctl.flash.flashMode = (enum flash_mode)(curr_entry.data.u8[0] + 1);
    158                 break;
    159 
    160             case ANDROID_FLASH_FIRING_POWER:
    161                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    162                     break;
    163                 dst->ctl.flash.firingPower = curr_entry.data.u8[0];
    164                 break;
    165 
    166             case ANDROID_FLASH_FIRING_TIME:
    167                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
    168                     break;
    169                 dst->ctl.flash.firingTime = curr_entry.data.i64[0];
    170                 break;
    171 
    172 
    173 
    174             case ANDROID_SCALER_CROP_REGION:
    175                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 4))
    176                     break;
    177                 for (i=0 ; i<3; i++)
    178                     dst->ctl.scaler.cropRegion[i] = ALIGN(curr_entry.data.i32[i], 2);
    179                 break;
    180 
    181 
    182             case ANDROID_JPEG_QUALITY:
    183                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
    184                     break;
    185                 dst->ctl.jpeg.quality= curr_entry.data.i32[0];
    186                 break;
    187 
    188             case ANDROID_JPEG_THUMBNAIL_SIZE:
    189                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
    190                     break;
    191                 for (i=0 ; i<curr_entry.count ; i++)
    192                     dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i];
    193                 break;
    194 
    195             case ANDROID_JPEG_THUMBNAIL_QUALITY:
    196                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
    197                     break;
    198                 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0];
    199                 break;
    200 
    201             case ANDROID_JPEG_GPS_COORDINATES:
    202                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3))
    203                     break;
    204                 for (i=0 ; i<curr_entry.count ; i++)
    205                     dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i];
    206                 break;
    207 
    208             case ANDROID_JPEG_GPS_PROCESSING_METHOD:
    209                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
    210                     break;
    211                 if (curr_entry.count > 32)
    212                     cnt = 32;
    213                 else
    214                     cnt = curr_entry.count;
    215                 for (i = 0 ; i < cnt ; i++)
    216                     dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i];
    217                 break;
    218 
    219             case ANDROID_JPEG_GPS_TIMESTAMP:
    220                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
    221                     break;
    222                 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0];
    223                 break;
    224 
    225             case ANDROID_JPEG_ORIENTATION:
    226                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
    227                     break;
    228                 dst->ctl.jpeg.orientation = curr_entry.data.i32[0];
    229                 break;
    230 
    231 
    232 
    233             case ANDROID_STATISTICS_FACE_DETECT_MODE:
    234                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    235                     break;
    236                 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)(curr_entry.data.u8[0] + 1);
    237                 break;
    238 
    239             case ANDROID_CONTROL_CAPTURE_INTENT:
    240                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    241                     break;
    242                 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0];
    243                 break;
    244 
    245             case ANDROID_CONTROL_MODE:
    246                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    247                     break;
    248                 dst->ctl.aa.mode = (enum aa_mode)(curr_entry.data.u8[0] + 1);
    249                 break;
    250 
    251 
    252             case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE:
    253                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    254                     break;
    255                 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0];
    256                 break;
    257 
    258             case ANDROID_CONTROL_AE_MODE:
    259                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    260                     break;
    261                 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 2);
    262                 // skip locked mode
    263                 if (dst->ctl.aa.aeMode == AA_AEMODE_LOCKED)
    264                     dst->ctl.aa.aeMode = AA_AEMODE_OFF;
    265                 ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)",  __FUNCTION__, dst->ctl.aa.aeMode);
    266                 break;
    267 
    268             case ANDROID_CONTROL_AE_LOCK:
    269                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    270                     break;
    271                 dst_ext->ae_lock = (enum ae_lockmode)(curr_entry.data.u8[0]);
    272                 break;
    273 
    274             case ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION:
    275                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
    276                     break;
    277                 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5;
    278                 break;
    279 
    280             case ANDROID_CONTROL_AWB_MODE:
    281                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    282                     break;
    283                 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 2);
    284                 // skip locked mode
    285                 if (dst->ctl.aa.awbMode == AA_AWBMODE_LOCKED)
    286                     dst->ctl.aa.awbMode = AA_AWBMODE_OFF;
    287                 dst_ext->awb_mode_dm = (enum aa_awbmode)(curr_entry.data.u8[0] + 2);
    288                 break;
    289 
    290             case ANDROID_CONTROL_AWB_LOCK:
    291                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    292                     break;
    293                 dst_ext->awb_lock = (enum awb_lockmode)(curr_entry.data.u8[0]);
    294                 break;
    295 
    296             case ANDROID_CONTROL_AF_MODE:
    297                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    298                     break;
    299                 dst->ctl.aa.afMode = (enum aa_afmode)(curr_entry.data.u8[0] + 1);
    300                 if (dst->ctl.aa.afMode == AA_AFMODE_OFF)
    301                     dst->ctl.aa.afMode = AA_AFMODE_MANUAL;
    302                 break;
    303 
    304             case ANDROID_CONTROL_AF_REGIONS:
    305                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
    306                     break;
    307                 for (i=0 ; i<curr_entry.count ; i++)
    308                     dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i];
    309                 break;
    310 
    311             case ANDROID_CONTROL_AE_REGIONS:
    312                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
    313                     break;
    314                 for (i=0 ; i<curr_entry.count ; i++)
    315                     dst->ctl.aa.aeRegions[i] = curr_entry.data.i32[i];
    316                 break;
    317 
    318 
    319             case ANDROID_REQUEST_ID:
    320                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
    321                     break;
    322                 dst->ctl.request.id = curr_entry.data.i32[0];
    323                 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)",  __FUNCTION__,  dst->ctl.request.id);
    324                 break;
    325 
    326             case ANDROID_REQUEST_METADATA_MODE:
    327                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    328                     break;
    329                 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0];
    330                 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)",  __FUNCTION__, (int)( dst->ctl.request.metadataMode));
    331                 break;
    332 
    333             case ANDROID_REQUEST_OUTPUT_STREAMS:
    334                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
    335                     break;
    336 
    337                 dst->ctl.request.outputStreams[0] = 0;
    338                 for (i=0 ; i<curr_entry.count ; i++) {
    339                     ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ",  __FUNCTION__, i, curr_entry.data.u8[i]);
    340                     dst->ctl.request.outputStreams[0] |= (1 << curr_entry.data.u8[i]);
    341                 }
    342                 break;
    343 
    344             case ANDROID_REQUEST_INPUT_STREAMS:
    345                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
    346                     break;
    347 
    348                 for (i=0 ; i<curr_entry.count ; i++) {
    349                     dst_ext->reprocessInput = curr_entry.data.u8[0];
    350                     ALOGV("DEBUG(%s): ANDROID_REQUEST_INPUT_STREAMS[%d] = %d ",  __FUNCTION__, i, dst_ext->reprocessInput);
    351                 }
    352                 break;
    353 
    354             case ANDROID_REQUEST_TYPE:
    355                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    356                     break;
    357                 dst_ext->isReprocessing = curr_entry.data.u8[0];
    358                 ALOGV("DEBUG(%s): ANDROID_REQUEST_TYPE (%d)",  __FUNCTION__, dst_ext->isReprocessing);
    359                 break;
    360 
    361             case ANDROID_REQUEST_FRAME_COUNT:
    362                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
    363                     break;
    364                 dst->ctl.request.frameCount = curr_entry.data.i32[0];
    365                 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)",  __FUNCTION__, dst->ctl.request.frameCount);
    366                 break;
    367 
    368             case ANDROID_CONTROL_SCENE_MODE:
    369                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
    370                     break;
    371                 dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1);
    372                 break;
    373 
    374             case ANDROID_CONTROL_AE_TARGET_FPS_RANGE:
    375                 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
    376                     break;
    377                 for (i=0 ; i<curr_entry.count ; i++)
    378                     dst->ctl.aa.aeTargetFpsRange[i] = curr_entry.data.i32[i];
    379                 break;
    380 
    381             default:
    382                 ALOGV("DEBUG(%s):Bad Metadata tag (%d)",  __FUNCTION__, curr_entry.tag);
    383                 break;
    384             }
    385         }
    386     }
    387     if (dst->ctl.aa.mode != AA_CONTROL_USE_SCENE_MODE)
    388         dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
    389     ApplySceneModeParameters(request, dst_ext);
    390     return NO_ERROR;
    391 }
    392 
    393 status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
    394 {
    395     camera_metadata_entry_t curr_entry;
    396     struct camera2_shot * dst = NULL;
    397 
    398     ALOGV("DEBUG(%s):", __FUNCTION__);
    399 
    400     dst = &(dst_ext->shot);
    401 
    402     switch (dst->ctl.aa.sceneMode) {
    403 
    404     case AA_SCENE_MODE_ACTION:
    405         dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
    406         if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
    407             dst->ctl.aa.aeMode = AA_AEMODE_ON;
    408         dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
    409         dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
    410         dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
    411         dst->ctl.aa.isoValue = 0;
    412         dst->ctl.aa.aeTargetFpsRange[0] = 30;
    413         dst->ctl.aa.aeTargetFpsRange[1] = 30;
    414 
    415         dst->ctl.noise.mode = PROCESSING_MODE_FAST;
    416         dst->ctl.noise.strength = 0;
    417         dst->ctl.edge.mode = PROCESSING_MODE_FAST;
    418         dst->ctl.edge.strength = 0;
    419 
    420         dst->ctl.color.saturation = 3; // means '0'
    421         break;
    422 
    423     case AA_SCENE_MODE_PARTY:
    424         dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
    425         if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
    426             dst->ctl.aa.aeMode = AA_AEMODE_ON;
    427         dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
    428         dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
    429         dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL;
    430         dst->ctl.aa.isoValue = 200;
    431         dst->ctl.aa.aeTargetFpsRange[0] = 15;
    432         dst->ctl.aa.aeTargetFpsRange[1] = 30;
    433 
    434         dst->ctl.noise.mode = PROCESSING_MODE_FAST;
    435         dst->ctl.noise.strength = 0;
    436         dst->ctl.edge.mode = PROCESSING_MODE_FAST;
    437         dst->ctl.edge.strength = 0;
    438 
    439         dst->ctl.color.saturation = 4; // means '+1'
    440         break;
    441 
    442     case AA_SCENE_MODE_SUNSET:
    443         dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
    444         if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
    445             dst->ctl.aa.aeMode = AA_AEMODE_ON;
    446         dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT;
    447         dst_ext->awb_mode_dm = AA_AWBMODE_WB_DAYLIGHT;
    448         dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
    449         dst->ctl.aa.isoValue = 0;
    450         dst->ctl.aa.aeTargetFpsRange[0] = 15;
    451         dst->ctl.aa.aeTargetFpsRange[1] = 30;
    452 
    453         dst->ctl.noise.mode = PROCESSING_MODE_FAST;
    454         dst->ctl.noise.strength = 0;
    455         dst->ctl.edge.mode = PROCESSING_MODE_FAST;
    456         dst->ctl.edge.strength = 0;
    457 
    458         dst->ctl.color.saturation = 3; // means '0'
    459         break;
    460 
    461     case AA_SCENE_MODE_NIGHT:
    462         dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
    463         dst->ctl.aa.aeMode = AA_AEMODE_ON; // AE_LOCK is prohibited
    464         dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
    465         dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
    466         dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
    467         dst->ctl.aa.isoValue = 0;
    468         dst->ctl.aa.aeTargetFpsRange[0] = 8;
    469         dst->ctl.aa.aeTargetFpsRange[1] = 30;
    470 
    471         dst->ctl.noise.mode = PROCESSING_MODE_FAST;
    472         dst->ctl.noise.strength = 0;
    473         dst->ctl.edge.mode = PROCESSING_MODE_FAST;
    474         dst->ctl.edge.strength = 0;
    475 
    476         dst->ctl.color.saturation = 3; // means '0'
    477         break;
    478 
    479     case AA_SCENE_MODE_FACE_PRIORITY:
    480         dst->ctl.aa.mode = AA_CONTROL_AUTO;
    481         if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH))
    482             dst->ctl.aa.aeMode = AA_AEMODE_ON;
    483         dst->ctl.aa.sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
    484         dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
    485         dst->ctl.aa.isoValue = 0;
    486         dst->ctl.noise.mode = PROCESSING_MODE_OFF;
    487         dst->ctl.noise.strength = 0;
    488         dst->ctl.edge.mode = PROCESSING_MODE_OFF;
    489         dst->ctl.edge.strength = 0;
    490         dst->ctl.color.saturation = 3; // means '0'
    491         break;
    492 
    493     default:
    494         dst->ctl.aa.mode = AA_CONTROL_AUTO;
    495         if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH))
    496             dst->ctl.aa.aeMode = AA_AEMODE_ON;
    497         dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
    498         dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
    499         dst->ctl.aa.isoValue = 0;
    500         dst->ctl.noise.mode = PROCESSING_MODE_OFF;
    501         dst->ctl.noise.strength = 0;
    502         dst->ctl.edge.mode = PROCESSING_MODE_OFF;
    503         dst->ctl.edge.strength = 0;
    504         dst->ctl.color.saturation = 3; // means '0'
    505         break;
    506     }
    507 
    508     return NO_ERROR;
    509 }
    510 
    511 
    512 status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
    513 {
    514     status_t    res;
    515     struct camera2_shot * metadata = &metadata_ext->shot;
    516     uint8_t  byteData;
    517     uint32_t intData;
    518 
    519     if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
    520                 &(metadata->ctl.request.id), 1))
    521         return NO_MEMORY;
    522 
    523     if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
    524                 &(metadata->ctl.request.metadataMode), 1))
    525         return NO_MEMORY;
    526 
    527     if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
    528                 &(metadata->ctl.request.frameCount), 1))
    529         return NO_MEMORY;
    530 
    531     if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
    532                 &metadata->dm.sensor.timeStamp, 1))
    533         return NO_MEMORY;
    534 
    535     if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME,
    536                 &metadata->dm.sensor.exposureTime, 1))
    537         return NO_MEMORY;
    538 
    539     if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
    540                 &metadata->dm.lens.aperture, 1))
    541         return NO_MEMORY;
    542 
    543     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
    544                 &(metadata->ctl.aa.aeTargetFpsRange), 2))
    545         return NO_MEMORY;
    546 
    547     ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__,
    548        metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount,
    549        metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture);
    550 
    551 
    552     byteData = metadata_ext->awb_mode_dm- 2;
    553     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE,
    554                 &byteData, 1))
    555         return NO_MEMORY;
    556 
    557     byteData = metadata->dm.aa.aeMode - 1;
    558     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE,
    559                 &byteData, 1))
    560         return NO_MEMORY;
    561 
    562     byteData = metadata->ctl.aa.afMode - 1;
    563     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE,
    564                 &byteData, 1))
    565         return NO_MEMORY;
    566 
    567     byteData = metadata->ctl.aa.sceneMode - 1;
    568     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE,
    569                 &byteData, 1))
    570         return NO_MEMORY;
    571 
    572     intData = metadata->ctl.aa.aeExpCompensation - 5;
    573     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
    574                 &intData, 1))
    575         return NO_MEMORY;
    576 
    577     byteData = metadata->dm.stats.faceDetectMode - 1;
    578     if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_DETECT_MODE,
    579                 &byteData, 1))
    580         return NO_MEMORY;
    581 
    582     int maxFacecount = CAMERA2_MAX_FACES;
    583     if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
    584                 &maxFacecount, 1))
    585         return NO_MEMORY;
    586 
    587     int tempFaceCount = 0;
    588     for (int i = 0; i < CAMERA2_MAX_FACES; i++) {
    589         if (metadata->dm.stats.faceIds[i] > 0) {
    590             mataFaceIds[tempFaceCount] = metadata->dm.stats.faceIds[i];
    591             // clipping fd score because the max face score of android is 100
    592             if (metadata->dm.stats.faceScores[i] > 100)
    593                 metaFaceScores[tempFaceCount] = 100;
    594             else
    595                 metaFaceScores[tempFaceCount] = metadata->dm.stats.faceScores[i];
    596 
    597             memcpy(&mataFaceLandmarks[tempFaceCount][0], &metadata->dm.stats.faceLandmarks[i][0], 6*sizeof(uint32_t));
    598             memcpy(&metaFaceRectangles[tempFaceCount][0], &metadata->dm.stats.faceRectangles[i][0], 4*sizeof(uint32_t));
    599             tempFaceCount++;
    600         }
    601     }
    602 
    603     if (tempFaceCount > 0) {
    604         if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_RECTANGLES,
    605                     &metaFaceRectangles, 4 * tempFaceCount))
    606             return NO_MEMORY;
    607 
    608         if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_LANDMARKS,
    609                     &mataFaceLandmarks, 6 * tempFaceCount))
    610             return NO_MEMORY;
    611 
    612         if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_IDS,
    613                     &mataFaceIds, tempFaceCount))
    614             return NO_MEMORY;
    615 
    616         if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_SCORES,
    617                     &metaFaceScores, tempFaceCount))
    618             return NO_MEMORY;
    619     }
    620     if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
    621                 &metadata->dm.aa.isoValue, 1))
    622         return NO_MEMORY;
    623 
    624     // Need a four-entry crop region
    625     uint32_t cropRegion[4] = {
    626         metadata->ctl.scaler.cropRegion[0],
    627         metadata->ctl.scaler.cropRegion[1],
    628         metadata->ctl.scaler.cropRegion[2],
    629         0
    630     };
    631     if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
    632                 cropRegion, 4))
    633         return NO_MEMORY;
    634 
    635     byteData = metadata->dm.aa.aeState - 1;
    636     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
    637                 &byteData, 1))
    638         return NO_MEMORY;
    639 
    640     if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
    641                 &(metadata->dm.aa.awbState), 1))
    642         return NO_MEMORY;
    643 
    644 
    645     if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION,
    646                 &metadata->ctl.jpeg.orientation, 1))
    647         return NO_MEMORY;
    648 
    649     if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY,
    650                 &metadata->ctl.jpeg.quality, 1))
    651         return NO_MEMORY;
    652 
    653     if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE,
    654                 &metadata->ctl.jpeg.thumbnailSize, 2))
    655         return NO_MEMORY;
    656 
    657     if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY,
    658                 &metadata->ctl.jpeg.thumbnailQuality, 1))
    659         return NO_MEMORY;
    660 
    661 
    662     if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES,
    663                 &(metadata->ctl.jpeg.gpsCoordinates), 3))
    664         return NO_MEMORY;
    665 
    666     if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD,
    667                 &(metadata_ext->gpsProcessingMethod), 32))
    668         return NO_MEMORY;
    669 
    670     if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP,
    671                 &(metadata->ctl.jpeg.gpsTimestamp), 1))
    672         return NO_MEMORY;
    673     ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d)  AEComp(%d) AF(%d)", __FUNCTION__,
    674        metadata_ext->awb_mode_dm- 2, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1,
    675        metadata->ctl.aa.aeExpCompensation, metadata->ctl.aa.afMode - 1);
    676 
    677 
    678     if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) {
    679         ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__);
    680         return NO_ERROR;
    681     }
    682     return NO_ERROR;
    683 
    684 
    685 }
    686 
    687 }; // namespace android
    688