QCamera3HWI.cpp revision dd60b0cec98a84145dd88747b5cb642da3123802
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[] = {
8634296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang    { ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY,  CAM_SCENE_MODE_OFF },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
10197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
105b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
121e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
122e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
124e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
125e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
1306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE },
1316356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH }
132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1346990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = {
1356990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,    CAM_FACE_DETECT_MODE_OFF     },
1366990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL,   CAM_FACE_DETECT_MODE_FULL    }
1376990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang};
1386990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang
13908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
14008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
150c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    flush:                              QCamera3HardwareInterface::flush,
151c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    reserved:                           {0},
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
154f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftabint QCamera3HardwareInterface::kMaxInFlight = 5;
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
170cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
17197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
1747ee407aa1024789089aad411c372c79423699976Ajay Dudani      mPictureChannel(NULL),
17533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
17633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
17733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
17899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      mJpegSettings(NULL),
1798bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani      mIsZslMode(false),
18062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinProcessedFrameDuration(0),
18162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinJpegFrameDuration(0),
18262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinRawFrameDuration(0),
183dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab      m_pPowerModule(NULL),
184dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab      mHdrHint(false)
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
187e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1927ee407aa1024789089aad411c372c79423699976Ajay Dudani    // TODO: hardcode for now until mctl add support for min_num_pp_bufs
1937ee407aa1024789089aad411c372c79423699976Ajay Dudani    //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3
1947ee407aa1024789089aad411c372c79423699976Ajay Dudani    gCamCapability[cameraId]->min_num_pp_bufs = 3;
1959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
19874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
199e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
20033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
20133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
20233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
20399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
20499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
20599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
20699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
20799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
20899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
21466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
222d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
223d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
224d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        /*flush the metadata list*/
225d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
226d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
227d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
228d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
229d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
230d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
231d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
232d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
2331fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang
2341fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang    // NOTE: 'camera3_stream_t *' objects are already freed at
2351fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang    //        this stage by the framework
2361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2381fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang        QCamera3Channel *channel = (*it)->channel;
2391fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang        if (channel) {
2401fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang            channel->stop();
2411fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang        }
242d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
2431fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang
244d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
245d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
2461fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang        QCamera3Channel *channel = (*it)->channel;
2470f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang        if ((*it)->registered && (*it)->buffer_set.buffers) {
2480f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang             delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
2490f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang        }
250dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
251dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
2557ee407aa1024789089aad411c372c79423699976Ajay Dudani    mPictureChannel = NULL;
2567ee407aa1024789089aad411c372c79423699976Ajay Dudani
25797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
25897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
25997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
26097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
261dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
262dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
263dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
2644e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang        if (mMetadataChannel) {
2654e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang            mMetadataChannel->stop();
2664e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang            delete mMetadataChannel;
2674e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang            mMetadataChannel = NULL;
2684e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang        }
269dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
270dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
271dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
272cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
273cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
274e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
27533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
27633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
27733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
27833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
279e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
280e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
281e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
282d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
300cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
301cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
302cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
303cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
304249d8d801ab218ff4920e57fdd4ccf17e1626057Zhijun He        return -EUSERS;
305cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
306cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
313cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
315cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
316cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
318cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
31999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
32099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == 0) {
32199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
32299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
32399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
32499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=1");
32599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
32699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
32799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
32899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
329cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
38099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
38199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == NO_ERROR) {
38299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
38399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
384dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                if(mHdrHint == true) {
385dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                    m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
386dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                            (void *)"state=3");
387dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                    mHdrHint = false;
388dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                }
38999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
39099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=0");
39199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
39299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
39399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
39499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
39599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
415e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
416e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
41733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
41833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
41933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
42033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
42133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
4229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
423e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
424e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
425cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
4269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
4279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
4289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
429e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
4309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
44833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
449d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    mIsZslMode = false;
45062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang
451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
471d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
472d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
47562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (mMetadataChannel) {
47662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        /* If content of mStreamInfo is not 0, there is metadata stream */
47762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        mMetadataChannel->stop();
47862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
47962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang
480dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#ifdef HAS_MULTIMEDIA_HINTS
481dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab    if(mHdrHint == true) {
482dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab        if (m_pPowerModule) {
483dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab            if (m_pPowerModule->powerHint) {
484dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
485dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                        (void *)"state=3");
486dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                mHdrHint = false;
487dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab            }
488dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab        }
489dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab    }
490dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#endif
491dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab
49262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    pthread_mutex_lock(&mMutex);
49362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang
49462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    camera3_stream_t *inputStream = NULL;
49562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    camera3_stream_t *jpegStream = NULL;
49662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    cam_stream_size_info_t stream_config_info;
497d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
500c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
501c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
502c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
5030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
5051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
5081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
5091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
5121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
5131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
5141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
5151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
5161fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang                (*it)->channel = NULL;
5170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
5180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
5200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
5210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
5220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
5230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
5240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
5251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
5261fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang            stream_info->channel = NULL;
5270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
5280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
529c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
530c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
533e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
538c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
539c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
540c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
5440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
5451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
55762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (mMetadataChannel) {
55862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        delete mMetadataChannel;
55962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        mMetadataChannel = NULL;
56062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
56262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    //Create metadata channel and initialize it
56362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
56462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang                    mCameraHandle->ops, captureResultCb,
56562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang                    &gCamCapability[mCameraId]->padding_info, this);
56662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (mMetadataChannel == NULL) {
56762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
56862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        rc = -ENOMEM;
56962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        pthread_mutex_unlock(&mMutex);
57062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        return rc;
57162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
57262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    rc = mMetadataChannel->initialize();
57362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    if (rc < 0) {
57462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        ALOGE("%s: metadata channel initialization failed", __func__);
57562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        delete mMetadataChannel;
576f49d780c0f2fc137a3463e06537706d8829d6da5Shuzhen Wang        mMetadataChannel = NULL;
57762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        pthread_mutex_unlock(&mMutex);
57862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        return rc;
57962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang    }
580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
584dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang        uint32_t stream_usage = newStream->usage;
585d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        stream_config_info.stream_sizes[i].width = newStream->width;
586d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        stream_config_info.stream_sizes[i].height = newStream->height;
587d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
588d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && jpegStream){
589d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            //for zsl stream the size is jpeg size
590d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            stream_config_info.stream_sizes[i].width = jpegStream->width;
591d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            stream_config_info.stream_sizes[i].height = jpegStream->height;
592dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang            stream_config_info.type[i] = CAM_STREAM_TYPE_SNAPSHOT;
593dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang        } else {
594dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           //for non zsl streams find out the format
595dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           switch (newStream->format) {
596dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED :
597dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              {
598dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                 if (stream_usage & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER) {
599dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                    stream_config_info.type[i] = CAM_STREAM_TYPE_VIDEO;
600dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                 } else {
601dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                    stream_config_info.type[i] = CAM_STREAM_TYPE_PREVIEW;
602dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang                 }
603dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              }
604dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
605dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           case HAL_PIXEL_FORMAT_YCbCr_420_888:
606dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              stream_config_info.type[i] = CAM_STREAM_TYPE_CALLBACK;
607dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#ifdef HAS_MULTIMEDIA_HINTS
608dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab              if (m_pPowerModule) {
609dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                  if (m_pPowerModule->powerHint) {
610dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                      m_pPowerModule->powerHint(m_pPowerModule,
611dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                          POWER_HINT_VIDEO_ENCODE, (void *)"state=2");
612dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                      mHdrHint = true;
613dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab                  }
614dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab              }
615dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#endif
616dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
617dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           case HAL_PIXEL_FORMAT_BLOB:
618dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              stream_config_info.type[i] = CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT;
619dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
620dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           default:
621dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              stream_config_info.type[i] = CAM_STREAM_TYPE_DEFAULT;
622dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang              break;
623dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang           }
624d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        }
625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
628f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
629f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
630f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
631f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
632f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
633f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
634f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
635f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
636c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                /* For video encoding stream, set read/write rarely
637c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                 * flag so that they may be set to un-cached */
638c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER)
639c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage =
640c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         (GRALLOC_USAGE_SW_READ_RARELY |
641c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_SW_WRITE_RARELY |
642c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_HW_CAMERA_WRITE);
643c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                else
644c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
645f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
646f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
647f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
648f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
6521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
655f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
6568867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
657f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
658c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
659c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
660c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
661c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
6628bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
663c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
664c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
665c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
666c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
667c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
668c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
669f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
670f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
671f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
672f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
673f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
674f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
675f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
676f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
677f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
678f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
679f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
680f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
6817ee407aa1024789089aad411c372c79423699976Ajay Dudani                    mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle,
682f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
683f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
6847ee407aa1024789089aad411c372c79423699976Ajay Dudani                    if (mPictureChannel == NULL) {
685f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
686f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
687f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
688f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
6897ee407aa1024789089aad411c372c79423699976Ajay Dudani                    newStream->priv = (QCamera3Channel*)mPictureChannel;
690f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
691f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
692f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
693f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
694f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
695f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
6981fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang
6991fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang            for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
7001fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang                    it != mStreamInfo.end(); it++) {
7011fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang                if ((*it)->stream == newStream) {
7021fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang                    (*it)->channel = (QCamera3Channel*) newStream->priv;
7031fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang                    break;
7041fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang                }
7051fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang            }
706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
711bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang
712bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
713bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    stream_config_info.num_streams = streamList->num_streams;
714bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang
715bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    // settings/parameters don't carry over for new configureStreams
716bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
717bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang
718bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
719bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
720bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang                sizeof(hal_version), &hal_version);
721bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang
722bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_INFO,
723bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang                sizeof(stream_config_info), &stream_config_info);
724bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang
725bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
726bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang
7278867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
7281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
7291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
7301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
7311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
7321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
7331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
7341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
7351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
7361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
7371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
7381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
7391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
7401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
7411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
742a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
743e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
7440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
7461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
7471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
7481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
7491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
7501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
7511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
7521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
7530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
7541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
7551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
7561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
7571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
75845465b8d86296ba7aeeb1ee4f9ba07b4bddf1652Shuzhen Wang    mPendingFrameDropList.clear();
75945465b8d86296ba7aeeb1ee4f9ba07b4bddf1652Shuzhen Wang
760d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    /*flush the metadata list*/
761d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
762d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
763d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
764d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
765d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
766d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
767d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
768d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
769d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
77033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
77133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
77262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Get min frame duration for this streams configuration
77362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    deriveMinFrameDuration();
77462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
775e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
77633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
780e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
78380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
78480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
78580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
78680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
78780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
78880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
78980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
7919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
79280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
7939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
7949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
7959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
7989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
7999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
8049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
8059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
8069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
8079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
8089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
8099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
8119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
8129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
8139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
8149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
816c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
817c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
818c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
819c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
820c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
821c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
822c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
823c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
824c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
825c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
826c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
827c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
828c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
829c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
830c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
831c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
832c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
833c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
834c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
835c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
836c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
837c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
838c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
8399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
8429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
8439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
8449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
8459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
8469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
8479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
8489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
8529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
8539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
8579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
8589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
8629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
8639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
8649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
8659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
8679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
8689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
8699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
87462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : deriveMinFrameDuration
87562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
87662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based
87762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              on currently configured streams.
87862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
87962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE
88062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
88162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : NONE
88262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
88362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
88462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration()
88562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
88662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t maxJpegDimension, maxProcessedDimension;
88762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
88862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxJpegDimension = 0;
88962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxProcessedDimension = 0;
89062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
89162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    // Figure out maximum jpeg, processed, and raw dimensions
89262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (List<stream_info_t*>::iterator it = mStreamInfo.begin();
89362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        it != mStreamInfo.end(); it++) {
89462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
89562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        // Input stream doesn't have valid stream_type
89662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT)
89762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            continue;
89862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
89962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int32_t dimension = (*it)->stream->width * (*it)->stream->height;
90062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) {
90162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxJpegDimension)
90262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxJpegDimension = dimension;
90362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) {
90462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxProcessedDimension)
90562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxProcessedDimension = dimension;
90662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
90762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
90862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
90962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Assume all jpeg dimensions are in processed dimensions.
91062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (maxJpegDimension > maxProcessedDimension)
91162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        maxProcessedDimension = maxJpegDimension;
91262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
91362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Find minimum durations for processed, jpeg, and raw
91462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration;
91562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
91662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (maxProcessedDimension ==
91762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].width *
91862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].height) {
91962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
92062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
92162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            break;
92262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
92362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
92462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
92562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
92662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
92762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : getMinFrameDuration
92862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
92962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations
93062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              and current request configuration.
93162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
93262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks
93362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
93462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : min farme duration for a particular request
93562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
93662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
93762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request)
93862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
93962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    bool hasJpegStream = false;
94062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (uint32_t i = 0; i < request->num_output_buffers; i ++) {
94162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        const camera3_stream_t *stream = request->output_buffers[i].stream;
94262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (stream->format == HAL_PIXEL_FORMAT_BLOB)
94362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            hasJpegStream = true;
94462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
94562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
94662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (!hasJpegStream)
94762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration);
94862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    else
94962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration);
95062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
95162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
95262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
953cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * FUNCTION   : handleMetadataWithLock
954cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
955cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * DESCRIPTION: Handles metadata buffer callback with mMutex lock held.
956cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
957cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * PARAMETERS : @metadata_buf: metadata buffer
958cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
959cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * RETURN     :
960cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
961cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *==========================================================================*/
962cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangvoid QCamera3HardwareInterface::handleMetadataWithLock(
963cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    mm_camera_super_buf_t *metadata_buf)
964cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang{
965cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
966cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    int32_t frame_number_valid = *(int32_t *)
967cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
968cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    uint32_t pending_requests = *(uint32_t *)POINTER_OF(
969cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        CAM_INTF_META_PENDING_REQUESTS, metadata);
970cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    uint32_t frame_number = *(uint32_t *)
971cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
972cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    const struct timeval *tv = (const struct timeval *)
973cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
974cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
975cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        tv->tv_usec * NSEC_PER_USEC;
976cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    cam_frame_dropped_t cam_frame_drop = *(cam_frame_dropped_t *)
977cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        POINTER_OF(CAM_INTF_META_FRAME_DROPPED, metadata);
978cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
979cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    if (!frame_number_valid) {
980cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
981cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        mMetadataChannel->bufDone(metadata_buf);
982cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        free(metadata_buf);
983cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        goto done_metadata;
984cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    }
985cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
986cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            frame_number, capture_time);
987cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
988cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    // Go through the pending requests info and send shutter/results to frameworks
989cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
990cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
991cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        camera3_capture_result_t result;
992cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        camera3_notify_msg_t notify_msg;
993cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
994cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
995cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // Flush out all entries with less or equal frame numbers.
996cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
997cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        //TODO: Make sure shutter timestamp really reflects shutter timestamp.
998cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        //Right now it's the same as metadata timestamp
999cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1000cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        //TODO: When there is metadata drop, how do we derive the timestamp of
1001cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        //dropped frames? For now, we fake the dropped timestamp by substracting
1002cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        //from the reported timestamp
1003cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        nsecs_t current_capture_time = capture_time -
1004cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1005cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1006cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // Send shutter notify to frameworks
1007cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        notify_msg.type = CAMERA3_MSG_SHUTTER;
1008cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        notify_msg.message.shutter.frame_number = i->frame_number;
1009cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        notify_msg.message.shutter.timestamp = current_capture_time;
1010cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        mCallbackOps->notify(mCallbackOps, &notify_msg);
1011cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1012cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                i->frame_number, capture_time);
1013f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab        mPendingRequest--;
1014cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1015cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // Check whether any stream buffer corresponding to this is dropped or not
1016cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // If dropped, then send the ERROR_BUFFER for the corresponding stream
1017cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        if (cam_frame_drop.frame_dropped) {
1018cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            camera3_notify_msg_t notify_msg;
1019cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1020cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    j != i->buffers.end(); j++) {
1021cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                QCamera3Channel *channel = (QCamera3Channel *)j->stream->priv;
1022cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                uint32_t streamTypeMask = channel->getStreamTypeMask();
1023cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                if (streamTypeMask & cam_frame_drop.stream_type_mask) {
1024cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    // Send Error notify to frameworks with CAMERA3_MSG_ERROR_BUFFER
1025cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    ALOGV("%s: Start of reporting error frame#=%d, streamMask=%d",
1026cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                           __func__, i->frame_number, streamTypeMask);
1027cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    notify_msg.type = CAMERA3_MSG_ERROR;
1028cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    notify_msg.message.error.frame_number = i->frame_number;
1029cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    notify_msg.message.error.error_code = CAMERA3_MSG_ERROR_BUFFER ;
1030cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    notify_msg.message.error.error_stream = j->stream;
1031cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    mCallbackOps->notify(mCallbackOps, &notify_msg);
1032cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    ALOGV("%s: End of reporting error frame#=%d, streamMask=%d",
1033cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                           __func__, i->frame_number, streamTypeMask);
1034cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    PendingFrameDropInfo PendingFrameDrop;
1035cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    PendingFrameDrop.frame_number=i->frame_number;
1036cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    PendingFrameDrop.stream_type_mask = cam_frame_drop.stream_type_mask;
1037cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    // Add the Frame drop info to mPendingFrameDropList
1038cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    mPendingFrameDropList.push_back(PendingFrameDrop);
1039cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                }
1040cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1041cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1042cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1043cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // Send empty metadata with already filled buffers for dropped metadata
1044cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // and send valid metadata with already filled buffers for current metadata
1045cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        if (i->frame_number < frame_number) {
1046cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            CameraMetadata dummyMetadata;
1047cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1048cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    &current_capture_time, 1);
1049cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            dummyMetadata.update(ANDROID_REQUEST_ID,
1050cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    &(i->request_id), 1);
1051cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            result.result = dummyMetadata.release();
1052cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        } else {
1053cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            result.result = translateCbMetadataToResultMetadata(metadata,
1054cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    current_capture_time, i->request_id, i->blob_request,
1055cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    &(i->input_jpeg_settings));
1056cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            if (mIsZslMode) {
1057cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                int found_metadata = 0;
1058cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                //for ZSL case store the metadata buffer and corresp. ZSL handle ptr
1059cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1060cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    j != i->buffers.end(); j++) {
1061cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1062cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        //check if corresp. zsl already exists in the stored metadata list
1063cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1064cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                m != mStoredMetadataList.begin(); m++) {
1065cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            if (m->frame_number == frame_number) {
1066cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                m->meta_buf = metadata_buf;
1067cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                found_metadata = 1;
1068cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                break;
1069cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            }
1070cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        }
1071cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        if (!found_metadata) {
1072cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            MetadataBufferInfo store_meta_info;
1073cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            store_meta_info.meta_buf = metadata_buf;
1074cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            store_meta_info.frame_number = frame_number;
1075cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            mStoredMetadataList.push_back(store_meta_info);
1076cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            found_metadata = 1;
1077cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        }
1078cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    }
1079cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                }
1080cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                if (!found_metadata) {
1081cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    if (!i->input_buffer_present && i->blob_request) {
1082cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        //livesnapshot or fallback non-zsl snapshot case
1083cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1084cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                j != i->buffers.end(); j++){
1085cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT &&
1086cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                j->stream->format == HAL_PIXEL_FORMAT_BLOB) {
1087cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
1088cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                break;
1089cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            }
1090cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        }
1091cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    } else {
1092cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        //return the metadata immediately
1093cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        mMetadataChannel->bufDone(metadata_buf);
1094cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        free(metadata_buf);
1095cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    }
1096cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                }
1097cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            } else if (!mIsZslMode && i->blob_request) {
1098cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                //If it is a blob request then send the metadata to the picture channel
1099cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
1100cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            } else {
1101cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                // Return metadata buffer
1102cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                mMetadataChannel->bufDone(metadata_buf);
1103cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                free(metadata_buf);
1104cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1105cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1106cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        if (!result.result) {
1107cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            ALOGE("%s: metadata is NULL", __func__);
1108cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1109cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        result.frame_number = i->frame_number;
1110cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        result.num_output_buffers = 0;
1111cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        result.output_buffers = NULL;
1112cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1113cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    j != i->buffers.end(); j++) {
1114cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            if (j->buffer) {
1115cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                result.num_output_buffers++;
1116cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1117cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1118cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1119cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        if (result.num_output_buffers > 0) {
1120cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            camera3_stream_buffer_t *result_buffers =
1121cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                new camera3_stream_buffer_t[result.num_output_buffers];
1122cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            if (!result_buffers) {
1123cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                ALOGE("%s: Fatal error: out of memory", __func__);
1124cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1125cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            size_t result_buffers_idx = 0;
1126cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1127cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    j != i->buffers.end(); j++) {
1128cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                if (j->buffer) {
1129cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    for (List<PendingFrameDropInfo>::iterator m = mPendingFrameDropList.begin();
1130cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            m != mPendingFrameDropList.end(); m++) {
1131cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        QCamera3Channel *channel = (QCamera3Channel *)j->buffer->stream->priv;
1132cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        uint32_t streamTypeMask = channel->getStreamTypeMask();
1133cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        if((m->stream_type_mask & streamTypeMask) &&
1134cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                (m->frame_number==frame_number)) {
1135cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            j->buffer->status=CAMERA3_BUFFER_STATUS_ERROR;
1136cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            ALOGV("%s: Stream STATUS_ERROR frame_number=%d, streamTypeMask=%d",
1137cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                                  __func__, frame_number, streamTypeMask);
1138cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            m = mPendingFrameDropList.erase(m);
1139cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            break;
1140cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        }
1141cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    }
1142cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    result_buffers[result_buffers_idx++] = *(j->buffer);
1143cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    free(j->buffer);
1144cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    j->buffer = NULL;
1145cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    mPendingBuffersMap.editValueFor(j->stream)--;
1146cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                }
1147cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1148cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            result.output_buffers = result_buffers;
1149cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1150cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
1151cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1152cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    __func__, result.frame_number, current_capture_time);
1153cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            free_camera_metadata((camera_metadata_t *)result.result);
1154cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            delete[] result_buffers;
1155cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        } else {
1156cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
1157cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1158cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        __func__, result.frame_number, current_capture_time);
1159cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            free_camera_metadata((camera_metadata_t *)result.result);
1160cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1161cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // erase the element from the list
1162cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        i = mPendingRequestsList.erase(i);
1163cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    }
1164cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1165cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangdone_metadata:
1166cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    if (!pending_requests)
1167cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        unblockRequestIfNecessary();
1168cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1169cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang}
1170cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1171cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang/*===========================================================================
1172cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * FUNCTION   : handleBufferWithLock
1173cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1174cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * DESCRIPTION: Handles image buffer callback with mMutex lock held.
1175cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1176cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * PARAMETERS : @buffer: image buffer for the callback
1177cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *              @frame_number: frame number of the image buffer
1178cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1179cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * RETURN     :
1180cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1181cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *==========================================================================*/
1182cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangvoid QCamera3HardwareInterface::handleBufferWithLock(
1183cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    camera3_stream_buffer_t *buffer, uint32_t frame_number)
1184cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang{
1185cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    // If the frame number doesn't exist in the pending request list,
1186cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    // directly send the buffer to the frameworks, and update pending buffers map
1187cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    // Otherwise, book-keep the buffer.
1188cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1189cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
1190cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        i++;
1191cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    }
1192cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    if (i == mPendingRequestsList.end()) {
1193cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // Verify all pending requests frame_numbers are greater
1194cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1195cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                j != mPendingRequestsList.end(); j++) {
1196cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            if (j->frame_number < frame_number) {
1197cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                ALOGE("%s: Error: pending frame number %d is smaller than %d",
1198cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        __func__, j->frame_number, frame_number);
1199cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1200cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1201cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        camera3_capture_result_t result;
1202cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        result.result = NULL;
1203cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        result.frame_number = frame_number;
1204cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        result.num_output_buffers = 1;
1205cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        for (List<PendingFrameDropInfo>::iterator m = mPendingFrameDropList.begin();
1206cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                m != mPendingFrameDropList.end(); m++) {
1207cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            QCamera3Channel *channel = (QCamera3Channel *)buffer->stream->priv;
1208cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            uint32_t streamTypeMask = channel->getStreamTypeMask();
1209cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            if((m->stream_type_mask & streamTypeMask) &&
1210cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                (m->frame_number==frame_number) ) {
1211cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                buffer->status=CAMERA3_BUFFER_STATUS_ERROR;
1212cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                ALOGV("%s: Stream STATUS_ERROR frame_number=%d, streamTypeMask=%d",
1213cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                        __func__, frame_number, streamTypeMask);
1214cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                m = mPendingFrameDropList.erase(m);
1215cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                break;
1216cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1217cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1218cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        result.output_buffers = buffer;
1219cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        ALOGV("%s: result frame_number = %d, buffer = %p",
1220cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                __func__, frame_number, buffer);
1221cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        mPendingBuffersMap.editValueFor(buffer->stream)--;
1222cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1223cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            int found = 0;
1224cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin();
1225cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                k != mStoredMetadataList.end(); k++) {
1226cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                if (k->frame_number == frame_number) {
1227cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    k->zsl_buf_hdl = buffer->buffer;
1228cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    found = 1;
1229cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    break;
1230cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                }
1231cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1232cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            if (!found) {
1233cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                MetadataBufferInfo meta_info;
1234cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                meta_info.frame_number = frame_number;
1235cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                meta_info.zsl_buf_hdl = buffer->buffer;
1236cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                mStoredMetadataList.push_back(meta_info);
1237cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1238cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1239cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        mCallbackOps->process_capture_result(mCallbackOps, &result);
1240cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    } else {
1241cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1242cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                j != i->buffers.end(); j++) {
1243cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            if (j->stream == buffer->stream) {
1244cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                if (j->buffer != NULL) {
1245cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    ALOGE("%s: Error: buffer is already set", __func__);
1246cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                } else {
1247cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    j->buffer = (camera3_stream_buffer_t *)malloc(
1248cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            sizeof(camera3_stream_buffer_t));
1249cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    *(j->buffer) = *buffer;
1250cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                    ALOGV("%s: cache buffer %p at result frame_number %d",
1251cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                            __func__, buffer, frame_number);
1252cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang                }
1253cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            }
1254cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1255cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    }
1256cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang}
1257cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1258cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang/*===========================================================================
1259cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * FUNCTION   : unblockRequestIfNecessary
1260cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1261cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * DESCRIPTION: Unblock capture_request if max_buffer hasn't been reached. Note
1262cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *              that mMutex is held when this function is called.
1263cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1264cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * PARAMETERS :
1265cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1266cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * RETURN     :
1267cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *
1268cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *==========================================================================*/
1269cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangvoid QCamera3HardwareInterface::unblockRequestIfNecessary()
1270cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang{
1271cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    bool max_buffers_dequeued = false;
1272cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
1273cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1274cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
1275cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        if (queued_buffers == stream->max_buffers) {
1276cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            max_buffers_dequeued = true;
1277cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang            break;
1278cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        }
1279cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    }
1280cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    if (!max_buffers_dequeued) {
1281cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        // Unblock process_capture_request
1282cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        pthread_cond_signal(&mRequestCond);
1283cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    }
1284cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang}
1285cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang
1286cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang/*===========================================================================
1287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
1288e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1289e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
1290e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1291e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1292e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
1293e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1294e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1295e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1296e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1297e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
1298e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
1299e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
1301e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1302e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1303e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1304e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
1305e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
1306e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
1307e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
1308e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
1310e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
1311e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
1312e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
1313e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
1315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
1316e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
1317e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
1318e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1319e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
1320e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
1321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
1322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
1323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
1326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
1327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
13280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
13291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
13301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
13311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
13320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
13361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
13370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
13380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
13390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
13400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
13410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
13430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
13441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
13450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
13460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
1347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
1348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
1349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
1350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
1351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
1352e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1353e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1355e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
1356e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1357e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1358e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1359e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
1360e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1361e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
1362e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1363e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1364e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
1365e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1366e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1367e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
1370e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
1371e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
137374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
1374e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
1375d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    MetadataBufferInfo reproc_meta;
1376d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    int queueMetadata = 0;
1377e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1378e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1379e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
13802123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    rc = validateCaptureRequest(request);
13812123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    if (rc != NO_ERROR) {
13822123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
13832123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        pthread_mutex_unlock(&mMutex);
13842123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        return rc;
13852123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    }
13862123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
13872123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    meta = request->settings;
13882123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
13892123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // For first capture request, send capture intent, and
13902123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // stream on all streams
1391d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    if (mFirstRequest) {
13922123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
13932123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
13942123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            int32_t hal_version = CAM_HAL_V3;
13952123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            uint8_t captureIntent =
13962123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
13972123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
13982123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            memset(mParameters, 0, sizeof(parm_buffer_t));
13992123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
14002123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
14012123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(hal_version), &hal_version);
14022123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
14032123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(captureIntent), &captureIntent);
14042123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mCameraHandle->ops->set_parms(mCameraHandle->camera_handle,
14052123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                mParameters);
14062123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        }
14072123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
140862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang        mMetadataChannel->start();
1409d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
1410d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            it != mStreamInfo.end(); it++) {
1411d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
1412d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            channel->start();
1413d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        }
1414d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    }
1415d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang
1416e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
141734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    uint32_t streamTypeMask = 0;
14189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
141974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
142074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
142174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
1422013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
142374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
142474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
142574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
142674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
142774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
1428013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
142974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
143074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
143174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
1432ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev    ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
1433c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
1434c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
1435c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
1436c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
1437e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
14387ee407aa1024789089aad411c372c79423699976Ajay Dudani    int blob_request = 0;
1439e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
1440e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
144134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1442e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
144366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
144466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
144566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
14467ee407aa1024789089aad411c372c79423699976Ajay Dudani            blob_request = 1;
144766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
144866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
14490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
145066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
145166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
145266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
145366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
145466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
1455e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
1456e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
1457e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
1458e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
1459e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
1460e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
146134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        streamTypeMask |= channel->getStreamTypeMask();
146234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
146334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
146462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = setFrameParameters(request, streamTypeMask);
146534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
146634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: fail to set frame parameters", __func__);
146734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        pthread_mutex_unlock(&mMutex);
146834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return rc;
1469e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1470e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
14711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
14721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
14731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
14741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
147574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
14767ee407aa1024789089aad411c372c79423699976Ajay Dudani    pendingRequest.blob_request = blob_request;
147717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab    if (blob_request)
147817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        pendingRequest.input_jpeg_settings = *mJpegSettings;
147913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0;
148074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
14811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
14821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
14831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
14841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
14851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
14861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
14871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
14881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
14891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
14901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
14919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
1492e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
14939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
14949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
14959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
14969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
14979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1498c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
149966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
15009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
15019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
15029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
15039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
15049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
150566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
1506c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
1507c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
1508c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
1509c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
1510c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
1511c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
1512c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
1513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
1514c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
1515c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
1516c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
1517c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
1518c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
1519c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
1520c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
152141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                    ALOGD("Handle:%p", request->input_buffer->buffer);
1522d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    //TODO: need to get corresponding metadata and send it to pproc
1523d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1524d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         m != mStoredMetadataList.end(); m++) {
1525d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->input_buffer->buffer) {
1526d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            reproc_meta.meta_buf = m->meta_buf;
1527d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            queueMetadata = 1;
1528d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1529d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1530d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1531c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
1532c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
1533c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
1534c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
1535d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (queueMetadata) {
153641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false);
1537d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
153866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
1539ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
1540a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
1541d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1542d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1543d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                     m != mStoredMetadataList.end(); m++) {
1544d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (uint32_t j = 0; j < request->num_output_buffers; j++) {
1545d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->output_buffers[j].buffer) {
1546d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mMetadataChannel->bufDone(m->meta_buf);
1547d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            free(m->meta_buf);
1548d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            m = mStoredMetadataList.erase(m);
1549d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1550d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1551d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1552d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1553d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
155466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
155566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
15569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
15579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
15589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
15599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
15601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
15619770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    // Added a timed condition wait
15629770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    struct timespec ts;
15639770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    uint8_t isValidTimeout = 1;
15649770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    rc = clock_gettime(CLOCK_REALTIME, &ts);
15659770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    if (rc < 0) {
15669770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        isValidTimeout = 0;
15679770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        ALOGE("%s: Error reading the real time clock!!", __func__);
15689770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    }
15699770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    else {
15709770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        // Make timeout as 5 sec for request to be honored
15719770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        ts.tv_sec += 5;
15729770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab    }
15739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
1574f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab    mPendingRequest++;
1575f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab    do {
15769770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        if (!isValidTimeout) {
15779770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            ALOGV("%s: Blocking on conditional wait", __func__);
15789770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            pthread_cond_wait(&mRequestCond, &mMutex);
15799770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        }
15809770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        else {
15819770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            ALOGV("%s: Blocking on timed conditional wait", __func__);
15829770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            rc = pthread_cond_timedwait(&mRequestCond, &mMutex, &ts);
15839770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            if (rc == ETIMEDOUT) {
15849770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab                rc = -ENODEV;
15859770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab                ALOGE("%s: Unblocked on timeout!!!!", __func__);
15869770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab                break;
15879770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab            }
15889770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        }
15899770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab        ALOGV("%s: Unblocked", __func__);
1590f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab    }while (mPendingRequest >= kMaxInFlight);
15919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1592e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
15931fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang
159480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
159580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
159680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
15979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
1598e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
15999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
1600e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
16019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
16029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
1603e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1604e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1605e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1606e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1607b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
1608b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
1609e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1610e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
1611e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1612e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1613e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1614e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1615e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1616e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1617e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1618e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1619e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1620e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
1621e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1622e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
1623e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1624e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1625e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1626e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1627e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1628e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1629b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
1630e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1631e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
1632e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1636e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1638e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1640c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
1641c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
1642c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1643c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
1644c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1645c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
1646c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1647c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1648c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
1649c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
1650c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush()
1651c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
1652c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*Enable lock when we implement this function*/
1653c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*
1654c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_lock(&mMutex);
1655c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
1656c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_unlock(&mMutex);
1657c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    */
1658c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return 0;
1659c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
16607ee407aa1024789089aad411c372c79423699976Ajay Dudani
1661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
1663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
166433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
166533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
1666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
166933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
167033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
16719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
16729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
16739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
16741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
16769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
16775b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_lock(&mMutex);
1678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1679cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    if (metadata_buf)
1680cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        handleMetadataWithLock(metadata_buf);
1681cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang    else
1682cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang        handleBufferWithLock(buffer, frame_number);
168333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
16845b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_unlock(&mMutex);
16859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
16869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
16879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
168897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
168997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
169097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
169197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
169297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
169397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
169497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
169597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
169697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
169797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
169897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
169997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
170097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
170174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
170217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab                                 int32_t request_id, int32_t BlobRequest,
170317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab                                 jpeg_settings_t* inputjpegsettings)
170497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
170597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
170697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
170797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
17080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
170974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
171097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
171117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab    // Update the JPEG related info
171217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab    if (BlobRequest) {
171317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        camMetadata.update(ANDROID_JPEG_ORIENTATION, &(inputjpegsettings->jpeg_orientation), 1);
171417c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        camMetadata.update(ANDROID_JPEG_QUALITY, &(inputjpegsettings->jpeg_quality), 1);
171517c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab
171617c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        int32_t thumbnailSizeTable[2];
171717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        thumbnailSizeTable[0] = inputjpegsettings->thumbnail_size.width;
171817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        thumbnailSizeTable[1] = inputjpegsettings->thumbnail_size.height;
171917c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        camMetadata.update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSizeTable, 2);
172017c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        ALOGV("%s: Orien=%d, quality=%d wid=%d, height=%d", __func__, inputjpegsettings->jpeg_orientation,
172117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab               inputjpegsettings->jpeg_quality,thumbnailSizeTable[0], thumbnailSizeTable[1]);
172217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab
172317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        if (inputjpegsettings->gps_coordinates[0]) {
172417c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            double gpsCoordinates[3];
172517c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            gpsCoordinates[0]=*(inputjpegsettings->gps_coordinates[0]);
172617c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            gpsCoordinates[1]=*(inputjpegsettings->gps_coordinates[1]);
172717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            gpsCoordinates[2]=*(inputjpegsettings->gps_coordinates[2]);
172817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            camMetadata.update(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3);
172917c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            ALOGV("%s: gpsCoordinates[0]=%f, 1=%f 2=%f", __func__, gpsCoordinates[0],
173017c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab                 gpsCoordinates[1],gpsCoordinates[2]);
173117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        }
173217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab
173317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        if (inputjpegsettings->gps_timestamp) {
173417c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            camMetadata.update(ANDROID_JPEG_GPS_TIMESTAMP, inputjpegsettings->gps_timestamp, 1);
173517c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            ALOGV("%s: gps_timestamp=%lld", __func__, *(inputjpegsettings->gps_timestamp));
173617c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        }
173717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab
173817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        String8 str(inputjpegsettings->gps_processing_method);
173917c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        if (strlen(mJpegSettings->gps_processing_method) > 0) {
174017c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab            camMetadata.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, str);
174117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab        }
174217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab    }
17433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    uint8_t curr_entry = GET_FIRST_PARAM_ID(metadata);
17443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    uint8_t next_entry;
17453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    while (curr_entry != CAM_INTF_PARM_MAX) {
17463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       switch (curr_entry) {
17473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_FACE_DETECTION:{
17483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_face_detection_data_t *faceDetectionInfo =
17493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (cam_face_detection_data_t *)POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
17503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t numFaces = faceDetectionInfo->num_faces_detected;
1751514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             int32_t faceIds[MAX_ROI];
1752514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             uint8_t faceScores[MAX_ROI];
1753514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             int32_t faceRectangles[MAX_ROI * 4];
1754514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             int32_t faceLandmarks[MAX_ROI * 6];
17553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int j = 0, k = 0;
17563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             for (int i = 0; i < numFaces; i++) {
17573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 faceIds[i] = faceDetectionInfo->faces[i].face_id;
17583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 faceScores[i] = faceDetectionInfo->faces[i].score;
17593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 convertToRegions(faceDetectionInfo->faces[i].face_boundary,
17603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                         faceRectangles+j, -1);
17613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
17623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 j+= 4;
17633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 k+= 6;
17643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             }
1765514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang
1766514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             if (numFaces <= 0) {
1767514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang                memset(faceIds, 0, sizeof(int32_t) * MAX_ROI);
1768514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang                memset(faceScores, 0, sizeof(uint8_t) * MAX_ROI);
1769514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang                memset(faceRectangles, 0, sizeof(int32_t) * MAX_ROI * 4);
1770514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang                memset(faceLandmarks, 0, sizeof(int32_t) * MAX_ROI * 6);
17713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             }
1772514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang
1773514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
1774514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
1775514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
1776514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang               faceRectangles, numFaces*4);
1777514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang             camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
1778514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang               faceLandmarks, numFaces*6);
1779514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang
17803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang            break;
17813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang            }
17823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_COLOR_CORRECT_MODE:{
17833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *color_correct_mode =
17843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                           (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
17853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
17863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_AEC_PRECAPTURE_ID: {
17893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t  *ae_precapture_id =
17903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                     (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
17913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
17923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
17933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
17943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang         case CAM_INTF_META_AEC_ROI: {
17953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang            cam_area_t  *hAeRegions =
17963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
17973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t aeRegions[5];
17983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
17993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
18003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AEC_STATE:{
18033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t *ae_state =
18043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
18053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
18063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_PARM_FOCUS_MODE:{
18093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *focusMode =
18103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
1811867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang             uint8_t fwkAfMode = lookupFwkName(FOCUS_MODES_MAP,
1812867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang                 sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), *focusMode);
1813867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1);
18143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AF_ROI:{
18173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             /*af regions*/
18183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_area_t  *hAfRegions =
18193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
18203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t afRegions[5];
18213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
18223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
18233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AF_STATE: {
18263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
18273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
18283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AF_TRIGGER_ID: {
18313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t  *afTriggerId =
18323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
18333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
18343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_PARM_WHITE_BALANCE: {
18373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               uint8_t  *whiteBalance =
18383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
1839867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang               uint8_t fwkWhiteBalanceMode = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1840867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang                   sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
1841867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang                   *whiteBalance);
1842867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang               camMetadata.update(ANDROID_CONTROL_AWB_MODE, &fwkWhiteBalanceMode, 1);
18433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
18443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AWB_REGIONS: {
18463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             /*awb regions*/
18473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_area_t  *hAwbRegions =
18483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
18493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t awbRegions[5];
18503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
18513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
18523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_AWB_STATE: {
18553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *whiteBalanceState =
18563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
18573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
18583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_MODE: {
18613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
18623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
18633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_EDGE_MODE: {
18669bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             cam_edge_application_t  *edgeApplication =
18679bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                (cam_edge_application_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata);
18689bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             uint8_t edgeStrength = (uint8_t)edgeApplication->sharpness;
18699bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             camMetadata.update(ANDROID_EDGE_MODE, &(edgeApplication->edge_mode), 1);
18709bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             camMetadata.update(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
18713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_FLASH_POWER: {
18743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *flashPower =
18753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
18763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
18773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_FLASH_FIRING_TIME: {
18803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int64_t  *flashFiringTime =
18813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
18823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
18833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
18853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_FLASH_STATE: {
18863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *flashState =
18873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
18883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
18893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
18903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
1891d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang          case CAM_INTF_META_FLASH_MODE:{
1892d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang             uint8_t *flashMode = (uint8_t*)
1893d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang                 POINTER_OF(CAM_INTF_META_FLASH_MODE, metadata);
1894d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang             camMetadata.update(ANDROID_FLASH_MODE, flashMode, 1);
1895d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang             break;
1896d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang          }
18973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_HOTPIXEL_MODE: {
18983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              uint8_t  *hotPixelMode =
18993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                 (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
19003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
19013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              break;
19023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_APERTURE:{
19043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *lensAperture =
19053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
19063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
19073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FILTERDENSITY: {
19103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *filterDensity =
19113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
19123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
19133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FOCAL_LENGTH:{
19163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *focalLength =
19173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
19183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
19193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FOCUS_DISTANCE: {
19223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *focusDistance =
19233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
19243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
19253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_FOCUS_RANGE: {
19283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             float  *focusRange =
19293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
193032d9e5ad33dd580b6273aac830ef99f913a0ce0bAjay Dudani             camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 2);
1931b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang             break;
1932b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang          }
1933b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang          case CAM_INTF_META_LENS_STATE: {
1934b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang             uint8_t *lensState = (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_STATE, metadata);
1935b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang             camMetadata.update(ANDROID_LENS_STATE , lensState, 1);
1936b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang             break;
19373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_OPT_STAB_MODE: {
19393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *opticalStab =
19403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
19413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
1942b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang             break;
19433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_NOISE_REDUCTION_MODE: {
19453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *noiseRedMode =
19463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
19473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
19483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19509bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab          case CAM_INTF_META_NOISE_REDUCTION_STRENGTH: {
19519bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             uint8_t  *noiseRedStrength =
19529bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_STRENGTH, metadata);
19539bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             camMetadata.update(ANDROID_NOISE_REDUCTION_STRENGTH, noiseRedStrength, 1);
19549bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             break;
19559bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab          }
19563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SCALER_CROP_REGION: {
19573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
19583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
19593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t scalerCropRegion[4];
19603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[0] = hScalerCropRegion->left;
19613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[1] = hScalerCropRegion->top;
19623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[2] = hScalerCropRegion->width;
19633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             scalerCropRegion[3] = hScalerCropRegion->height;
19643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
19653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SENSOR_EXPOSURE_TIME:{
19683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int64_t  *sensorExpTime =
19693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
19703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             mMetadataResponse.exposure_time = *sensorExpTime;
19713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime);
19723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
19733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SENSOR_FRAME_DURATION:{
19763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int64_t  *sensorFameDuration =
19773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
19783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration);
19793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
19803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SENSOR_SENSITIVITY:{
19833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             int32_t  *sensorSensitivity =
19843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
19853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity);
19863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             mMetadataResponse.iso_speed = *sensorSensitivity;
19873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
19883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SHADING_MODE: {
19913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *shadingMode =
19923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
19933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
19943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
19953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
19963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_FACEDETECT_MODE: {
19973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *faceDetectMode =
19983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
19993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP,
20003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                                        sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]),
20013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                                        *faceDetectMode);
20023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1);
20033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_HISTOGRAM_MODE: {
20063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t  *histogramMode =
20073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
20083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
20093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_SHARPNESS_MAP_MODE:{
20123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               uint8_t  *sharpnessMapMode =
20133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                  (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
20143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
20153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  sharpnessMapMode, 1);
20163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
20173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang           }
20183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_STATS_SHARPNESS_MAP:{
20193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
20203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
20213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
20223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  (int32_t*)sharpnessMap->sharpness,
20233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
20243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
20253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_LENS_SHADING_MAP: {
20273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *)
20283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata);
20293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height;
20303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               int map_width  = gCamCapability[mCameraId]->lens_shading_map_size.width;
20313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP,
20323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  (float*)lensShadingMap->lens_shading,
20333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  4*map_width*map_height);
20343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               break;
20353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_TONEMAP_CURVES:{
20373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             //Populate CAM_INTF_META_TONEMAP_CURVES
20383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             /* ch0 = G, ch 1 = B, ch 2 = R*/
20393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_rgb_tonemap_curves *tonemap = (cam_rgb_tonemap_curves *)
20403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_TONEMAP_CURVES, metadata);
20413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_TONEMAP_CURVE_GREEN,
20423e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                (float*)tonemap->curves[0].tonemap_points,
20433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                tonemap->tonemap_points_cnt * 2);
20443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang
20453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_TONEMAP_CURVE_BLUE,
20463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                (float*)tonemap->curves[1].tonemap_points,
20473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                tonemap->tonemap_points_cnt * 2);
20483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang
20493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_TONEMAP_CURVE_RED,
20503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                (float*)tonemap->curves[2].tonemap_points,
20513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                tonemap->tonemap_points_cnt * 2);
20523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_COLOR_CORRECT_GAINS:{
20553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*)
20563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata);
20573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4);
20583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_COLOR_CORRECT_TRANSFORM:{
20613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*)
20623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata);
20633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM,
2064d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3);
20653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang              break;
20663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_PRED_COLOR_CORRECT_GAINS:{
20683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*)
20693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata);
20703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS,
2071d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       predColorCorrectionGains->gains, 4);
20723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM:{
20753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*)
20763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                   POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata);
20773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM,
20783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                                  (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3);
20793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang
20813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_BLACK_LEVEL_LOCK:{
20833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t *blackLevelLock = (uint8_t*)
20843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang               POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata);
20853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1);
20863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_META_SCENE_FLICKER:{
20893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             uint8_t *sceneFlicker = (uint8_t*)
20903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata);
20913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1);
20923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          }
20943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          case CAM_INTF_PARM_LED_MODE:
20953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
20969bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab          case CAM_INTF_PARM_EFFECT: {
20979bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             uint8_t *effectMode = (uint8_t*)
20989bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                  POINTER_OF(CAM_INTF_PARM_EFFECT, metadata);
20999bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             uint8_t fwk_effectMode = lookupFwkName(EFFECT_MODES_MAP,
21009bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                                                    sizeof(EFFECT_MODES_MAP),
21019bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                                                    *effectMode);
21029bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             camMetadata.update(ANDROID_CONTROL_EFFECT_MODE, &fwk_effectMode, 1);
21039bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab             break;
21049bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab          }
21053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang          default:
21063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             ALOGV("%s: This is not a valid metadata type to report to fwk, %d",
21073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang                   __func__, curr_entry);
21083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang             break;
21093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       }
21103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       next_entry = GET_NEXT_PARAM_ID(curr_entry, metadata);
21113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang       curr_entry = next_entry;
21123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang    }
211397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
211433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
211597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
211697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
211797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
211859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
211997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
212097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
212197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
212297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
212397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
212497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
212597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
212697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
212797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
212897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
212959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
213097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
213197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
213259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
213359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
213497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
213597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
213697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
213797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
213859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
213959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
214059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
214159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
214259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
214359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
214459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
214559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
214659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
214759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
214859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
214959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
215059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
215159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
215259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
215359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
215459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
215559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
215659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
215759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
215859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
215959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
216059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
216159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
216259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
216359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
216459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
216559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
216659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
216797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
216871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
216971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
217071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
217171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
217271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
217371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
217471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
217571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
217671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
217771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
217871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
217971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
218071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
218171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
218271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
218371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
2184f57748033ad578a1c790668e97ce64530004a3b6Mansoor Aftab    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->left;
2185f57748033ad578a1c790668e97ce64530004a3b6Mansoor Aftab    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->top;
218671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
218771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
218871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
218971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
219071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
219171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
219271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
219371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
219471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
219571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
219671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
219771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
219871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
219971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
220071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
220171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
220271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
220371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
220471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
220571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
220671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
220771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
220871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
220971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
221097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
221197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
221297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
221397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
221497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
221597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
221697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
221797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
221897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
221997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
222097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
222197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
222297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
222397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
2224bb733216b5176a06b2db8f3ee165cb3a8d21babcShuzhen Wang    landmarks[2] = face.right_eye_center.x;
222597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
222697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
222797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
222897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
222997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
2230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
2231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
2233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
2235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
2244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
2247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
2248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
2250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
2251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
2252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
2254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2256e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
2257e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
2258e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
2259e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
2260e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
2261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
2262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
2263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
2264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
2265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
2266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
2269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
2270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
2271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
2272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
2273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
2274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
2275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
2276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
2277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
2280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
2281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
2282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
2283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
2284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
2286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
2287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
2288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
2289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
2291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
2292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
2293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
2295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
2296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
2297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
2298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
2299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
2300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
2301e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
2302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
2303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
2304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
2305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2311662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2318662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
2326662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
2327662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
2328662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
2332662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
2335662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
2336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
2337662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
2338662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
2339662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
2340662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
2341662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
2342662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
2343662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
2344662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
2345662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
2346662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2347662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2348662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
2349662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2350662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2351662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2352662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
235333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
235433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
235533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
235633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
235733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
235833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
235933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
236033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
236133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
236233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
236333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
236433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
236533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
236633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
236733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
236833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
236933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
237033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
237133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
237233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
237333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
23740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
23750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
23760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
23770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
23780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
23790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
23800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
23810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
23820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
23830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
23840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
23850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
23860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
23870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
23880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
23890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
23900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
23910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
23920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
23930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
23940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
23950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
23960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
23970a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
2407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
2408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
241297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
2413c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2414c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
2415c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
2416c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
2417c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
2418c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
2420662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
24212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
24222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
24232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2424e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
2425e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
2426e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
2427e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
2428e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2429e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
2430e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2437c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
2439c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
2440c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
2443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
2447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
2452c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
2453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
2454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
245580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
245680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
245780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
245880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
245947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
246080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
246180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
246280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
246380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
2464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
246547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
246780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
246880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
246980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
247080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
247180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
247280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
2473c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
247480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
247580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
247680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
247780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
247880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
247980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
248080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
248180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
248280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
248380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
248465fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang    camera_metadata_rational baseGainFactor = {
248565fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang            gCamCapability[cameraId]->base_gain_factor.numerator,
248665fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang            gCamCapability[cameraId]->base_gain_factor.denominator};
248765fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang    staticInfo.update(ANDROID_SENSOR_BASE_GAIN_FACTOR,
248865fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang                      &baseGainFactor, 1);
248980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
249080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
2491c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
249280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
249347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
249480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
249580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
249680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
249780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
249822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
249922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
250080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
250180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
250222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
250380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
250480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
250580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
2506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
250780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
250880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
250980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
251080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
251180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
251280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
251380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
251480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
251580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
251680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
25176990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                      (int*)&gCamCapability[cameraId]->max_num_roi, 1);
251880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
251980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
252080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
252180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
252280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
252380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
252480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
252547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
252680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
252780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
252880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
252980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
253080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
253180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
253280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
253380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
253480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
253580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
253680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
253780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
253880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
253922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
254022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
254122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
25448867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
254647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
254700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
254800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
255200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2);
255300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2554e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
255500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
255600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
255847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
25600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
25610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
2562c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
2563c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
2564c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
256547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
2566c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
2567c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
2568c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
2569c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
2570c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2571c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
257247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
2573c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
2574c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
2575c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2576b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
25779443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
2578c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
2579c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
2580c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
258147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
2582c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
2583c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
2584c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
258547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
25866990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
25876990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_FULL };
2588c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
2589c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
2590c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
2591c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
259247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
259380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
259480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
259580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
259680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
259780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
2598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
259980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
260080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
2601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
260300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                available_processed_sizes,
2604c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
2605c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2606c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
260708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
260808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
261047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
261197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
261297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
261397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
261497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
261597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
261697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
261797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
261897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
261997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
262097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
262197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
262297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
262347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
2625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
2627b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
2635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
263847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
2639e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
26402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
2641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
2643b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
2646e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
2647e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
26482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2651e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2652662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
2653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
26542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
2655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
265647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
2657e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
2658e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
2659e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
26609443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
26619443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
2662e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
2663e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
2664e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
2665e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
266647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
26670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2668662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
2670b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
2671b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
26730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
26760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2677662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2678662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
2679662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
26800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2681662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
268247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
26830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2684662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
2686b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
26880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
26890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
26900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
26910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2692662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2693662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
2694662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
26950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
269747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2699662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
27000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
2701b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
27020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
27030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
27040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
27050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
27060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2707662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
2709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
27100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2712a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX];
2713a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++)
2714a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava      available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i];
2715a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2716a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    staticInfo.update(ANDROID_FLASH_FIRING_POWER,
2717a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            available_flash_levels,
2718a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            gCamCapability[cameraId]->supported_flash_firing_level_cnt);
2719a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
272100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    uint8_t flashAvailable = gCamCapability[cameraId]->flash_available;
2722e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2723e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2724e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2725e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2726e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2727e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2728e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2729e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2730e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2731e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2732e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2733e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2734e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2735e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2737662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2738e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2739ea44a483c0e98200c058a85ea339457616516847Zhijun He
2740e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    int32_t sensitivity_range[2];
2741e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2742e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2743ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2744ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2745ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
27462dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
274773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
274873c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
274900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
275000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
275173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2752e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2753e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
275473c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
275500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle;
275600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_SENSOR_ORIENTATION,
275700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &sensor_orientation,
275800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
275900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
276000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t max_output_streams[3] = {1, 3, 1};
276100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
276200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      max_output_streams,
276300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      3);
276400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2765b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2771662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2773662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2774662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2775662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2776662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2777662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2778662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2780662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2781662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2782662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2785662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2786662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2787662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2798c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2802c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2803c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
28040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
28050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
28072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
28082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
28092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
28102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
28112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
28122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
28132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
28142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
28152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
28162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
28172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2818e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
28199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
28209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
28212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
28222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
28232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
28242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
28259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
28269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
28272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
28289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2829e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
2830e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani        overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON;
28319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
28329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
28339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
28349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
28359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
28369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
28379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
28389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
28399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
28409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
28419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
28429443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
28439443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
28449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
28459443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
28469443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
28479443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
28482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
28492dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
28502dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
28512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2852662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2853662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2855662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2856662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2857662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2858662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2859662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2860662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2861662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2862662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2863662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2864662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2865662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2866662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2867662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2869662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2875662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2878662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2879662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2880662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2881662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
28893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
28903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
28913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
28923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
28933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
28943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
28953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
28963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
28973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
28983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
28993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
29003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
29013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
29023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
29033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
29043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
29053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
29063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
29073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
29083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
29093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
29103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
29113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
29123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
29133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
29143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
29153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
29163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
29173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
29183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
29193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
29203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
29213fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
29223fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
29233fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
29243fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
29253fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
29263fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2946662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2947662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2948662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2950662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2953662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2955662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2956662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2957662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2958662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2968662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2969662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2970662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2971662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2972662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2981662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2984662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2985662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2986662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2987662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2988662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2989662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2994662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2996662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
29980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2999662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
3000662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3001662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3002d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
3003d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
3004d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
3005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3006d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
3007d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
3008d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
3009d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
3010d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
3011d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
3012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
3015662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
3016662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3017662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
3018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
3019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
3021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
3022662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
3023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
3024662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3025662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
3026662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
3027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
3028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
30290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
3030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
3031662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
3033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
3034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
3035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
30360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
3037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
3038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
3041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
3042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
3044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
3047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
3048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
3050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
3051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
3052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
3054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
3055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
3057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
3059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
3060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
3061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
3062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
3063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
3064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3066b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
3067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
3068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
3069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
3070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
3071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3073625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
3074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
3075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
3076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
3079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
3080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
3083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
3084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
3085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
3090c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    info->device_version = CAMERA_DEVICE_API_VERSION_3_0;
3091b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
3092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
3094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
3098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
3100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
3102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
3105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
3106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
310897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
3109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3110e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
3111e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
3113e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
3114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
3115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
3117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
311897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
3121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
31226be371a43545858396aed73240eaa1259df60d2dShuzhen Wang    int32_t defaultRequestID = 0;
31236be371a43545858396aed73240eaa1259df60d2dShuzhen Wang    settings.update(ANDROID_REQUEST_ID, &defaultRequestID, 1);
3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
3126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
3128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
3129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
3130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
3131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
3133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
3134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
3136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
3137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
3139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
3140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
3143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
3149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
31509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
31519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
3155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
3157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
3158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
3160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
3161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
3163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
3164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
3166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
3167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
316834296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY;
3169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
3170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3171e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
3172e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
3173e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
3174e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
3175e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
3176e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
3177e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
3178e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
31792dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
31802dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
31812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
31822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
31832dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
3184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
3185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
3186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
3187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3188a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4;
3189a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    settings.update(ANDROID_FLASH_FIRING_POWER,
3190a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            &flashFiringLevel, 1);
3191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
319347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
3194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
3195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3196b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
319747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
3198b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
3199b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
3200b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
3201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
32029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
32039a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
3204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3205e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang    /* Exposure time(Update the Min Exposure Time)*/
3206e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang    int64_t default_exposure_time = gCamCapability[mCameraId]->exposure_time_range[0];
3207e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang    settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &default_exposure_time, 1);
3208e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang
320962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* frame duration */
3210f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const int64_t default_frame_duration = NSEC_PER_33MSEC;
321162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1);
321262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
321362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* sensitivity */
3214f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const int32_t default_sensitivity = 100;
321562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1);
321662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
3217f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*edge mode*/
3218f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t edge_mode = ANDROID_EDGE_MODE_HIGH_QUALITY;
3219f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_EDGE_MODE, &edge_mode, 1);
3220f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
3221f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*noise reduction mode*/
3222f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t noise_red_mode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY;
3223f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_NOISE_REDUCTION_MODE, &noise_red_mode, 1);
3224f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
3225f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*color correction mode*/
3226f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t color_correct_mode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY;
3227f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_COLOR_CORRECTION_MODE, &color_correct_mode, 1);
3228f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
3229f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    /*transform matrix mode*/
3230f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    static const uint8_t tonemap_mode = ANDROID_TONEMAP_MODE_HIGH_QUALITY;
3231f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    settings.update(ANDROID_TONEMAP_MODE, &tonemap_mode, 1);
3232f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang
32339bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab    uint8_t edge_strength = (uint8_t)gCamCapability[mCameraId]->sharpness_ctrl.def_value;
32344e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang    settings.update(ANDROID_EDGE_STRENGTH, &edge_strength, 1);
32354e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang
32368bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    int32_t scaler_crop_region[4];
32378bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    scaler_crop_region[0] = 0;
32388bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    scaler_crop_region[1] = 0;
32398bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    scaler_crop_region[2] = gCamCapability[mCameraId]->active_array_size.width;
32408bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    scaler_crop_region[3] = gCamCapability[mCameraId]->active_array_size.height;
32418bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    settings.update(ANDROID_SCALER_CROP_REGION, scaler_crop_region, 4);
32428bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang
32438bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    static const uint8_t antibanding_mode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ;
32448bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    settings.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &antibanding_mode, 1);
32458bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang
32468bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    static const uint8_t vs_mode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
32478bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    settings.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vs_mode, 1);
32488bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang
32498bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    uint8_t opt_stab_mode = (gCamCapability[mCameraId]->optical_stab_modes_count == 2)?
32508bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang                             ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON :
32518bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang                             ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
32528bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang    settings.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &opt_stab_mode, 1);
32538bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang
3254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
3255e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3256e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
3258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
326180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
326280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
326380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
326480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
326580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
326680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
326762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request   : request that needs to be serviced
326834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy *   @streamTypeMask : bit mask of stream types on which buffers are requested
326980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
327080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
327180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
327280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
327362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request,
327462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                    uint32_t streamTypeMask)
327580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
327680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
327780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
327862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (request->settings == NULL && mFirstRequest) {
327980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
328080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
3281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
328233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
3283b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
3284b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
3285b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
328633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
328762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
3288b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
328962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (rc < 0) {
329062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGE("%s: Failed to set hal version in the parameters", __func__);
329162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return BAD_VALUE;
329262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
329333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
3294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
3295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
329662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                sizeof(request->frame_number), &(request->frame_number));
3297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
3298662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
3299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
3300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
330234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    /* Update stream id mask where buffers are requested */
330334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK,
330434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy                                sizeof(streamTypeMask), &streamTypeMask);
330534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
330634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: Failed to set stream type mask in the parameters", __func__);
330734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return BAD_VALUE;
330834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
330934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
331062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if(request->settings != NULL){
331162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        rc = translateMetadataToParameters(request);
331280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
331380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
3314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
331580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
331680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
331780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
331880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
331980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
332080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
332180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
332280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
332380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
332480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
332562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request  : request sent from framework
332680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
332780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
332880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
332980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
333080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
333180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
333262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                  (const camera3_capture_request_t *request)
333380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
3334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
333597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
333662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    frame_settings = request->settings;
33370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33380b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    /* Do not change the order of the following list unless you know what you are
33390b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * doing.
33400b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * The order is laid out in such a way that parameters in the front of the table
33410b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * may be used to override the parameters later in the table. Examples are:
33420b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 1. META_MODE should precede AEC/AWB/AF MODE
33430b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 2. AEC MODE should preced EXPOSURE_TIME/SENSITIVITY/FRAME_DURATION
33440b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 3. AWB_MODE should precede COLOR_CORRECTION_MODE
33450b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     * 4. Any mode should precede it's corresponding settings
33460b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang     */
33470b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
33480b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
33490b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
33500b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(metaMode), &metaMode);
33510b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
33520b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
33530b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
33540b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
33550b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                             fwk_sceneMode);
33560b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
33570b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(sceneMode), &sceneMode);
33580b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
335934296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang           uint8_t sceneMode = CAM_SCENE_MODE_OFF;
33600b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
33610b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(sceneMode), &sceneMode);
33620b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
336334296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang           uint8_t sceneMode = CAM_SCENE_MODE_OFF;
33640b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
33650b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(sceneMode), &sceneMode);
33660b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
33670b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
33680b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
33690b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
33700b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t fwk_aeMode =
33710b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
33720b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t aeMode;
33730b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        int32_t redeye;
33740b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
33750b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
33760b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            aeMode = CAM_AE_MODE_OFF;
33770b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else {
33780b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            aeMode = CAM_AE_MODE_ON;
33790b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
33800b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
33810b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            redeye = 1;
33820b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else {
33830b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            redeye = 0;
33840b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
33850b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
33860b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
33870b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
33880b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                          fwk_aeMode);
33890b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
33900b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(aeMode), &aeMode);
33910b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
33920b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(flashMode), &flashMode);
33930b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
33940b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(redeye), &redeye);
33950b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
33960b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
33970b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
33980b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t fwk_whiteLevel =
33990b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
34000b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
34010b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(WHITE_BALANCE_MODES_MAP),
34020b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                fwk_whiteLevel);
34030b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
34040b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(whiteLevel), &whiteLevel);
34050b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
34060b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
34070b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    float focalDistance = -1.0;
34080b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
34090b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
34100b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
34110b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
34120b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(focalDistance), &focalDistance);
34130b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
34140b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
34150b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
34160b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t fwk_focusMode =
34170b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
34180b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        uint8_t focusMode;
34190b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
34200b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
34210b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        } else{
34220b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
34230b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
34240b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                                   fwk_focusMode);
34250b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        }
34260b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
34270b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang                sizeof(focusMode), &focusMode);
34280b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang    }
34290b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang
34300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
34310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
34320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
34330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
34340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
34350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
343697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
343753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
3438e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        int32_t expCompensation = frame_settings.find(
3439e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
3440fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min)
3441fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_min;
3442fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max)
3443fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_max;
344453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
344553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
344653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
344753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
34480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
34490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
34500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
34510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
34520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
34540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
34550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
34560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
34570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
34589443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
34590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
346297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
34630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
34640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
34650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
34660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
34670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
34760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
34770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
34780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
34800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
34810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
34820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
34830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
34840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3487d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3488d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) {
3489d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_gains_t colorCorrectGains;
3490d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 4; i++) {
3491d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            colorCorrectGains.gains[i] =
3492d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i];
3493d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3494d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3495d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS,
3496d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectGains), &colorCorrectGains);
3497d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3498d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3499d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) {
3500d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_matrix_t colorCorrectTransform;
3501d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_rational_type_t transform_elem;
3502d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        int num = 0;
3503d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 3; i++) {
3504d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           for (int j = 0; j < 3; j++) {
3505d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.numerator =
3506d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator;
3507d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.denominator =
3508d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator;
3509d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              colorCorrectTransform.transform_matrix[i][j] = transform_elem;
3510d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              num++;
3511d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           }
3512d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3513d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3514d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM,
3515d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectTransform), &colorCorrectTransform);
3516d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3517d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3518e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
3519e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
3520e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
35212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
35222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
35232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
35252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
35262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
35270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
35291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
35300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
35322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
35332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
35342dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
35352dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
35360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
35372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
35382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
35390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
35402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
35410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
35440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
35450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
35460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
35470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
35480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
3551f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        cam_edge_application_t edge_application;
3552f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        edge_application.edge_mode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
3553f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        if (edge_application.edge_mode == CAM_EDGE_MODE_OFF) {
3554f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang            edge_application.sharpness = 0;
3555f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        } else {
35564e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang            if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
35579bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                uint8_t edgeStrength =
35589bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                    frame_settings.find(ANDROID_EDGE_STRENGTH).data.u8[0];
35599bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab                edge_application.sharpness = (int32_t)edgeStrength;
35604e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang            } else {
35614e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang                edge_application.sharpness = gCamCapability[mCameraId]->sharpness_ctrl.def_value; //default
35624e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang            }
3563f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        }
3564d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE,
3565f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang                sizeof(edge_application), &edge_application);
35660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
3568e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
35696356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        int32_t respectFlashMode = 1;
35706356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
35716356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t fwk_aeMode =
35726356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
35736356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
35746356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                respectFlashMode = 0;
35756356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
35766356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                    __func__);
35776356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            }
35786356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
35796356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (respectFlashMode) {
35806356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t flashMode =
35816356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
35826356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
35836356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          sizeof(FLASH_MODES_MAP),
35846356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          flashMode);
35856356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
35866356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            // To check: CAM_INTF_META_FLASH_MODE usage
35876356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
35886356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                          sizeof(flashMode), &flashMode);
35896356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
3590e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
3591e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
35920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
35930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
35940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
35950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
35960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
35970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
36000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
36010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
36020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
36030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
36040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
36070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
36080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
36090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
36100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
36110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
36148867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
36150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
36160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
36170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
36180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
36190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
36220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
36230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
36240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
36250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
36260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
36290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
36300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
36310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
36320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
36330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
36360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
36370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
36380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
36390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
36400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
36430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
36440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
36450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
36460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
36470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
36480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
36510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
36520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
36538867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
36540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
36550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
36560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
36590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
36600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
36618867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
36620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
36630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
36640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
36670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
36680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
36698867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
36700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
36710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
36720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
367471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
367571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
36760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
36770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
36780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
36790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
36800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
36810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
36820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
368347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
368447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
36850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
36860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
36870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
368871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
36890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
36910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
36920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
36930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
369462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime);
36950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
36960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
36970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
36980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
36990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
37010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
37020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
370362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int64_t minFrameDuration = getMinFrameDuration(request);
370462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration);
3705e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
3706e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
370762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration);
37080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
37090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
37100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
37110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
37140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
37150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
3716e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity <
3717e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
3718e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3719e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
3720e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity >
3721e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
3722e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3723e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
372462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity);
37250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
37260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
37270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
37280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
37310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
37320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
37330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
37340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
37350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
37380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
37390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
37400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
37410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
37420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
37456990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t fwk_facedetectMode =
37460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
37476990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t facedetectMode =
37486990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            lookupHalName(FACEDETECT_MODES_MAP,
37496990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode);
37500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
37510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
37520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
37530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
37560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
37570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
37580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
37590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
37600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
37610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
37640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
37650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
37660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
37670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
37680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
37690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
37700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
37710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
37720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
37730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
37740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
37750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
37760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
37770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3778e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */
3779e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /*All tonemap channels will have the same number of points*/
3780e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) &&
3781e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) &&
3782e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) {
3783e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_rgb_tonemap_curves tonemapCurves;
3784e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2;
3785e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3786e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch0 = G*/
3787e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        int point = 0;
3788e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveGreen;
3789e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) {
3790d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3791e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveGreen.tonemap_points[i][j] =
3792e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point];
3793d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3794d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3795d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3796e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[0] = tonemapCurveGreen;
3797e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3798e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 1 = B */
3799e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3800e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveBlue;
3801e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3802d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3803e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveBlue.tonemap_points[i][j] =
3804e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point];
3805d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3806d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3807d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3808e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[1] = tonemapCurveBlue;
3809e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3810e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 2 = R */
3811e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3812d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_tonemap_curve_t tonemapCurveRed;
3813e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3814d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3815d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               tonemapCurveRed.tonemap_points[i][j] =
3816d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                  frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point];
3817d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3818d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3819d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3820e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[2] = tonemapCurveRed;
3821e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3822d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters,
3823e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                CAM_INTF_META_TONEMAP_CURVES,
3824e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                sizeof(tonemapCurves), &tonemapCurves);
3825d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
38260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
38270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
38280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
38290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
38300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
38310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
38320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3834d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) {
3835d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t blackLevelLock =
3836d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0];
3837d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK,
3838d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(blackLevelLock), &blackLevelLock);
3839d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3840d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3841d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) {
3842d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t lensShadingMapMode =
3843d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0];
3844d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
3845d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(lensShadingMapMode), &lensShadingMapMode);
3846d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3847d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
384859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
384959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
385071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
385162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS);
385271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
385371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
385471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
385571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
385671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
385771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
385871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
385959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
386059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
386159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
386259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
386371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
386462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS);
386571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
386671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
386771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
386871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
386971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
387071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
387171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
387259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
387359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
387459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
387559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
387671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
387762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS);
387871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
387971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
388071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
388171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
388271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
388371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
388471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
388559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
3886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
3887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3889662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
38900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
3891662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
38920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
3893662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3894662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3895662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
3896662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
3897662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3898662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3899662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
3900662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
3901662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
3902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
3903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
3904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
39069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
39079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
39089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
39099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
39109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
39119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
39129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
39139a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
39149a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
39159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
3916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
3917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
3918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
392097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3922662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
39230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
39240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
39250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
39260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
39270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
39280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
39290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
39300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
39310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
39320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
39331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
39340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
39350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
39360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
39370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
39380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
39390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
39400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
394108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
394208ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
39430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
39440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
39450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
39469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
39479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
39480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
39490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
39503fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
39519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
39529a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
39533fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
39540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
39559a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
39560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
39579a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
39589a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
39590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
39609a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
39619a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
39620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
39630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
39640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
39659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
39669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
39679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
39689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
39699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
39709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
39719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
39729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
39739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
39749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
39750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
39763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
39770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
39780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
39790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
39803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
39813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
39820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
39839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
39840b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time;
39850b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi
39860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
39870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
39880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
39890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
399053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
399153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
399253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
399353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
3994f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    mJpegSettings->sharpness = 10; //default value
3995f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    if (jpeg_settings.exists(ANDROID_EDGE_MODE)) {
3996f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        uint8_t edgeMode = jpeg_settings.find(ANDROID_EDGE_MODE).data.u8[0];
3997f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        if (edgeMode == ANDROID_EDGE_MODE_OFF) {
3998f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang            mJpegSettings->sharpness = 0;
3999f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        }
4000f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang    }
400153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
40020a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
40037ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->is_jpeg_format = true;
40047ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask;
400580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
400680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
400780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
400880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
4009e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
4010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
4012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
4015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
4016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
4017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
4019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
40201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
4021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
4022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
4023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
4025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
4026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
4027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
4028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
4029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4030e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
4031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
4032625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
40347ee407aa1024789089aad411c372c79423699976Ajay Dudani
4035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
4036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
4037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
4039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
4044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
4045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
4046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
4048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
4049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4050d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
4052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
4054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
4056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
4057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
40581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
4059d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
40601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
4061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
4064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
4065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
4067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
4072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
4073625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
4074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
4075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
4077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
4078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
4079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4080d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
4082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
4084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
4086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
40871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
4088d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
40891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
4090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
4093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
4094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
4096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
4100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
4101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
4102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
4103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
4104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4105d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
4107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
4109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
4111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
41121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
4113d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
41141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
4115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
4118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
4119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
4121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
4126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
4127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
41289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
41299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
41309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
4131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4133d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
4135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
4136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
4138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
4140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
4141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
414297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
4143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4144d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
4145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
4146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
4149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
4150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
4152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
4157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
41589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
41599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
41609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
4161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4162d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
416380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
416480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
416580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
416680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
41679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
416880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
41699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
41701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
4171d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
41721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
4173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
4176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
4177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
4179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
4184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
4185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4186e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
4187e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
4188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
4189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4190d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4191e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
4192e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4193e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
4194e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4195e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
4196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
4197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
4198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
4199d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
4200e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
4201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
4204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
4205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
4207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
4209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
4211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
4212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
4213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4214e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
4215e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
4216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
4217d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4218e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
4219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
4221e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4222e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
4223e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
4224e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
4225e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
4226d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
4227e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
4228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
4229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4230e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
4231c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
4232c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
4233c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
4234c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
4235c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
4236c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
4237c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
4238c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
4239c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
4240c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
4241c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush(
4242c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                const struct camera3_device *device)
4243c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
4244c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    int rc;
4245c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: E", __func__);
4246c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    QCamera3HardwareInterface *hw =
4247c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
4248c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    if (!hw) {
4249c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
4250c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        return -EINVAL;
4251c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    }
4252c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
4253c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    rc = hw->flush();
4254c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: X", __func__);
4255c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return rc;
4256c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
4257c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
4258c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
4259e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
4260e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4261e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
4262e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4263e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
4264e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4265e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
4266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
4267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
4268e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
4269e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
4270d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
4271e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
4272e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
4273e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
4274e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
4275e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
4276e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
4277e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
4278e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
4279e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
4280cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
4281cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
4282cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
4283cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
4284d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
4285e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
4286e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
4287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
42887ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
42897ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : getWaveletDenoiseProcessPlate
42907ee407aa1024789089aad411c372c79423699976Ajay Dudani *
42917ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate
42927ee407aa1024789089aad411c372c79423699976Ajay Dudani *
42937ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None
42947ee407aa1024789089aad411c372c79423699976Ajay Dudani *
42957ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : WNR prcocess plate vlaue
42967ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
42977ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate()
42987ee407aa1024789089aad411c372c79423699976Ajay Dudani{
42997ee407aa1024789089aad411c372c79423699976Ajay Dudani    char prop[PROPERTY_VALUE_MAX];
43007ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(prop, 0, sizeof(prop));
43017ee407aa1024789089aad411c372c79423699976Ajay Dudani    property_get("persist.denoise.process.plates", prop, "0");
43027ee407aa1024789089aad411c372c79423699976Ajay Dudani    int processPlate = atoi(prop);
43037ee407aa1024789089aad411c372c79423699976Ajay Dudani    switch(processPlate) {
43047ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 0:
43057ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
43067ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 1:
43077ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_CBCR_ONLY;
43087ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 2:
43097ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
43107ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 3:
43117ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
43127ee407aa1024789089aad411c372c79423699976Ajay Dudani    default:
43137ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
43147ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
43157ee407aa1024789089aad411c372c79423699976Ajay Dudani}
43167ee407aa1024789089aad411c372c79423699976Ajay Dudani
43177ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
43187ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : needRotationReprocess
43197ee407aa1024789089aad411c372c79423699976Ajay Dudani *
43207ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp
43217ee407aa1024789089aad411c372c79423699976Ajay Dudani *
43227ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none
43237ee407aa1024789089aad411c372c79423699976Ajay Dudani *
43247ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : true: needed
43257ee407aa1024789089aad411c372c79423699976Ajay Dudani *              false: no need
43267ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
43277ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess()
43287ee407aa1024789089aad411c372c79423699976Ajay Dudani{
43297ee407aa1024789089aad411c372c79423699976Ajay Dudani
43307ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (!mJpegSettings->is_jpeg_format) {
43317ee407aa1024789089aad411c372c79423699976Ajay Dudani        // RAW image, no need to reprocess
43327ee407aa1024789089aad411c372c79423699976Ajay Dudani        return false;
43337ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
43347ee407aa1024789089aad411c372c79423699976Ajay Dudani
43357ee407aa1024789089aad411c372c79423699976Ajay Dudani    if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
43367ee407aa1024789089aad411c372c79423699976Ajay Dudani        mJpegSettings->jpeg_orientation > 0) {
43377ee407aa1024789089aad411c372c79423699976Ajay Dudani        // current rotation is not zero, and pp has the capability to process rotation
43387ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGD("%s: need do reprocess for rotation", __func__);
43397ee407aa1024789089aad411c372c79423699976Ajay Dudani        return true;
43407ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
43417ee407aa1024789089aad411c372c79423699976Ajay Dudani
43427ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
43437ee407aa1024789089aad411c372c79423699976Ajay Dudani}
43447ee407aa1024789089aad411c372c79423699976Ajay Dudani
43457ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
4346c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION   : needReprocess
4347c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
4348c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed
4349c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
4350c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none
4351c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
4352c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN     : true: needed
4353c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *              false: no need
4354c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/
4355c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess()
4356c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{
4357c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if (!mJpegSettings->is_jpeg_format) {
4358c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // RAW image, no need to reprocess
4359c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return false;
4360c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
4361c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
4362c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if ((mJpegSettings->min_required_pp_mask > 0) ||
4363c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan         isWNREnabled()) {
4364c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // TODO: add for ZSL HDR later
4365c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
4366c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
4367c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return true;
4368c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
4369c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    return needRotationReprocess();
4370c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan}
4371c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
4372c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*===========================================================================
43737ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : addOnlineReprocChannel
43747ee407aa1024789089aad411c372c79423699976Ajay Dudani *
43757ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
43767ee407aa1024789089aad411c372c79423699976Ajay Dudani *              coming from input channel
43777ee407aa1024789089aad411c372c79423699976Ajay Dudani *
43787ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS :
43797ee407aa1024789089aad411c372c79423699976Ajay Dudani *   @pInputChannel : ptr to input channel whose frames will be post-processed
43807ee407aa1024789089aad411c372c79423699976Ajay Dudani *
43817ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : Ptr to the newly created channel obj. NULL if failed.
43827ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
43837ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel(
4384d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle)
43857ee407aa1024789089aad411c372c79423699976Ajay Dudani{
43867ee407aa1024789089aad411c372c79423699976Ajay Dudani    int32_t rc = NO_ERROR;
43877ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCamera3ReprocessChannel *pChannel = NULL;
43887ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (pInputChannel == NULL) {
43897ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: input channel obj is NULL", __func__);
43907ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
43917ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
43927ee407aa1024789089aad411c372c79423699976Ajay Dudani
43937ee407aa1024789089aad411c372c79423699976Ajay Dudani    pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
43947ee407aa1024789089aad411c372c79423699976Ajay Dudani            mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle);
43957ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (NULL == pChannel) {
43967ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: no mem for reprocess channel", __func__);
43977ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
43987ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
43997ee407aa1024789089aad411c372c79423699976Ajay Dudani
44007ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Capture channel, only need snapshot and postview streams start together
44017ee407aa1024789089aad411c372c79423699976Ajay Dudani    mm_camera_channel_attr_t attr;
44027ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
44037ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
44047ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue();
44057ee407aa1024789089aad411c372c79423699976Ajay Dudani    rc = pChannel->initialize();
44067ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
44077ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
44087ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
44097ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
44107ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
44117ee407aa1024789089aad411c372c79423699976Ajay Dudani
44127ee407aa1024789089aad411c372c79423699976Ajay Dudani    // pp feature config
44137ee407aa1024789089aad411c372c79423699976Ajay Dudani    cam_pp_feature_config_t pp_config;
44147ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
44157ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
44167ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
4417f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang        pp_config.sharpness = mJpegSettings->sharpness;
44187ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
44197ee407aa1024789089aad411c372c79423699976Ajay Dudani
44207ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (isWNREnabled()) {
44217ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
44227ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.denoise_enable = 1;
44237ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate();
44247ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
44257ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (needRotationReprocess()) {
44267ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
44277ee407aa1024789089aad411c372c79423699976Ajay Dudani        int rotation = mJpegSettings->jpeg_orientation;
44287ee407aa1024789089aad411c372c79423699976Ajay Dudani        if (rotation == 0) {
44297ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_0;
44307ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 90) {
44317ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_90;
44327ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 180) {
44337ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_180;
44347ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 270) {
44357ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_270;
44367ee407aa1024789089aad411c372c79423699976Ajay Dudani        }
44377ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
44387ee407aa1024789089aad411c372c79423699976Ajay Dudani
44397ee407aa1024789089aad411c372c79423699976Ajay Dudani   rc = pChannel->addReprocStreamsFromSource(pp_config,
44407ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             pInputChannel,
44417ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             mMetadataChannel);
44427ee407aa1024789089aad411c372c79423699976Ajay Dudani
44437ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
44447ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
44457ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
44467ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
44477ee407aa1024789089aad411c372c79423699976Ajay Dudani    return pChannel;
44487ee407aa1024789089aad411c372c79423699976Ajay Dudani}
44497ee407aa1024789089aad411c372c79423699976Ajay Dudani
44507ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue()
44517ee407aa1024789089aad411c372c79423699976Ajay Dudani{
44527ee407aa1024789089aad411c372c79423699976Ajay Dudani    return gCamCapability[mCameraId]->min_num_pp_bufs;
44537ee407aa1024789089aad411c372c79423699976Ajay Dudani}
44547ee407aa1024789089aad411c372c79423699976Ajay Dudani
4455acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() {
4456acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan    return gCamCapability[mCameraId]->isWnrSupported;
4457acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan}
4458acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan
4459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
4460