QCamera3HWI.cpp revision 0f0f251722ee12e53bab3d4e4918e541ebc82722
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without
4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are
5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met:
6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions of source code must retain the above copyright
7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       notice, this list of conditions and the following disclaimer.
8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions in binary form must reproduce the above
9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       copyright notice, this list of conditions and the following
10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       disclaimer in the documentation and/or other materials provided
11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       with the distribution.
12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Neither the name of The Linux Foundation nor the names of its
13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       contributors may be used to endorse or promote products derived
14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       from this software without specific prior written permission.
15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/
29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI"
3114dfc272241ba78c85a327da2872e71b3208f8c5Shuzhen Wang//#define LOG_NDEBUG 0
32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h>
34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h>
35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h>
36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h>
37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h>
38625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h>
39e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h>
40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h>
41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h"
42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h"
43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h"
4466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h"
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera {
4962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
5062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang#define MAX(a, b) ((a) > (b) ? (a) : (b))
5162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
5480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings;
55b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
57cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
58cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    PTHREAD_MUTEX_INITIALIZER;
59cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
60cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
10097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
104b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
121e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
122e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
124e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
1296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE },
1306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH }
131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1336990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = {
1346990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,    CAM_FACE_DETECT_MODE_OFF     },
1356990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL,   CAM_FACE_DETECT_MODE_FULL    }
1366990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang};
1376990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang
13808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
13908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
149c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    flush:                              QCamera3HardwareInterface::flush,
150c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    reserved:                           {0},
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
168cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
16997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
17033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
17133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
1727ee407aa1024789089aad411c372c79423699976Ajay Dudani      mPictureChannel(NULL),
17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
17433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
17533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
17699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      mJpegSettings(NULL),
1778bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani      mIsZslMode(false),
17862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinProcessedFrameDuration(0),
17962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinJpegFrameDuration(0),
18062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinRawFrameDuration(0),
18199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      m_pPowerModule(NULL)
182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
185e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1897ee407aa1024789089aad411c372c79423699976Ajay Dudani    // TODO: hardcode for now until mctl add support for min_num_pp_bufs
1907ee407aa1024789089aad411c372c79423699976Ajay Dudani    //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3
1917ee407aa1024789089aad411c372c79423699976Ajay Dudani    gCamCapability[cameraId]->min_num_pp_bufs = 3;
1929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
19574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
19733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
19833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
19933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
20099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
20199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
20299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
20399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
20499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
20599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
21166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
219d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
220d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
221d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        /*flush the metadata list*/
222d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
223d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
224d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
225d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
226d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
227d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
228d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
229d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
2301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
233dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
2347ee407aa1024789089aad411c372c79423699976Ajay Dudani           channel->stop();
235d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
236d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
237d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
238d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
2390f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang        if ((*it)->registered && (*it)->buffer_set.buffers) {
2400f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang             delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
2410f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang        }
242dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
243dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
2477ee407aa1024789089aad411c372c79423699976Ajay Dudani    mPictureChannel = NULL;
2487ee407aa1024789089aad411c372c79423699976Ajay Dudani
24997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
25097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
25197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
25297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
253dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
254dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
255dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
2564e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang        if (mMetadataChannel) {
2574e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang            mMetadataChannel->stop();
2584e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang            delete mMetadataChannel;
2594e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang            mMetadataChannel = NULL;
2604e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang        }
261dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
262dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
263dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
264cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
265cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
26733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
26833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
26933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
27033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
271e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
272e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
273e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
274d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
292cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
293cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
294cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
295cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
296706d3c51bdf8f3482216d3a90156573bdfa02ef8Zhijun He        return -EDQUOT;
297cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
298cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
305cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
307cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
308cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
310cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
31199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
31299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == 0) {
31399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
31499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
31599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
31699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=1");
31799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
31899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
31999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
32099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
321cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
37299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
37399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == NO_ERROR) {
37499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
37599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
37699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
37799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=0");
37899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
37999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
38099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
38199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
38299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
402e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
403e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
40433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
40533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
40633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
40733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
40833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
4099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
410e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
411e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
412cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
4139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
4149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
4159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
416e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
4179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
43533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
436d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    mIsZslMode = false;
43762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
458d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
459d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
46262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (mMetadataChannel) {
46362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        /* If content of mStreamInfo is not 0, there is metadata stream */
46462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        mMetadataChannel->stop();
46562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
46662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang
46762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    pthread_mutex_lock(&mMutex);
46862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang
46962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    camera3_stream_t *inputStream = NULL;
47062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    camera3_stream_t *jpegStream = NULL;
47162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    cam_stream_size_info_t stream_config_info;
472d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
475c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
476c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
477c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
4901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
4910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
4920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
4940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
4950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
4960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
4970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
4980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
5000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
5010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
502c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
503c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
506e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
511c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
512c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
5170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
5181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
53062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (mMetadataChannel) {
53162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        delete mMetadataChannel;
53262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        mMetadataChannel = NULL;
53362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
53562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    //Create metadata channel and initialize it
53662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
53762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang                    mCameraHandle->ops, captureResultCb,
53862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang                    &gCamCapability[mCameraId]->padding_info, this);
53962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (mMetadataChannel == NULL) {
54062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
54162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        rc = -ENOMEM;
54262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        pthread_mutex_unlock(&mMutex);
54362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        return rc;
54462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
54562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    rc = mMetadataChannel->initialize();
54662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (rc < 0) {
54762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        ALOGE("%s: metadata channel initialization failed", __func__);
54862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        delete mMetadataChannel;
54962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        pthread_mutex_unlock(&mMutex);
55062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        return rc;
55162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
556dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang        uint32_t stream_usage = newStream->usage;
557d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        stream_config_info.stream_sizes[i].width = newStream->width;
558d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        stream_config_info.stream_sizes[i].height = newStream->height;
559d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
560d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && jpegStream){
561d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            //for zsl stream the size is jpeg size
562d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            stream_config_info.stream_sizes[i].width = jpegStream->width;
563d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            stream_config_info.stream_sizes[i].height = jpegStream->height;
564dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang            stream_config_info.type[i] = CAM_STREAM_TYPE_SNAPSHOT;
565dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang        } else {
566dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           //for non zsl streams find out the format
567dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           switch (newStream->format) {
568dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED :
569dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              {
570dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                 if (stream_usage & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER) {
571dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                    stream_config_info.type[i] = CAM_STREAM_TYPE_VIDEO;
572dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                 } else {
573dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                    stream_config_info.type[i] = CAM_STREAM_TYPE_PREVIEW;
574dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                 }
575dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              }
576dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
577dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           case HAL_PIXEL_FORMAT_YCbCr_420_888:
578dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              stream_config_info.type[i] = CAM_STREAM_TYPE_CALLBACK;
579dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
580dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           case HAL_PIXEL_FORMAT_BLOB:
581dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              stream_config_info.type[i] = CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT;
582dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
583dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           default:
584dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              stream_config_info.type[i] = CAM_STREAM_TYPE_DEFAULT;
585dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
586dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           }
587d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        }
588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
591f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
592f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
593f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
594f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
595f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
596f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
597f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
598f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
599c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                /* For video encoding stream, set read/write rarely
600c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                 * flag so that they may be set to un-cached */
601c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER)
602c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage =
603c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         (GRALLOC_USAGE_SW_READ_RARELY |
604c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_SW_WRITE_RARELY |
605c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_HW_CAMERA_WRITE);
606c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                else
607c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
610f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
611f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
6151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
618f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
6198867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
620f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
621c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
622c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
623c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
624c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
6258bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
626c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
627c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
628c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
629c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
630c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
631c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
632f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
633f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
634f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
635f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
636f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
637f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
638f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
639f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
640f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
641f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
642f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
643f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
6447ee407aa1024789089aad411c372c79423699976Ajay Dudani                    mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle,
645f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
646f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
6477ee407aa1024789089aad411c372c79423699976Ajay Dudani                    if (mPictureChannel == NULL) {
648f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
649f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
650f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
651f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
6527ee407aa1024789089aad411c372c79423699976Ajay Dudani                    newStream->priv = (QCamera3Channel*)mPictureChannel;
653f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
654f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
655f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
656f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
657f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
658f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
6668867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
6671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
6681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
6691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
6701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
6711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
6721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
6731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
6741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
6751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
6761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
6771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
6781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
6791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
6801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
681a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
682e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
6830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
6871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
6881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
6891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
6901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
6911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
6920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
6951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
6961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
697d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    /*flush the metadata list*/
698d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
699d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
700d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
701d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
702d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
703d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
704d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
705d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
706d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
707d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    stream_config_info.num_streams = streamList->num_streams;
708d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
70933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
711d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
712d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
713d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
714d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang                sizeof(hal_version), &hal_version);
715d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
716d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_INFO,
717d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang                sizeof(stream_config_info), &stream_config_info);
718d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
719d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
720d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
72133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
72233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
72362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Get min frame duration for this streams configuration
72462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    deriveMinFrameDuration();
72562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
72733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
73480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
73580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
73680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
73780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
73880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
73980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
74080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
7429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
74380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
7469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
7509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
7519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
767c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
768c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
769c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
770c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
771c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
772c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
773c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
774c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
775c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
776c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
777c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
778c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
779c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
780c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
781c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
782c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
783c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
784c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
785c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
786c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
787c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
788c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
789c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
7909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
7939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
7949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
7959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
7979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
7989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
7999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
8049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
8089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
8099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
8139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
8149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
8189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
8199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
8209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
822e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : deriveMinFrameDuration
82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based
82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              on currently configured streams.
82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE
83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : NONE
83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration()
83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t maxJpegDimension, maxProcessedDimension;
83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxJpegDimension = 0;
84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxProcessedDimension = 0;
84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    // Figure out maximum jpeg, processed, and raw dimensions
84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (List<stream_info_t*>::iterator it = mStreamInfo.begin();
84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        it != mStreamInfo.end(); it++) {
84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        // Input stream doesn't have valid stream_type
84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT)
84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            continue;
84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
85062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int32_t dimension = (*it)->stream->width * (*it)->stream->height;
85162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) {
85262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxJpegDimension)
85362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxJpegDimension = dimension;
85462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) {
85562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxProcessedDimension)
85662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxProcessedDimension = dimension;
85762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
85862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
85962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
86062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Assume all jpeg dimensions are in processed dimensions.
86162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (maxJpegDimension > maxProcessedDimension)
86262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        maxProcessedDimension = maxJpegDimension;
86362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
86462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Find minimum durations for processed, jpeg, and raw
86562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration;
86662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
86762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (maxProcessedDimension ==
86862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].width *
86962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].height) {
87062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
87162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
87262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            break;
87362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
87462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
87562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
87662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
87762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
87862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : getMinFrameDuration
87962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
88062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations
88162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              and current request configuration.
88262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
88362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks
88462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
88562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : min farme duration for a particular request
88662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
88762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
88862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request)
88962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
89062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    bool hasJpegStream = false;
89162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (uint32_t i = 0; i < request->num_output_buffers; i ++) {
89262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        const camera3_stream_t *stream = request->output_buffers[i].stream;
89362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (stream->format == HAL_PIXEL_FORMAT_BLOB)
89462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            hasJpegStream = true;
89562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
89662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
89762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (!hasJpegStream)
89862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration);
89962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    else
90062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration);
90162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
90262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
90362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
904e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
905e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
906e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
907e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
908e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
909e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
914e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
917e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
918e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
919e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
920e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
921e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
922e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
923e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
924e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
925e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
926e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
927e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
929e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
930e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
931e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
932e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
936e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
939e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
940e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
9461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
9471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
9481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
9490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
9501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
9511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
9521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
9531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
9540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
9550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
9560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
9570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
9591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
9600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
9620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
9630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
967e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
968e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
973e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
977e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
99074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
992d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    MetadataBufferInfo reproc_meta;
993d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    int queueMetadata = 0;
994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
995e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
996e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9972123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    rc = validateCaptureRequest(request);
9982123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    if (rc != NO_ERROR) {
9992123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
10002123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        pthread_mutex_unlock(&mMutex);
10012123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        return rc;
10022123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    }
10032123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
10042123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    meta = request->settings;
10052123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
10062123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // For first capture request, send capture intent, and
10072123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // stream on all streams
1008d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    if (mFirstRequest) {
10092123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
10102123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
10112123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            int32_t hal_version = CAM_HAL_V3;
10122123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            uint8_t captureIntent =
10132123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
10142123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
10152123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            memset(mParameters, 0, sizeof(parm_buffer_t));
10162123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
10172123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
10182123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(hal_version), &hal_version);
10192123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
10202123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(captureIntent), &captureIntent);
10212123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mCameraHandle->ops->set_parms(mCameraHandle->camera_handle,
10222123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                mParameters);
10232123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        }
10242123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
102562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        mMetadataChannel->start();
1026d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
1027d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            it != mStreamInfo.end(); it++) {
1028d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
1029d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            channel->start();
1030d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        }
1031d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    }
1032d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang
1033e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
103434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    uint32_t streamTypeMask = 0;
10359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
103674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
103774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
103874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
1039013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
104074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
104174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
104274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
104374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
104474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
1045013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
104674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
104774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
104874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
1049ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev    ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
1050c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
1051c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
1052c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
1053c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
1054e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
10557ee407aa1024789089aad411c372c79423699976Ajay Dudani    int blob_request = 0;
1056e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
1057e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
105834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1059e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
106066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
106166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
106266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
10637ee407aa1024789089aad411c372c79423699976Ajay Dudani            blob_request = 1;
106466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
106566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
10660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
106766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
106866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
106966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
107066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
107166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
1072e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
1073e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
1074e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
1075e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
1076e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
1077e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
107834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        streamTypeMask |= channel->getStreamTypeMask();
107934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
108034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
108162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = setFrameParameters(request, streamTypeMask);
108234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
108334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: fail to set frame parameters", __func__);
108434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        pthread_mutex_unlock(&mMutex);
108534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return rc;
1086e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1087e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
10881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
10891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
10911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
109274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
10937ee407aa1024789089aad411c372c79423699976Ajay Dudani    pendingRequest.blob_request = blob_request;
109413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0;
109574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
10961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
10971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
10981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
10991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
11001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
11011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
11021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
11031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
11041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
11051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
11069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
1107e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
11089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
11099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
11109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
11119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
11129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1113c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
111466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
11159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
11169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
11179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
11189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
11199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
112066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
1121c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
1122c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
1123c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
1124c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
1125c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
1126c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
1127c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
1128c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
1129c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
1130c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
1131c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
1132c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
1133c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
1134c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
1135c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
113641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                    ALOGD("Handle:%p", request->input_buffer->buffer);
1137d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    //TODO: need to get corresponding metadata and send it to pproc
1138d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1139d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         m != mStoredMetadataList.end(); m++) {
1140d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->input_buffer->buffer) {
1141d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            reproc_meta.meta_buf = m->meta_buf;
1142d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            queueMetadata = 1;
1143d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1144d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1145d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1146c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
1147c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
1148c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
1149c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
1150d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (queueMetadata) {
115141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false);
1152d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
115366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
1154ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
1155a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
1156d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1157d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1158d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                     m != mStoredMetadataList.end(); m++) {
1159d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (uint32_t j = 0; j < request->num_output_buffers; j++) {
1160d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->output_buffers[j].buffer) {
1161d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mMetadataChannel->bufDone(m->meta_buf);
1162d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            free(m->meta_buf);
1163d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            m = mStoredMetadataList.erase(m);
1164d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1165d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1166d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1167d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1168d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
116966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
117066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
11719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
11729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
11739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
11751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
11769770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    // Added a timed condition wait
11779770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    struct timespec ts;
11789770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    uint8_t isValidTimeout = 1;
11799770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    rc = clock_gettime(CLOCK_REALTIME, &ts);
11809770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    if (rc < 0) {
11819770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        isValidTimeout = 0;
11829770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        ALOGE("%s: Error reading the real time clock!!", __func__);
11839770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    }
11849770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    else {
11859770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        // Make timeout as 5 sec for request to be honored
11869770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        ts.tv_sec += 5;
11879770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    }
11889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
11899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
11909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
11919770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        if (!isValidTimeout) {
11929770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            ALOGV("%s: Blocking on conditional wait", __func__);
11939770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            pthread_cond_wait(&mRequestCond, &mMutex);
11949770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        }
11959770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        else {
11969770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            ALOGV("%s: Blocking on timed conditional wait", __func__);
11979770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            rc = pthread_cond_timedwait(&mRequestCond, &mMutex, &ts);
11989770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            if (rc == ETIMEDOUT) {
11999770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab                rc = -ENODEV;
12009770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab                ALOGE("%s: Unblocked on timeout!!!!", __func__);
12019770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab                break;
12029770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            }
12039770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        }
12049770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        ALOGV("%s: Unblocked", __func__);
12059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
12069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1207e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
120880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
120980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
121080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
12119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
1212e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
12139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
1214e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
12159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
12169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
1217e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1218e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1221b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
1222b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
1223e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1224e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
1225e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1226e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1227e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1228e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1229e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1230e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1231e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1232e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1233e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1234e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
1235e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1236e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
1237e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1238e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1239e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1240e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1241e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1242e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1243b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
1244e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1245e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
1246e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1247e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1248e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1249e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1250e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1251e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1252e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1253e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1254c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
1255c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
1256c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1257c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
1258c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1259c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
1260c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1261c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1262c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
1263c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
1264c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush()
1265c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
1266c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*Enable lock when we implement this function*/
1267c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*
1268c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_lock(&mMutex);
1269c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
1270c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_unlock(&mMutex);
1271c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    */
1272c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return 0;
1273c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
12747ee407aa1024789089aad411c372c79423699976Ajay Dudani
1275e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1276e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
1277e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
127833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
127933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
1280e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1281e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1282e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
128333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
128433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
12859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
12869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
12879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
12881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1289e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
12909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
12915b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_lock(&mMutex);
1292e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
12931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
12941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
129533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
129633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
1297152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        uint32_t pending_requests = *(uint32_t *)POINTER_OF(
1298152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang            CAM_INTF_META_PENDING_REQUESTS, metadata);
129933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
130033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
13010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
13020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
13030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
13040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
13050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
13061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
1307a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
13081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
13090f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang            free(metadata_buf);
13101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
13111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1312a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1313e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
13141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
13161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1317e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
13181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
13191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
1320a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
13211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
13231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
1324e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1325e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
1326e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
1327e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
1328e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
1329e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
1330e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
1331e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1332e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
1336e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
13371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
1338a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1339e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
13401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
13431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
134499b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
134599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1346e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
134799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
134874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
134999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
13501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
1351e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
135274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
1353d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (mIsZslMode) {
1354d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   int found_metadata = 0;
1355d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   //for ZSL case store the metadata buffer and corresp. ZSL handle ptr
1356d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1357d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        j != i->buffers.end(); j++) {
1358d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1359d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         //check if corresp. zsl already exists in the stored metadata list
1360d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1361d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m != mStoredMetadataList.begin(); m++) {
1362d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            if (m->frame_number == frame_number) {
1363d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m->meta_buf = metadata_buf;
1364d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               found_metadata = 1;
1365d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               break;
1366d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            }
1367d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1368d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         if (!found_metadata) {
1369d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            MetadataBufferInfo store_meta_info;
1370d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.meta_buf = metadata_buf;
1371d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.frame_number = frame_number;
1372d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mStoredMetadataList.push_back(store_meta_info);
1373d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            found_metadata = 1;
1374d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1375d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      }
1376d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1377d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   if (!found_metadata) {
137813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       if (!i->input_buffer_present && i->blob_request) {
137913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          //livesnapshot or fallback non-zsl snapshot case
138013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
138113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                j != i->buffers.end(); j++){
138213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT &&
138313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                  j->stream->format == HAL_PIXEL_FORMAT_BLOB) {
138441da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                                 mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
138513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                 break;
138613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              }
138713c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                         }
138813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       } else {
138913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            //return the metadata immediately
139013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            mMetadataChannel->bufDone(metadata_buf);
139113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            free(metadata_buf);
139213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       }
1393d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1394d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else if (!mIsZslMode && i->blob_request) {
13957ee407aa1024789089aad411c372c79423699976Ajay Dudani                   //If it is a blob request then send the metadata to the picture channel
139641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                   mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
1397d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else {
13987ee407aa1024789089aad411c372c79423699976Ajay Dudani                   // Return metadata buffer
13997ee407aa1024789089aad411c372c79423699976Ajay Dudani                   mMetadataChannel->bufDone(metadata_buf);
14007ee407aa1024789089aad411c372c79423699976Ajay Dudani                   free(metadata_buf);
1401d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               }
1402d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
14051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
14061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
14081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
1409e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
14101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1411e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
14121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
14131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
14141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
14171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
14181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
14191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
14201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
14211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
14221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
14241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1425e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
14261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
14271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
14281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
142913dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang                        j->buffer = NULL;
14301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
14311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
14321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
14341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
14351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1436a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1437d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
14381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
14391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
14401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
14411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1442ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1443d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
14441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
14451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
14471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
14481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
144933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
145033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
14511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
14521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
14531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
14541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1455e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
14561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
14571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
14581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
14591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1461152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        if (!max_buffers_dequeued && !pending_requests) {
14621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
14631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
14641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
14651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
14661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
14671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
14681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
14691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
14701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1471c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
14721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
1473c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
14741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
14751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
14761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1477e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
14781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
14791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
14801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
14811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
14841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
148533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
14861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
14871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1488a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1489e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
14901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1491d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1492d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                int found = 0;
1493d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin();
1494d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      k != mStoredMetadataList.end(); k++) {
1495d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    if (k->frame_number == frame_number) {
1496d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        k->zsl_buf_hdl = buffer->buffer;
1497d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        found = 1;
1498d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        break;
1499d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1500d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1501d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (!found) {
1502d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   MetadataBufferInfo meta_info;
1503d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.frame_number = frame_number;
1504d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.zsl_buf_hdl = buffer->buffer;
1505d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   mStoredMetadataList.push_back(meta_info);
1506d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1507d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
1508e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
150933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
15101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1511e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
15121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
15131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
15141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
15151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
15161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
15171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
15181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1519a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1520e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
15211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
15221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
15231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1524e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
15259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
15265b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_unlock(&mMutex);
15279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
15289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
15299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
153197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
153297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
153497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
153597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
153997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
154197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
154297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
154374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
154474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
154597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
154697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
154797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
155074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    uint8_t curr_entry = GET_FIRST_PARAM_ID(metadata);
15533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    uint8_t next_entry;
15543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    while (curr_entry != CAM_INTF_PARM_MAX) {
15553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       ALOGV("%s: META_DEBUG: cur_entry is %d", __func__, curr_entry);
15563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       switch (curr_entry) {
15573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_FACE_DETECTION:{
15583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_face_detection_data_t *faceDetectionInfo =
15593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (cam_face_detection_data_t *)POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
15603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t numFaces = faceDetectionInfo->num_faces_detected;
15613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t faceIds[numFaces];
15623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t faceScores[numFaces];
15633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t faceRectangles[numFaces * 4];
15643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t faceLandmarks[numFaces * 6];
15653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int j = 0, k = 0;
15663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             for (int i = 0; i < numFaces; i++) {
15673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 faceIds[i] = faceDetectionInfo->faces[i].face_id;
15683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 faceScores[i] = faceDetectionInfo->faces[i].score;
15693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 convertToRegions(faceDetectionInfo->faces[i].face_boundary,
15703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                         faceRectangles+j, -1);
15713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
15723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 j+= 4;
15733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 k+= 6;
15743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             }
15753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             if (numFaces > 0) {
15763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
15773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
15783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
15793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                     faceRectangles, numFaces*4);
15803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
15813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                     faceLandmarks, numFaces*6);
15823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             }
15833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang            break;
15843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang            }
15853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_COLOR_CORRECT_MODE:{
15863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *color_correct_mode =
15873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                           (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
15883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
15893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
15903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
15913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_AEC_PRECAPTURE_ID: {
15923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t  *ae_precapture_id =
15933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                     (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
15943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
15953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
15963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
15973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_AEC_ROI: {
15983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang            cam_area_t  *hAeRegions =
15993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
16003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t aeRegions[5];
16013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
16023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
16033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AEC_STATE:{
16063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t *ae_state =
16073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
16083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
16093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_PARM_FOCUS_MODE:{
16123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *focusMode =
16133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
1614867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang             uint8_t fwkAfMode = lookupFwkName(FOCUS_MODES_MAP,
1615867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang                 sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), *focusMode);
1616867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1);
16173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AF_ROI:{
16203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             /*af regions*/
16213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_area_t  *hAfRegions =
16223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
16233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t afRegions[5];
16243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
16253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
16263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AF_STATE: {
16293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
16303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
16313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AF_TRIGGER_ID: {
16343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t  *afTriggerId =
16353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
16363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
16373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_PARM_WHITE_BALANCE: {
16403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               uint8_t  *whiteBalance =
16413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
1642867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang               uint8_t fwkWhiteBalanceMode = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1643867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang                   sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
1644867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang                   *whiteBalance);
1645867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang               camMetadata.update(ANDROID_CONTROL_AWB_MODE, &fwkWhiteBalanceMode, 1);
16463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
16473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AWB_REGIONS: {
16493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             /*awb regions*/
16503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_area_t  *hAwbRegions =
16513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
16523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t awbRegions[5];
16533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
16543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
16553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AWB_STATE: {
16583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *whiteBalanceState =
16593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
16603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
16613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_MODE: {
16643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
16653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
16663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_EDGE_MODE: {
16693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata);
16703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
16713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_FLASH_POWER: {
16743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *flashPower =
16753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
16763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
16773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_FLASH_FIRING_TIME: {
16803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int64_t  *flashFiringTime =
16813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
16823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
16833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_FLASH_STATE: {
16863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *flashState =
16873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
16883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
16893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
16903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_HOTPIXEL_MODE: {
16923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              uint8_t  *hotPixelMode =
16933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
16943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
16953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              break;
16963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
16973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_APERTURE:{
16983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *lensAperture =
16993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
17003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
17013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FILTERDENSITY: {
17043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *filterDensity =
17053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
17063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
17073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FOCAL_LENGTH:{
17103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *focalLength =
17113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
17123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
17133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FOCUS_DISTANCE: {
17163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *focusDistance =
17173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
17183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
17193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FOCUS_RANGE: {
17223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *focusRange =
17233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
172432d9e5ad33dd580b6273aac830ef99f913a0ce0bAjay Dudani             camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 2);
17253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_OPT_STAB_MODE: {
17273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *opticalStab =
17283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
17293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
17303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_NOISE_REDUCTION_MODE: {
17323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *noiseRedMode =
17333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
17343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
17353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SCALER_CROP_REGION: {
17383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
17393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
17403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t scalerCropRegion[4];
17413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[0] = hScalerCropRegion->left;
17423e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[1] = hScalerCropRegion->top;
17433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[2] = hScalerCropRegion->width;
17443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[3] = hScalerCropRegion->height;
17453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
17463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SENSOR_EXPOSURE_TIME:{
17493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int64_t  *sensorExpTime =
17503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
17513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             mMetadataResponse.exposure_time = *sensorExpTime;
17523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime);
17533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
17543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SENSOR_FRAME_DURATION:{
17573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int64_t  *sensorFameDuration =
17583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
17593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration);
17603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
17613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SENSOR_SENSITIVITY:{
17643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t  *sensorSensitivity =
17653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
17663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity);
17673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             mMetadataResponse.iso_speed = *sensorSensitivity;
17683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
17693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SHADING_MODE: {
17723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *shadingMode =
17733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
17743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
17753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_FACEDETECT_MODE: {
17783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *faceDetectMode =
17793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
17803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP,
17813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                                        sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]),
17823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                                        *faceDetectMode);
17833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1);
17843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_HISTOGRAM_MODE: {
17873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *histogramMode =
17883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
17893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
17903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_SHARPNESS_MAP_MODE:{
17933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               uint8_t  *sharpnessMapMode =
17943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
17953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
17963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  sharpnessMapMode, 1);
17973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
17983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang           }
17993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_SHARPNESS_MAP:{
18003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
18013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
18023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
18033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  (int32_t*)sharpnessMap->sharpness,
18043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
18053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
18063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_SHADING_MAP: {
18083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *)
18093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata);
18103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height;
18113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               int map_width  = gCamCapability[mCameraId]->lens_shading_map_size.width;
18123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP,
18133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  (float*)lensShadingMap->lens_shading,
18143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  4*map_width*map_height);
18153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
18163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_TONEMAP_CURVES:{
18183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             //Populate CAM_INTF_META_TONEMAP_CURVES
18193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             /* ch0 = G, ch 1 = B, ch 2 = R*/
18203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_rgb_tonemap_curves *tonemap = (cam_rgb_tonemap_curves *)
18213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_TONEMAP_CURVES, metadata);
18223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_TONEMAP_CURVE_GREEN,
18233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                (float*)tonemap->curves[0].tonemap_points,
18243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                tonemap->tonemap_points_cnt * 2);
18253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang
18263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_TONEMAP_CURVE_BLUE,
18273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                (float*)tonemap->curves[1].tonemap_points,
18283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                tonemap->tonemap_points_cnt * 2);
18293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang
18303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_TONEMAP_CURVE_RED,
18313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                (float*)tonemap->curves[2].tonemap_points,
18323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                tonemap->tonemap_points_cnt * 2);
18333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_COLOR_CORRECT_GAINS:{
18363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*)
18373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata);
18383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4);
18393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_COLOR_CORRECT_TRANSFORM:{
18423e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*)
18433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata);
18443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM,
1845d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3);
18463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              break;
18473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_PRED_COLOR_CORRECT_GAINS:{
18493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*)
18503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata);
18513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS,
1852d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       predColorCorrectionGains->gains, 4);
18533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM:{
18563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*)
18573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                   POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata);
18583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM,
18593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3);
18603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang
18623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_BLACK_LEVEL_LOCK:{
18643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t *blackLevelLock = (uint8_t*)
18653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata);
18663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1);
18673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SCENE_FLICKER:{
18703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t *sceneFlicker = (uint8_t*)
18713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata);
18723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1);
18733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_PARM_LED_MODE:
18763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          default:
18783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: This is not a valid metadata type to report to fwk, %d",
18793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                   __func__, curr_entry);
18803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       }
18823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       next_entry = GET_NEXT_PARAM_ID(curr_entry, metadata);
18833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       curr_entry = next_entry;
18843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    }
188597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
188633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
188797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
188897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
188997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
189059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
189197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
189297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
189397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
189497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
189597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
189697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
189797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
189897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
189997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
190097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
190159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
190297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
190397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
190459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
190559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
190697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
190797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
190897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
190997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
191059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
191159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
191259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
191359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
191459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
191559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
191659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
191759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
191859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
191959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
192059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
192159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
192259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
192359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
192459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
192559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
192659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
192759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
192859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
192959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
193059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
193159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
193259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
193359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
193459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
193559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
193659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
193759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
193859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
193997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
194071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
194171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
194271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
194371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
194471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
194571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
194671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
194771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
194871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
194971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
195071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
195171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
195271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
195371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
195471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
195571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
195671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
195771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
195871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
195971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
196071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
196171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
196271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
196371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
196471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
196571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
196671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
196771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
196871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
196971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
197071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
197171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
197271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
197371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
197471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
197571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
197671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
197771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
197871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
197971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
198071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
198171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
198297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
198397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
198497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
198597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
198697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
198797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
198897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
198997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
199097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
199197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
199297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
199397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
199497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
199597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
199697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
199797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
199897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
199997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
200097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
200197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
2003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
2005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
2007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
2016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
2019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
2020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
2022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2028e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
2029e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
2030e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
2031e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
2032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
2033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
2034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
2035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
2036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
2037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
2038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
2041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
2042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
2043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
2044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
2045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
2047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
2048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
2049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
2052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
2053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
2054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
2055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
2056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
2058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
2059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
2060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
2061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
2063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
2064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
2065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
2067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
2068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
2069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
2070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
2071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
2072e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
2073e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
2074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
2075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
2076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
2077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
2082662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2086662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2087662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2088662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2089662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2090662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2091662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
2092662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2093662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
2094662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2095662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
2096662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
2097662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
2098662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
2099662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
2100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
2101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
2102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
2103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
2104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
2107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
2108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
2109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
2110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
2111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
2112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
2113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
2114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
2115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
2116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
2117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
2118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
2121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
212533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
212633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
212733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
212833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
212933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
213033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
213133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
213233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
213333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
213433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
213533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
213633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
213733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
213833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
213933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
214033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
214133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
214233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
214333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
214433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
214533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
21460a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
21470a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
21480a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
21490a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
21500a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
21510a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
21520a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
21530a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
21540a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
21550a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
21560a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
21570a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
21580a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
21590a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
21600a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
21610a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
21620a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
21630a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
21640a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
21650a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
21660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
21670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
21680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
21690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
2170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
2171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
2173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
2179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
2180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
2182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
218497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
2185c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2186c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
2187c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
2188c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
2189c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
2190c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
2192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
21932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
21942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
21952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2196e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
2197e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
2198e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
2199e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
2200e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2201e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
2202e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
22042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
2205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
2207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
2208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2209c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
2210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
2211c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
2212c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
2213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
2215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
2216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
2217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
2219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
2220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
2221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
2224c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
2225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
2226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
222780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
222880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
222980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
223080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
223147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
223280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
223380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
223480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
223580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
223747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
22380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
223980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
224080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
224180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
224280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
224380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
224480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
2245c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
224680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
224780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
224880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
224980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
225080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
225180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
225280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
225380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
225480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
225580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
225665fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang    camera_metadata_rational baseGainFactor = {
225765fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang            gCamCapability[cameraId]->base_gain_factor.numerator,
225865fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang            gCamCapability[cameraId]->base_gain_factor.denominator};
225965fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang    staticInfo.update(ANDROID_SENSOR_BASE_GAIN_FACTOR,
226065fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang                      &baseGainFactor, 1);
226180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
226280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
2263c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
226480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
226547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
226680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
226780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
226880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
226980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
227022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
227122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
227280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
227380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
227422817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
227580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
227680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
227780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
2278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
227980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
228080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
228180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
228280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
228380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
228480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
228580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
228680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
228780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
228880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
22896990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                      (int*)&gCamCapability[cameraId]->max_num_roi, 1);
229080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
229180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
229280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
229380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
229480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
229580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
229680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
229747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
229880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
229980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
230080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
230180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
230280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
230380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
230480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
230580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
230680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
230780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
230880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
230980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
231080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
231122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
231222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
231322817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
23168867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
231847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
231900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
232000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
232400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2);
232500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2326e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
232700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
232800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
23290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
233047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
23310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
23320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
23330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
2334c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
2335c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
2336c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
233747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
2338c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
2339c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
2340c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
2341c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
2342c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2343c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
234447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
2345c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
2346c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
2347c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2348b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
23499443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
2350c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
2351c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
2352c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
235347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
2354c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
2355c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
2356c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
235747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
23586990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
23596990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_FULL };
2360c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
2361c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
2362c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
2363c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
236447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
2365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
2366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
2367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
2368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
2369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
237047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
237180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
237280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
237380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
237480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
237580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
2376662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
237780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
237880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2380662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
238100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                available_processed_sizes,
2382c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
2383c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2384c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
238508ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
238608ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
2387662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
238847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
238997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
239097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
239197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
239297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
239397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
239497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
239597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
239697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
239797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
239897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
239997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
240097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
240147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
24020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
2403662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
24040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
2405b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
24060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
24070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
24080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
24090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
24100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2411662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2412662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
2413662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
24140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2415662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
241647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
2417e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
24182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
2419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
24200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
2421b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
24220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
24230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
2424e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
2425e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
24262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
24270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2429e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
2431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
2433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
243447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
2435e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
2436e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
2437e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
24389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
24399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
2440e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
2441e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
2442e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
2443e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
244447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
24450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
24470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
2448b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
2449b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
24500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
24510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
24520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
24530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
24540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
2457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
24580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
246047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
24610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
24630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
2464b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
24650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
24670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
24680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
24690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
24730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
247547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
24760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
24780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
2479b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
24800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
24810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
24820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
24830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
24840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2485662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2486662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
2487662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
24880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2489662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2490a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX];
2491a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++)
2492a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava      available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i];
2493a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2494a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    staticInfo.update(ANDROID_FLASH_FIRING_POWER,
2495a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            available_flash_levels,
2496a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            gCamCapability[cameraId]->supported_flash_firing_level_cnt);
2497a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2498662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
249900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    uint8_t flashAvailable = gCamCapability[cameraId]->flash_available;
2500e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2501e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2502e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2503e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2504e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2505e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2506e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2507e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2508e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2509e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2510e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2511e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2512e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2513e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2514662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2515662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2516e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2517ea44a483c0e98200c058a85ea339457616516847Zhijun He
2518e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    int32_t sensitivity_range[2];
2519e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2520e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2521ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2522ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2523ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
25242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
252573c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
252673c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
252700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
252800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
252973c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2530e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2531e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
253273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
253300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle;
253400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_SENSOR_ORIENTATION,
253500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &sensor_orientation,
253600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
253700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
253800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t max_output_streams[3] = {1, 3, 1};
253900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
254000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      max_output_streams,
254100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      3);
254200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2543b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
25660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
25680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
25690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2576c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
25770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
25790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2580c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2581c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
25830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
25852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
25862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
25872dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
25882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
25892dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
25902dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
25912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
25922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
25932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
25942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
25952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2596e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
25979443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
25989443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
25992dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
26002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
26012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
26022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
26039443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
26049443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
26052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
26069443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2607e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
2608e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani        overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON;
26099443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
26109443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
26119443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
26129443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
26139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
26149443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
26159443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
26169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
26179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
26189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
26199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
26209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
26219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
26229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
26239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
26249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
26259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
26262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
26272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
26282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
26292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2645662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2652662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2657662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2663662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2664662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2665662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2666662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
26673fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
26683fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
26693fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
26703fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
26713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
26723fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
26733fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
26743fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
26753fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
26763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
26773fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
26783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
26793fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
26803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
26813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
26823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
26833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
26843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
26853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
26863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
26873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
26883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
26893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
26903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
26913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
26923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
26933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
26943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
26953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
26963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
26973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
26983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
26993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
27003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
27013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
27023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
27033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
27043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2705662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2706662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2707662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2710662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2712662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2713662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2714662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2715662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2716662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2717662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2718662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2721662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2722662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2723662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2724662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2725662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2726662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2727662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2728662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2729662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2730662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2731662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2732662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2733662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2734662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2735662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2737662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2738662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2739662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2740662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2741662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2743662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2744662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2745662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2746662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2747662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2748662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2749662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2751662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2752662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2753662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2754662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2755662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2756662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2757662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2758662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2759662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2760662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2761662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2762662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2763662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2764662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2765662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2766662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2767662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2768662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2769662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2771662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2773662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2774662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2775662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
27760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2777662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2778662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2780d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2781d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2782d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2784d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2785d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2786d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2787d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2788d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2789d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2790662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2791662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2792662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2794662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2796662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2801662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2802662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2803662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2804662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2805662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2806662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
28070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2809662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2810662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2811662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2812662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2813662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
28140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2815662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2816662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2817662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2818662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2844b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2868c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    info->device_version = CAMERA_DEVICE_API_VERSION_3_0;
2869b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
288697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
289697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
29006be371a43545858396aed73240eaa1259df60d2dShuzhen Wang    int32_t defaultRequestID = 0;
29016be371a43545858396aed73240eaa1259df60d2dShuzhen Wang    settings.update(ANDROID_REQUEST_ID, &defaultRequestID, 1);
2902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2924625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
29289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
29299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2947625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2948625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2949e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2950e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2951e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2952e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2953e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2954e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2955e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2956e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
29572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
29582dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
29592dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
29602dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
29612dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2966a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4;
2967a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    settings.update(ANDROID_FLASH_FIRING_POWER,
2968a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            &flashFiringLevel, 1);
2969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
297147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2974b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
297547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2976b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2977b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2978b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
29809a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
29819a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2982625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2983e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang    /* Exposure time(Update the Min Exposure Time)*/
2984e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang    int64_t default_exposure_time = gCamCapability[mCameraId]->exposure_time_range[0];
2985e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang    settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &default_exposure_time, 1);
2986e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang
298762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* frame duration */
2988f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const int64_t default_frame_duration = NSEC_PER_33MSEC;
298962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1);
299062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
299162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* sensitivity */
2992f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const int32_t default_sensitivity = 100;
299362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1);
299462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
2995f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*edge mode*/
2996f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t edge_mode = ANDROID_EDGE_MODE_HIGH_QUALITY;
2997f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_EDGE_MODE, &edge_mode, 1);
2998f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
2999f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*noise reduction mode*/
3000f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t noise_red_mode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY;
3001f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_NOISE_REDUCTION_MODE, &noise_red_mode, 1);
3002f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
3003f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*color correction mode*/
3004f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t color_correct_mode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY;
3005f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_COLOR_CORRECTION_MODE, &color_correct_mode, 1);
3006f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
3007f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*transform matrix mode*/
3008f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t tonemap_mode = ANDROID_TONEMAP_MODE_HIGH_QUALITY;
3009f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_TONEMAP_MODE, &tonemap_mode, 1);
3010f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
30114e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang    int32_t edge_strength = gCamCapability[mCameraId]->sharpness_ctrl.def_value;
30124e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang    settings.update(ANDROID_EDGE_STRENGTH, &edge_strength, 1);
30134e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang
3014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
3015e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3016e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
3018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
302180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
302280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
302380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
302480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
302580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
302680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
302762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request   : request that needs to be serviced
302834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy *   @streamTypeMask : bit mask of stream types on which buffers are requested
302980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
303080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
303180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
303280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
303362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request,
303462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                    uint32_t streamTypeMask)
303580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
303680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
303780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
303862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (request->settings == NULL && mFirstRequest) {
303980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
304080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
3041662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
304233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
3043b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
3044b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
3045b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
304633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
304762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
3048b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
304962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (rc < 0) {
305062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGE("%s: Failed to set hal version in the parameters", __func__);
305162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return BAD_VALUE;
305262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
305333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
3054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
3055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
305662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                sizeof(request->frame_number), &(request->frame_number));
3057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
3058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
3059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
3060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
306234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    /* Update stream id mask where buffers are requested */
306334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK,
306434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy                                sizeof(streamTypeMask), &streamTypeMask);
306534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
306634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: Failed to set stream type mask in the parameters", __func__);
306734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return BAD_VALUE;
306834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
306934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
307062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if(request->settings != NULL){
307162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        rc = translateMetadataToParameters(request);
307280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
307380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
3074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
307580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
307680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
307780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
307880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
307980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
308080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
308180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
308280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
308380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
308480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
308562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request  : request sent from framework
308680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
308780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
308880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
308980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
309080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
309180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
309262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                  (const camera3_capture_request_t *request)
309380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
3094662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
309597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
309662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    frame_settings = request->settings;
30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30980b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    /* Do not change the order of the following list unless you know what you are
30990b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * doing.
31000b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * The order is laid out in such a way that parameters in the front of the table
31010b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * may be used to override the parameters later in the table. Examples are:
31020b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 1. META_MODE should precede AEC/AWB/AF MODE
31030b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 2. AEC MODE should preced EXPOSURE_TIME/SENSITIVITY/FRAME_DURATION
31040b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 3. AWB_MODE should precede COLOR_CORRECTION_MODE
31050b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 4. Any mode should precede it's corresponding settings
31060b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     */
31070b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
31080b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
31090b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
31100b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(metaMode), &metaMode);
31110b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
31120b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
31130b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
31140b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
31150b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                             fwk_sceneMode);
31160b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
31170b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(sceneMode), &sceneMode);
31180b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
31190b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
31200b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
31210b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(sceneMode), &sceneMode);
31220b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
31230b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
31240b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
31250b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(sceneMode), &sceneMode);
31260b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
31270b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
31280b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
31290b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
31300b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t fwk_aeMode =
31310b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
31320b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t aeMode;
31330b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        int32_t redeye;
31340b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
31350b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
31360b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            aeMode = CAM_AE_MODE_OFF;
31370b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else {
31380b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            aeMode = CAM_AE_MODE_ON;
31390b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
31400b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
31410b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            redeye = 1;
31420b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else {
31430b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            redeye = 0;
31440b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
31450b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
31460b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
31470b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
31480b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                          fwk_aeMode);
31490b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
31500b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(aeMode), &aeMode);
31510b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
31520b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(flashMode), &flashMode);
31530b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
31540b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(redeye), &redeye);
31550b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
31560b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
31570b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
31580b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t fwk_whiteLevel =
31590b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
31600b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
31610b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(WHITE_BALANCE_MODES_MAP),
31620b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                fwk_whiteLevel);
31630b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
31640b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(whiteLevel), &whiteLevel);
31650b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
31660b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
31670b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    float focalDistance = -1.0;
31680b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
31690b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
31700b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
31710b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
31720b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(focalDistance), &focalDistance);
31730b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
31740b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
31750b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
31760b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t fwk_focusMode =
31770b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
31780b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t focusMode;
31790b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
31800b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
31810b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else{
31820b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
31830b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
31840b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                   fwk_focusMode);
31850b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
31860b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
31870b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(focusMode), &focusMode);
31880b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
31890b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
31900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
319697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
319753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
3198e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        int32_t expCompensation = frame_settings.find(
3199e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
3200fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min)
3201fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_min;
3202fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max)
3203fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_max;
320453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
320553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
320653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
320753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
32100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
32110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
32120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
32189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
32190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
32200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
32210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
322297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
32240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
32250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
32280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
32310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
32330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
32340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
32410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
32420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
32430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
32440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3247d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3248d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) {
3249d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_gains_t colorCorrectGains;
3250d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 4; i++) {
3251d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            colorCorrectGains.gains[i] =
3252d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i];
3253d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3254d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3255d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS,
3256d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectGains), &colorCorrectGains);
3257d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3258d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3259d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) {
3260d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_matrix_t colorCorrectTransform;
3261d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_rational_type_t transform_elem;
3262d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        int num = 0;
3263d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 3; i++) {
3264d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           for (int j = 0; j < 3; j++) {
3265d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.numerator =
3266d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator;
3267d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.denominator =
3268d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator;
3269d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              colorCorrectTransform.transform_matrix[i][j] = transform_elem;
3270d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              num++;
3271d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           }
3272d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3273d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3274d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM,
3275d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectTransform), &colorCorrectTransform);
3276d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3277d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3278e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
3279e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
3280e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
32812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
32822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
32832dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
32840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
32852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
32862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
32891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
32922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
32932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
32942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
32952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
32972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
32982dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
33040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
33060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
33070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
33080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
3311f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        cam_edge_application_t edge_application;
3312f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        edge_application.edge_mode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
3313f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        if (edge_application.edge_mode == CAM_EDGE_MODE_OFF) {
3314f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang            edge_application.sharpness = 0;
3315f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        } else {
33164e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang            if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
33174e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang                int32_t edgeStrength =
33184e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang                    frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
33194e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang                edge_application.sharpness = edgeStrength;
33204e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang            } else {
33214e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang                edge_application.sharpness = gCamCapability[mCameraId]->sharpness_ctrl.def_value; //default
33224e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang            }
3323f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        }
3324d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE,
3325f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang                sizeof(edge_application), &edge_application);
33260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
3328e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
33296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        int32_t respectFlashMode = 1;
33306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
33316356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t fwk_aeMode =
33326356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
33336356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
33346356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                respectFlashMode = 0;
33356356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
33366356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                    __func__);
33376356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            }
33386356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
33396356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (respectFlashMode) {
33406356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t flashMode =
33416356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
33426356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
33436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          sizeof(FLASH_MODES_MAP),
33446356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          flashMode);
33456356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
33466356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            // To check: CAM_INTF_META_FLASH_MODE usage
33476356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
33486356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                          sizeof(flashMode), &flashMode);
33496356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
3350e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
3351e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
33520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
33530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
33540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
33550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
33560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
33570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
33600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
33610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
33620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
33640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
33670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
33680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
33690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
33700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
33710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
33748867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
33750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
33760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
33780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
33790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
33820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
33830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
33840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
33850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
33860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
33890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
33900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
33910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
33920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
33930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
33960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
33970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
33980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
33990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
34000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
34030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
34040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
34050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
34060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
34070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
34080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
34110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
34120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
34138867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
34140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
34150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
34160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
34190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
34200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
34218867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
34220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
34230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
34240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
34270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
34280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
34298867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
34300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
34310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
34320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
343471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
343571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
34360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
34370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
34380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
34390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
34400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
34410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
34420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
344347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
344447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
34450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
34460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
34470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
344871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
34490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
34520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
34530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
345462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime);
34550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
34560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
34570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
34580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
34620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
346362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int64_t minFrameDuration = getMinFrameDuration(request);
346462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration);
3465e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
3466e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
346762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration);
34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
34690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
34700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
3476e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity <
3477e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
3478e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3479e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
3480e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity >
3481e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
3482e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3483e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
348462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity);
34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
34870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
34880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
34910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
34920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
34930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
34940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
34950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
34980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
35000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
35010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
35020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
35056990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t fwk_facedetectMode =
35060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
35076990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t facedetectMode =
35086990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            lookupHalName(FACEDETECT_MODES_MAP,
35096990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode);
35100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
35110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
35120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
35130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
35160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
35170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
35180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
35190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
35200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
35210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
35250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
35260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
35270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
35280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
35290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
35320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
35330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
35340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
35350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
35360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
35370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3538e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */
3539e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /*All tonemap channels will have the same number of points*/
3540e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) &&
3541e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) &&
3542e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) {
3543e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_rgb_tonemap_curves tonemapCurves;
3544e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2;
3545e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3546e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch0 = G*/
3547e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        int point = 0;
3548e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveGreen;
3549e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) {
3550d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3551e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveGreen.tonemap_points[i][j] =
3552e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point];
3553d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3554d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3555d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3556e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[0] = tonemapCurveGreen;
3557e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3558e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 1 = B */
3559e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3560e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveBlue;
3561e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3562d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3563e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveBlue.tonemap_points[i][j] =
3564e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point];
3565d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3566d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3567d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3568e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[1] = tonemapCurveBlue;
3569e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3570e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 2 = R */
3571e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3572d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_tonemap_curve_t tonemapCurveRed;
3573e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3574d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3575d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               tonemapCurveRed.tonemap_points[i][j] =
3576d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                  frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point];
3577d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3578d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3579d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3580e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[2] = tonemapCurveRed;
3581e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3582d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters,
3583e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                CAM_INTF_META_TONEMAP_CURVES,
3584e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                sizeof(tonemapCurves), &tonemapCurves);
3585d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
35860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
35880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
35890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
35900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
35910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
35920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3594d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) {
3595d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t blackLevelLock =
3596d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0];
3597d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK,
3598d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(blackLevelLock), &blackLevelLock);
3599d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3600d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3601d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) {
3602d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t lensShadingMapMode =
3603d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0];
3604d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
3605d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(lensShadingMapMode), &lensShadingMapMode);
3606d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3607d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
360859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
360959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
361071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
361162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS);
361271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
361371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
361471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
361571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
361671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
361771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
361871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
361959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
362059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
362159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
362259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
362371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
362462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS);
362571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
362671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
362771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
362871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
362971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
363071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
363171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
363259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
363359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
363459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
363559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
363671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
363762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS);
363871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
363971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
364071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
364171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
364271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
364371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
364471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
364559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
3646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
3647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
36500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
3651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
36520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
3653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
3656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
3657662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
3660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
3661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
3662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
3663662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
3664662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3665662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
36669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
36679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
36689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
36699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
36709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
36719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
36729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
36739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
36749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
36759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
3676662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
3677662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
3678662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3679662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
368097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3681662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3682662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
36830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
36840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
36850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
36860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
36870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
36880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
36900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
36910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
36920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
36931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
36940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
36960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
36970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
36980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
36990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
37000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
370108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
370208ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
37030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
37050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
37069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
37079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
37080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
37090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
37103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
37119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
37129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
37133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
37140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
37160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
37179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
37189a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
37190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
37209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
37219a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
37220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
37259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
37269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
37279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
37289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
37299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
37309a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
37319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
37329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
37339a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
37349a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
37350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37363fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
37370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
37380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
37390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
37403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
37413fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
37420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37439a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
37440b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time;
37450b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi
37460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
37470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
37480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
37490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
375053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
375153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
375253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
375353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
3754f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    mJpegSettings->sharpness = 10; //default value
3755f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    if (jpeg_settings.exists(ANDROID_EDGE_MODE)) {
3756f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        uint8_t edgeMode = jpeg_settings.find(ANDROID_EDGE_MODE).data.u8[0];
3757f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        if (edgeMode == ANDROID_EDGE_MODE_OFF) {
3758f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang            mJpegSettings->sharpness = 0;
3759f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        }
3760f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    }
376153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
37620a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
37637ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->is_jpeg_format = true;
37647ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask;
376580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
376680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
376780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
376880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
3769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
3770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
3775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
3777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
3779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
37801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3781e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
3782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
3783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
3786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
3787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
3788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
3791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
3792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
37947ee407aa1024789089aad411c372c79423699976Ajay Dudani
3795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
3797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
3799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
3804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
3805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
3809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3810d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
38181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3819d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
38201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3840d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
38471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3848d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
38491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3865d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
38721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3873d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
38741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
38889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
38899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
38909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3893d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
390297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3904d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
39189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
39199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
39209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3922d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
392380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
392480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
392580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
392680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
39279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
392880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
39299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
39301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3931d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
39321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3950d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3952e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3954e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3959d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3960e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3976625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3977d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3986d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3991c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
3992c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3993c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
3994c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3995c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
3996c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3997c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3998c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
3999c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
4000c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
4001c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush(
4002c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                const struct camera3_device *device)
4003c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
4004c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    int rc;
4005c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: E", __func__);
4006c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    QCamera3HardwareInterface *hw =
4007c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4008c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    if (!hw) {
4009c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4010c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        return -EINVAL;
4011c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    }
4012c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
4013c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    rc = hw->flush();
4014c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: X", __func__);
4015c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return rc;
4016c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
4017c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
4018c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
4019e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
4020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
4022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4023e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
4024e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4025e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4026e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
4027e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
4028e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
4029e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
4030d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4031e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
4032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
4033e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
4034e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
4035e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
4036e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
4037e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
4038e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
4039e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
4040cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
4041cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
4042cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
4043cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
4044d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
4045e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
4046e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
4047e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
40487ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
40497ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : getWaveletDenoiseProcessPlate
40507ee407aa1024789089aad411c372c79423699976Ajay Dudani *
40517ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate
40527ee407aa1024789089aad411c372c79423699976Ajay Dudani *
40537ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None
40547ee407aa1024789089aad411c372c79423699976Ajay Dudani *
40557ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : WNR prcocess plate vlaue
40567ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
40577ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate()
40587ee407aa1024789089aad411c372c79423699976Ajay Dudani{
40597ee407aa1024789089aad411c372c79423699976Ajay Dudani    char prop[PROPERTY_VALUE_MAX];
40607ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(prop, 0, sizeof(prop));
40617ee407aa1024789089aad411c372c79423699976Ajay Dudani    property_get("persist.denoise.process.plates", prop, "0");
40627ee407aa1024789089aad411c372c79423699976Ajay Dudani    int processPlate = atoi(prop);
40637ee407aa1024789089aad411c372c79423699976Ajay Dudani    switch(processPlate) {
40647ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 0:
40657ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
40667ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 1:
40677ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_CBCR_ONLY;
40687ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 2:
40697ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
40707ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 3:
40717ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
40727ee407aa1024789089aad411c372c79423699976Ajay Dudani    default:
40737ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
40747ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
40757ee407aa1024789089aad411c372c79423699976Ajay Dudani}
40767ee407aa1024789089aad411c372c79423699976Ajay Dudani
40777ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
40787ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : needRotationReprocess
40797ee407aa1024789089aad411c372c79423699976Ajay Dudani *
40807ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp
40817ee407aa1024789089aad411c372c79423699976Ajay Dudani *
40827ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none
40837ee407aa1024789089aad411c372c79423699976Ajay Dudani *
40847ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : true: needed
40857ee407aa1024789089aad411c372c79423699976Ajay Dudani *              false: no need
40867ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
40877ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess()
40887ee407aa1024789089aad411c372c79423699976Ajay Dudani{
40897ee407aa1024789089aad411c372c79423699976Ajay Dudani
40907ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (!mJpegSettings->is_jpeg_format) {
40917ee407aa1024789089aad411c372c79423699976Ajay Dudani        // RAW image, no need to reprocess
40927ee407aa1024789089aad411c372c79423699976Ajay Dudani        return false;
40937ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
40947ee407aa1024789089aad411c372c79423699976Ajay Dudani
40957ee407aa1024789089aad411c372c79423699976Ajay Dudani    if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
40967ee407aa1024789089aad411c372c79423699976Ajay Dudani        mJpegSettings->jpeg_orientation > 0) {
40977ee407aa1024789089aad411c372c79423699976Ajay Dudani        // current rotation is not zero, and pp has the capability to process rotation
40987ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGD("%s: need do reprocess for rotation", __func__);
40997ee407aa1024789089aad411c372c79423699976Ajay Dudani        return true;
41007ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
41017ee407aa1024789089aad411c372c79423699976Ajay Dudani
41027ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
41037ee407aa1024789089aad411c372c79423699976Ajay Dudani}
41047ee407aa1024789089aad411c372c79423699976Ajay Dudani
41057ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
4106c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION   : needReprocess
4107c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
4108c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed
4109c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
4110c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none
4111c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
4112c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN     : true: needed
4113c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *              false: no need
4114c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/
4115c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess()
4116c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{
4117c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if (!mJpegSettings->is_jpeg_format) {
4118c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // RAW image, no need to reprocess
4119c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return false;
4120c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
4121c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
4122c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if ((mJpegSettings->min_required_pp_mask > 0) ||
4123c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan         isWNREnabled()) {
4124c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // TODO: add for ZSL HDR later
4125c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
4126c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
4127c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return true;
4128c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
4129c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    return needRotationReprocess();
4130c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan}
4131c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
4132c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*===========================================================================
41337ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : addOnlineReprocChannel
41347ee407aa1024789089aad411c372c79423699976Ajay Dudani *
41357ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
41367ee407aa1024789089aad411c372c79423699976Ajay Dudani *              coming from input channel
41377ee407aa1024789089aad411c372c79423699976Ajay Dudani *
41387ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS :
41397ee407aa1024789089aad411c372c79423699976Ajay Dudani *   @pInputChannel : ptr to input channel whose frames will be post-processed
41407ee407aa1024789089aad411c372c79423699976Ajay Dudani *
41417ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : Ptr to the newly created channel obj. NULL if failed.
41427ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
41437ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel(
4144d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle)
41457ee407aa1024789089aad411c372c79423699976Ajay Dudani{
41467ee407aa1024789089aad411c372c79423699976Ajay Dudani    int32_t rc = NO_ERROR;
41477ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCamera3ReprocessChannel *pChannel = NULL;
41487ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (pInputChannel == NULL) {
41497ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: input channel obj is NULL", __func__);
41507ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
41517ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
41527ee407aa1024789089aad411c372c79423699976Ajay Dudani
41537ee407aa1024789089aad411c372c79423699976Ajay Dudani    pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
41547ee407aa1024789089aad411c372c79423699976Ajay Dudani            mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle);
41557ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (NULL == pChannel) {
41567ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: no mem for reprocess channel", __func__);
41577ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
41587ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
41597ee407aa1024789089aad411c372c79423699976Ajay Dudani
41607ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Capture channel, only need snapshot and postview streams start together
41617ee407aa1024789089aad411c372c79423699976Ajay Dudani    mm_camera_channel_attr_t attr;
41627ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
41637ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
41647ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue();
41657ee407aa1024789089aad411c372c79423699976Ajay Dudani    rc = pChannel->initialize();
41667ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
41677ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
41687ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
41697ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
41707ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
41717ee407aa1024789089aad411c372c79423699976Ajay Dudani
41727ee407aa1024789089aad411c372c79423699976Ajay Dudani    // pp feature config
41737ee407aa1024789089aad411c372c79423699976Ajay Dudani    cam_pp_feature_config_t pp_config;
41747ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
41757ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
41767ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
4177f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        pp_config.sharpness = mJpegSettings->sharpness;
41787ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
41797ee407aa1024789089aad411c372c79423699976Ajay Dudani
41807ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (isWNREnabled()) {
41817ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
41827ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.denoise_enable = 1;
41837ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate();
41847ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
41857ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (needRotationReprocess()) {
41867ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
41877ee407aa1024789089aad411c372c79423699976Ajay Dudani        int rotation = mJpegSettings->jpeg_orientation;
41887ee407aa1024789089aad411c372c79423699976Ajay Dudani        if (rotation == 0) {
41897ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_0;
41907ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 90) {
41917ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_90;
41927ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 180) {
41937ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_180;
41947ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 270) {
41957ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_270;
41967ee407aa1024789089aad411c372c79423699976Ajay Dudani        }
41977ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
41987ee407aa1024789089aad411c372c79423699976Ajay Dudani
41997ee407aa1024789089aad411c372c79423699976Ajay Dudani   rc = pChannel->addReprocStreamsFromSource(pp_config,
42007ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             pInputChannel,
42017ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             mMetadataChannel);
42027ee407aa1024789089aad411c372c79423699976Ajay Dudani
42037ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
42047ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
42057ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
42067ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
42077ee407aa1024789089aad411c372c79423699976Ajay Dudani    return pChannel;
42087ee407aa1024789089aad411c372c79423699976Ajay Dudani}
42097ee407aa1024789089aad411c372c79423699976Ajay Dudani
42107ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue()
42117ee407aa1024789089aad411c372c79423699976Ajay Dudani{
42127ee407aa1024789089aad411c372c79423699976Ajay Dudani    return gCamCapability[mCameraId]->min_num_pp_bufs;
42137ee407aa1024789089aad411c372c79423699976Ajay Dudani}
42147ee407aa1024789089aad411c372c79423699976Ajay Dudani
4215acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() {
4216acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan    return gCamCapability[mCameraId]->isWnrSupported;
4217acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan}
4218acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan
4219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
4220