QCamera3HWI.cpp revision d363f94a30706c0f951d037b3601bc2a0b445837
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without
4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are
5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met:
6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions of source code must retain the above copyright
7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       notice, this list of conditions and the following disclaimer.
8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions in binary form must reproduce the above
9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       copyright notice, this list of conditions and the following
10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       disclaimer in the documentation and/or other materials provided
11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       with the distribution.
12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Neither the name of The Linux Foundation nor the names of its
13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       contributors may be used to endorse or promote products derived
14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       from this software without specific prior written permission.
15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/
29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI"
3114dfc272241ba78c85a327da2872e71b3208f8c5Shuzhen Wang//#define LOG_NDEBUG 0
32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h>
34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h>
35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h>
36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h>
37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h>
38625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h>
39e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h>
40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h>
41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h"
42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h"
43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h"
4466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h"
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera {
4962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
5062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang#define MAX(a, b) ((a) > (b) ? (a) : (b))
5162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
5480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings;
55b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
57cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
58cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    PTHREAD_MUTEX_INITIALIZER;
59cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
60cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
10097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
104b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
121e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
122e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
124e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
1296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE },
1306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH }
131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1336990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = {
1346990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,    CAM_FACE_DETECT_MODE_OFF     },
1356990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL,   CAM_FACE_DETECT_MODE_FULL    }
1366990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang};
1376990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang
13808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
13908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
149c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    flush:                              QCamera3HardwareInterface::flush,
150c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    reserved:                           {0},
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
168cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
16997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
17033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
17133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
1727ee407aa1024789089aad411c372c79423699976Ajay Dudani      mPictureChannel(NULL),
17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
17433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
17533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
17699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      mJpegSettings(NULL),
1778bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani      mIsZslMode(false),
17862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinProcessedFrameDuration(0),
17962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinJpegFrameDuration(0),
18062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinRawFrameDuration(0),
18199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      m_pPowerModule(NULL)
182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
185e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1897ee407aa1024789089aad411c372c79423699976Ajay Dudani    // TODO: hardcode for now until mctl add support for min_num_pp_bufs
1907ee407aa1024789089aad411c372c79423699976Ajay Dudani    //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3
1917ee407aa1024789089aad411c372c79423699976Ajay Dudani    gCamCapability[cameraId]->min_num_pp_bufs = 3;
1929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
19574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
19733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
19833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
19933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
20099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
20199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
20299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
20399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
20499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
20599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
21166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
219d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
220d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
221d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        /*flush the metadata list*/
222d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
223d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
224d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
225d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
226d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
227d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
228d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
229d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
2301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
233dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
2347ee407aa1024789089aad411c372c79423699976Ajay Dudani           channel->stop();
235d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
236d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
237d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
238d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
239dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
240dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
2447ee407aa1024789089aad411c372c79423699976Ajay Dudani    mPictureChannel = NULL;
2457ee407aa1024789089aad411c372c79423699976Ajay Dudani
24697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
24797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
24897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
24997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
250dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
251dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
252dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
253020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        mMetadataChannel->stop();
254020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        delete mMetadataChannel;
255020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        mMetadataChannel = NULL;
256dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
257dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
258dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
259cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
260cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
261e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
26233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
26333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
26433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
26533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
268e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
269d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
287cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
288cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
289cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
290cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
291cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        return INVALID_OPERATION;
292cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
293cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
300cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
302cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
303cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
305cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
30699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
30799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == 0) {
30899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
30999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
31099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
31199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=1");
31299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
31399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
31499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
31599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
316cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
36799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
36899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == NO_ERROR) {
36999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
37099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
37199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
37299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=0");
37399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
37499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
37599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
37699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
37799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
397e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
398e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
39933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
40033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
40133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
40233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
40333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
404020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    //Create metadata channel and initialize it
405020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
406020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava                    mCameraHandle->ops, captureResultCb,
407020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava                    &gCamCapability[mCameraId]->padding_info, this);
408020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    if (mMetadataChannel == NULL) {
409020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        ALOGE("%s: failed to allocate metadata channel", __func__);
410020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        rc = -ENOMEM;
411020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        goto err2;
412020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    }
413020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    rc = mMetadataChannel->initialize();
414020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    if (rc < 0) {
415020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        ALOGE("%s: metadata channel initialization failed", __func__);
416020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        goto err3;
417020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    }
418020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava
4199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
420e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
421e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
422cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
4239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
4249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
425020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr3:
426020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    delete mMetadataChannel;
427020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    mMetadataChannel = NULL;
428020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr2:
429020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    deinitParameters();
4309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
431e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
4329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
45033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
451d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    mIsZslMode = false;
4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
456e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
462e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
469e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
474c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    camera3_stream_t *jpegStream = NULL;
475d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    cam_stream_size_info_t stream_config_info;
476d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
4770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
481d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
482d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
485d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
488c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
489c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
490c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
4910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
5011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
5021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
5031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
5080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
5090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
5121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
5130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
5140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
515c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
516c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
519e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
524c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
525c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
526c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
5300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
5311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
544020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    //mMetadataChannel->stop();
545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
549d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        stream_config_info.stream_sizes[i].width = newStream->width;
550d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        stream_config_info.stream_sizes[i].height = newStream->height;
551d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
552d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && jpegStream){
553d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            //for zsl stream the size is jpeg size
554d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            stream_config_info.stream_sizes[i].width = jpegStream->width;
555d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang            stream_config_info.stream_sizes[i].height = jpegStream->height;
556d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang        }
557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
560f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
561f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
562f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
563f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
564f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
565f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
568c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                /* For video encoding stream, set read/write rarely
569c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                 * flag so that they may be set to un-cached */
570c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER)
571c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage =
572c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         (GRALLOC_USAGE_SW_READ_RARELY |
573c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_SW_WRITE_RARELY |
574c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_HW_CAMERA_WRITE);
575c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                else
576c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
579f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
580f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
587f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5888867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
589f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
590c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
591c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
592c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
593c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
5948bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
595c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
596c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
597c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
598c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
599c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
600c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
601f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
602f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
603f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
604f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
605f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
606f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
607f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
610f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
611f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
612f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
6137ee407aa1024789089aad411c372c79423699976Ajay Dudani                    mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle,
614f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
615f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
6167ee407aa1024789089aad411c372c79423699976Ajay Dudani                    if (mPictureChannel == NULL) {
617f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
618f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
619f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
620f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
6217ee407aa1024789089aad411c372c79423699976Ajay Dudani                    newStream->priv = (QCamera3Channel*)mPictureChannel;
622f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
623f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
624f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
625f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
626f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
627f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
6358867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
6361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
6371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
6381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
6391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
6401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
6411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
6421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
6431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
6441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
6451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
6461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
6471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
6481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
6491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
650a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
651e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
6520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
6561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
6571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
6581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
6591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
6601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
6610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
6641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
6651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
666d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    /*flush the metadata list*/
667d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
668d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
669d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
670d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
671d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
672d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
673d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
674d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
675d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
676d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    stream_config_info.num_streams = streamList->num_streams;
677d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
67833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
6799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
680d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
681d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
682d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
683d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang                sizeof(hal_version), &hal_version);
684d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
685d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_INFO,
686d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang                sizeof(stream_config_info), &stream_config_info);
687d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
688d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
689d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang
69033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
69133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
69262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Get min frame duration for this streams configuration
69362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    deriveMinFrameDuration();
69462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
695e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
69633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
700e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
702e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
70380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
70480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
70580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
70680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
70780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
70880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
70980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
71280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
7189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
7199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
7209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
7249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
7259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
7269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
7279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
7319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
7329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
736c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
737c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
738c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
739c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
740c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
741c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
742c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
743c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
744c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
745c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
746c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
747c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
748c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
749c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
750c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
751c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
752c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
753c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
754c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
755c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
756c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
757c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
758c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
7679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
7689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
7729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
7739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
7779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
7789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
7829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
7839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
7879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
7889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
7899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
79462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : deriveMinFrameDuration
79562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
79662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based
79762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              on currently configured streams.
79862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
79962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE
80062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
80162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : NONE
80262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
80362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
80462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration()
80562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
80662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t maxJpegDimension, maxProcessedDimension;
80762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
80862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxJpegDimension = 0;
80962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxProcessedDimension = 0;
81062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
81162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    // Figure out maximum jpeg, processed, and raw dimensions
81262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (List<stream_info_t*>::iterator it = mStreamInfo.begin();
81362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        it != mStreamInfo.end(); it++) {
81462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
81562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        // Input stream doesn't have valid stream_type
81662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT)
81762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            continue;
81862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
81962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int32_t dimension = (*it)->stream->width * (*it)->stream->height;
82062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) {
82162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxJpegDimension)
82262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxJpegDimension = dimension;
82362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) {
82462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxProcessedDimension)
82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxProcessedDimension = dimension;
82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Assume all jpeg dimensions are in processed dimensions.
83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (maxJpegDimension > maxProcessedDimension)
83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        maxProcessedDimension = maxJpegDimension;
83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Find minimum durations for processed, jpeg, and raw
83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration;
83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (maxProcessedDimension ==
83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].width *
83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].height) {
83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            break;
84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : getMinFrameDuration
84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations
85062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              and current request configuration.
85162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
85262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks
85362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
85462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : min farme duration for a particular request
85562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
85662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
85762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request)
85862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
85962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    bool hasJpegStream = false;
86062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (uint32_t i = 0; i < request->num_output_buffers; i ++) {
86162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        const camera3_stream_t *stream = request->output_buffers[i].stream;
86262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (stream->format == HAL_PIXEL_FORMAT_BLOB)
86362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            hasJpegStream = true;
86462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
86562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
86662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (!hasJpegStream)
86762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration);
86862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    else
86962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration);
87062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
87162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
87262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
892e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
894e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
895e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
896e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
897e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
898e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
899e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
900e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
901e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
902e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
903e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
904e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
905e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
906e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
907e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
908e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
909e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
9151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
9161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
9171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
9180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
9191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
9201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
9211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
9221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
9230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
9240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
9250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
9260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
9281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
9290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
9310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
9320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
936e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
939e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
940e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
945e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
949e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
950e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
952e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
954e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
95974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
960e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
961d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    MetadataBufferInfo reproc_meta;
962d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    int queueMetadata = 0;
963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9662123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    rc = validateCaptureRequest(request);
9672123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    if (rc != NO_ERROR) {
9682123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
9692123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        pthread_mutex_unlock(&mMutex);
9702123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        return rc;
9712123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    }
9722123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9732123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    meta = request->settings;
9742123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9752123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // For first capture request, send capture intent, and
9762123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // stream on all streams
977d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    if (mFirstRequest) {
9782123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9792123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
9802123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            int32_t hal_version = CAM_HAL_V3;
9812123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            uint8_t captureIntent =
9822123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
9832123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9842123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            memset(mParameters, 0, sizeof(parm_buffer_t));
9852123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
9862123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
9872123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(hal_version), &hal_version);
9882123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
9892123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(captureIntent), &captureIntent);
9902123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mCameraHandle->ops->set_parms(mCameraHandle->camera_handle,
9912123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                mParameters);
9922123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        }
9932123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
994d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
995d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            it != mStreamInfo.end(); it++) {
996d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
997d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            channel->start();
998d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        }
999d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    }
1000d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang
1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
100234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    uint32_t streamTypeMask = 0;
10039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
100474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
100574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
100674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
1007013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
100874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
100974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
101074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
101174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
101274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
1013013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
101474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
101574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
101674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
1017d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    ALOGE("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
1018c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
1019c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
1020c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
1021c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
1022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
10237ee407aa1024789089aad411c372c79423699976Ajay Dudani    int blob_request = 0;
1024e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
1025e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
102634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1027e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
102866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
102966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
103066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
10317ee407aa1024789089aad411c372c79423699976Ajay Dudani            blob_request = 1;
103266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
103366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
10340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
103566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
103666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
103766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
103866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
103966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
1040e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
1041e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
1042e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
1043e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
1044e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
1045e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
104634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        streamTypeMask |= channel->getStreamTypeMask();
104734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
104834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
104962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = setFrameParameters(request, streamTypeMask);
105034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
105134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: fail to set frame parameters", __func__);
105234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        pthread_mutex_unlock(&mMutex);
105334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return rc;
1054e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1055e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
10561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
10571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
10591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
106074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
10617ee407aa1024789089aad411c372c79423699976Ajay Dudani    pendingRequest.blob_request = blob_request;
106213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0;
106374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
10641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
10651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
10661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
10671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
10691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
10711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
10721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
10731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
1075e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
10769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
10779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
10789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
10799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
10809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1081c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
108266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
10839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
10849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
10859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
10869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
10879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
108866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
1089c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
1090c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
1091c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
1092c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
1093c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
1094c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
1095c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
1096c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
1097c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
1098c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
1099c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
1100c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
1101c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
1102c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
1103c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
110441da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                    ALOGD("Handle:%p", request->input_buffer->buffer);
1105d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    //TODO: need to get corresponding metadata and send it to pproc
1106d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1107d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         m != mStoredMetadataList.end(); m++) {
1108d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->input_buffer->buffer) {
1109d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            reproc_meta.meta_buf = m->meta_buf;
1110d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            queueMetadata = 1;
1111d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1112d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1113d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1114c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
1115c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
1116c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
1117c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
1118d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (queueMetadata) {
111941da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false);
1120d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
112166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
1122d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__,
1123a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
1124d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1125d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1126d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                     m != mStoredMetadataList.end(); m++) {
1127d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (uint32_t j = 0; j < request->num_output_buffers; j++) {
1128d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->output_buffers[j].buffer) {
1129d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mMetadataChannel->bufDone(m->meta_buf);
1130d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            free(m->meta_buf);
1131d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            m = mStoredMetadataList.erase(m);
1132d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1133d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1134d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1135d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1136d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
113766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
113866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
11399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
11409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
11419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
11431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
11441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
11459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
11469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
11479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
11485b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang        pthread_cond_wait(&mRequestCond, &mMutex);
11499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
115280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
115380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
115480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
11559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
1156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
11579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
1158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
11599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
11609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
1161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1165b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
1166b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
1169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1172e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1175e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1176e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1177e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
1179e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1180e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
1181e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1182e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1183e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1185e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1186e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1187b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
1188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1189e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
1190e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1191e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1192e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1193e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1194e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1195e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1198c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
1199c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
1200c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1201c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
1202c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1203c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
1204c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1205c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1206c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
1207c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
1208c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush()
1209c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
1210c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*Enable lock when we implement this function*/
1211c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*
1212c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_lock(&mMutex);
1213c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
1214c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_unlock(&mMutex);
1215c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    */
1216c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return 0;
1217c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
12187ee407aa1024789089aad411c372c79423699976Ajay Dudani
1219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
1221e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
122233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
122333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
1224e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1225e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1226e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
122733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
122833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
12299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
12309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
12319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
12321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1233e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
12349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
12355b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_lock(&mMutex);
1236e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
12371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
12381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
123933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
124033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
1241152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        uint32_t pending_requests = *(uint32_t *)POINTER_OF(
1242152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang            CAM_INTF_META_PENDING_REQUESTS, metadata);
124333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
124433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
12450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
12460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
12470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
12480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
12490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
12501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
1251a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
12521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
12531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
12541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1255a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1256e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
12571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
12591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1260e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
12611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
12621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
1263a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
12641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
12661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
1267e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1268e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
1269e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
1270e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
1271e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
1272e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
1273e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
1274e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1275e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
12761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
12771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
12781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
1279e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
12801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
1281a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1282e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
12831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
12851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
12861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
128799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
128899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1289e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
129099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
129174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
129299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
12931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
1294e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
129574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
1296d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (mIsZslMode) {
1297d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   int found_metadata = 0;
1298d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   //for ZSL case store the metadata buffer and corresp. ZSL handle ptr
1299d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1300d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        j != i->buffers.end(); j++) {
1301d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1302d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         //check if corresp. zsl already exists in the stored metadata list
1303d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1304d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m != mStoredMetadataList.begin(); m++) {
1305d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            if (m->frame_number == frame_number) {
1306d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m->meta_buf = metadata_buf;
1307d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               found_metadata = 1;
1308d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               break;
1309d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            }
1310d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1311d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         if (!found_metadata) {
1312d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            MetadataBufferInfo store_meta_info;
1313d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.meta_buf = metadata_buf;
1314d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.frame_number = frame_number;
1315d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mStoredMetadataList.push_back(store_meta_info);
1316d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            found_metadata = 1;
1317d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1318d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      }
1319d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1320d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   if (!found_metadata) {
132113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       if (!i->input_buffer_present && i->blob_request) {
132213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          //livesnapshot or fallback non-zsl snapshot case
132313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
132413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                j != i->buffers.end(); j++){
132513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT &&
132613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                  j->stream->format == HAL_PIXEL_FORMAT_BLOB) {
132741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                                 mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
132813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                 break;
132913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              }
133013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                         }
133113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       } else {
133213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            //return the metadata immediately
133313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            mMetadataChannel->bufDone(metadata_buf);
133413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            free(metadata_buf);
133513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       }
1336d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1337d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else if (!mIsZslMode && i->blob_request) {
13387ee407aa1024789089aad411c372c79423699976Ajay Dudani                   //If it is a blob request then send the metadata to the picture channel
133941da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                   mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
1340d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else {
13417ee407aa1024789089aad411c372c79423699976Ajay Dudani                   // Return metadata buffer
13427ee407aa1024789089aad411c372c79423699976Ajay Dudani                   mMetadataChannel->bufDone(metadata_buf);
13437ee407aa1024789089aad411c372c79423699976Ajay Dudani                   free(metadata_buf);
1344d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               }
1345d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
13461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
13481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
13491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
13511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
1352e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
13531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1354e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
13551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
13561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
13571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
13611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
13621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
13631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
13641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
13651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
13671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1368e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
13691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
13701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
13711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
137213dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang                        j->buffer = NULL;
13731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
13741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
13751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
13771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1379a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1380d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
13811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
13821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
13831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
13841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1385d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                ALOGE("%s: meta frame_number = %d, capture_time = %lld",
1386d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
13871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
13881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
13901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
13911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
139233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
139333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
13941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
13951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
13961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
13971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1398e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
13991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
14001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
14011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
14021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1404152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        if (!max_buffers_dequeued && !pending_requests) {
14051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
14061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
14081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
14091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
14101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
14111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
14121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
14131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1414c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
14151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
1416c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
14171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
14181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
14191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1420e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
14211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
14221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
14231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
14241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
14271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
142833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
14291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
14301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1431a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1432e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1434d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1435d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                int found = 0;
1436d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin();
1437d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      k != mStoredMetadataList.end(); k++) {
1438d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    if (k->frame_number == frame_number) {
1439d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        k->zsl_buf_hdl = buffer->buffer;
1440d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        found = 1;
1441d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        break;
1442d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1443d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1444d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (!found) {
1445d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   MetadataBufferInfo meta_info;
1446d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.frame_number = frame_number;
1447d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.zsl_buf_hdl = buffer->buffer;
1448d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   mStoredMetadataList.push_back(meta_info);
1449d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1450d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
1451e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
145233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
14531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1454e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
14551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
14561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
14571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
14581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
14591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
14601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
14611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1462a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1463e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
14641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
14651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1467e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
14689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
14695b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_unlock(&mMutex);
14709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
14719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
14729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
147397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
147497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
147597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
147697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
147797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
147897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
147997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
148097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
148197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
148297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
148397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
148497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
148597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
148674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
148774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
148997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
149097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
14920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
149374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
149597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
149697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
149797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
149897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
149997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
150097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
150197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
150597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
150697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
151259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
151697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
151797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
151899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
151999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
152099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
152199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
152297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
152399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
152497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
152599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
152697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15278867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
15280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
152997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
153197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
153297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
153497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
153597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
153959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
154113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab
154213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    uint8_t *ae_state =
15438bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
154413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
154513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab
15460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
15470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
154997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
155097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
155297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
155397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
155459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
155597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
155697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
155897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
155997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
156097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
156197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
156297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
156397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
15650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
156697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
156797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
156897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
156997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
157097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
157197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
157259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
157397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
157497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
15760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
157797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
157897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
158097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
158197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1582d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata);
158397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
158497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
15860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
158797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
158897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
158997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
159097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
159197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
159297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
159397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
159497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
159597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
159697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
15980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
159997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
160097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
16020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
160397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
160497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
160597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
160697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
160797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
160897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
160997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
161097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
161197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
161297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
161397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
161497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
161597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
161697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
161797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
161897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
161997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
162097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
162197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
162297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
162397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
162497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
16260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
16270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
162897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
162997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
163097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
163197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
163297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
16340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
163597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
163697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
163797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
163897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
164097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
164171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
16420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
16430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
16440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
164571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
164671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
164797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
164897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
164997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
16500b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mMetadataResponse.exposure_time = *sensorExpTime;
165162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime);
165297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
165397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
165497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
165597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
165662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration);
165797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
165897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
165997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
166097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
166162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity);
16623fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
166397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
166497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
16660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
166797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
166897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
16700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
16716990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP,
16726990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]),
16736990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        *faceDetectMode);
16746990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1);
167597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
16770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
167897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
167997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
16810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
168297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
168397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
168497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
168597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
168697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
168797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
168897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
168997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
169097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
169197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1692d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *)
1693d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata);
1694d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height;
1695d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    int map_width  = gCamCapability[mCameraId]->lens_shading_map_size.width;
1696d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP,
1697d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (float*)lensShadingMap->lens_shading,
1698d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       4*map_width*map_height);
1699d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1700d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*)
1701d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata);
1702d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4);
1703d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1704d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*)
1705d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata);
1706d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM,
1707d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3);
1708d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1709d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*)
1710d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata);
1711d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS,
1712d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       predColorCorrectionGains->gains, 4);
1713d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1714d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*)
1715d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata);
1716d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM,
1717d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3);
1718d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1719d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t *blackLevelLock = (uint8_t*)
1720d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata);
1721d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1);
1722d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1723d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t *sceneFlicker = (uint8_t*)
1724d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata);
1725d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1);
1726d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1727d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
172933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
173097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
173197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
173297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
173359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
173497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
173597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
173697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
173797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
173897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
173997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
174097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
174197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
174297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
174397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
174459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
174597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
174697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
174759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
174859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
174997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
175097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
175197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
175297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
175359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
175459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
175559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
175659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
175759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
175859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
175959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
176059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
176159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
176259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
176359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
176459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
176559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
176659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
176759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
176859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
176959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
177059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
177159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
177259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
177359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
177459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
177559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
177659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
177759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
177859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
177959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
178059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
178159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
178297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
178371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
178471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
178571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
178671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
178771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
178871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
178971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
179071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
179171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
179271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
179371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
179471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
179571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
179671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
179771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
179871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
179971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
180071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
180171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
180271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
180371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
180471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
180571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
180671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
180771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
180871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
180971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
181071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
181171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
181271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
181371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
181471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
181571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
181671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
181771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
181871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
181971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
182071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
182171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
182271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
182371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
182471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
182597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
182697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
182797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
182897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
182997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
183097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
183197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
183297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
183397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
183497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
183597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
183697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
183797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
183897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
183997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
184097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
184197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
184297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
184397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
184497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1946662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1947662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1948662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1950662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1953662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1955662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1956662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1957662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1958662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
196833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
196933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
197033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
197133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
197233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
197333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
197433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
197533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
197633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
197733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
197833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
197933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
198033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
198133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
198233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
198333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
198433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
198533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
198633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
198733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
198833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
19890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
19900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
19920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
19940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
19960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
19970a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
19980a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
19990a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
20000a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
20010a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
20020a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
20030a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
20040a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
20050a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
20060a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
20070a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
20080a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
20090a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
20100a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
20110a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
20120a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
2013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
2014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
2016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
2022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
2025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
202797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
2028c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2029c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
2030c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
2031c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
2032c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
2033c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
2035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
20362dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
20372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
20382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
2040e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
2041e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
2042e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
2043e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2044e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
2045e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
20472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
2048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
2050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
2051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2052c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
2053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
2054c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
2055c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
2056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
2058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
2059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
2060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
2062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
2063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
2064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
2067c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
2068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
2069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
207080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
207180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
207280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
207380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
207580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
207680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
207780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
207880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
2079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
208047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
20810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
208280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
208380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
208480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
208580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
208680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
208780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
2088c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
208980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
209180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
209280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
209480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
209580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
209780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
209880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
2101c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
210280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
210480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
210580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
210680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
210780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
210922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
211080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
211180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
211222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
211380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
211580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
2116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
211780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
211880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
211980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
212180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
212280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
212480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
212580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
21276990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                      (int*)&gCamCapability[cameraId]->max_num_roi, 1);
212880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
213080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
213180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
213280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
213380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
213480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
213547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
213680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
213780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
213880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
213980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
214080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
214180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
214280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
214380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
214480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
214580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
214680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
214780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
214880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
214922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
215022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
215122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
21548867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
215647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
215700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
215800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
216200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2);
216300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2164e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
216500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
216600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
21670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
216847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
21690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
21700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
21710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
2172c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
2173c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
2174c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
217547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
2176c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
2177c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
2178c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
2179c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
2180c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2181c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
218247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
2183c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
2184c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
2185c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2186b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
21879443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
2188c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
2189c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
2190c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
219147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
2192c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
2193c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
2194c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
219547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
21966990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
21976990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_FULL };
2198c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
2199c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
2200c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
2201c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
220247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
2203662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
2204662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
2205662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
2206662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
2207662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
220847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
220980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
221080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
221180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
221280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
221380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
2214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
221580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
221680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
2217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
221900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                available_processed_sizes,
2220c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
2221c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2222c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
222308ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
222408ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
2225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
222647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
222797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
222897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
222997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
223097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
223197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
223297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
223397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
223497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
223597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
223697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
223797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
223897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
223947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
22400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
2241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
22420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
2243b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
22440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
22450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
22470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
2251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
22520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
225447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
2255e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
22562dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
2257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
22580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
2259b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
22600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
22610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
2262e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
2263e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
22642dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
22650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2267e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
22702dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
227247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
2273e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
2274e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
2275e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
22769443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
22779443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
2278e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
2279e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
2280e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
2281e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
228247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
22830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2284662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
22850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
2286b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
2287b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
22880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
22900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
22920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
2295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
229847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
22990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
23010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
2302b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
23030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
23040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
23050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
23060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
23070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2308662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
23110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
231347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
23140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
23160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
2317b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
23180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
23190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
23200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
23210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
23220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
23260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2327662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2328a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX];
2329a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++)
2330a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava      available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i];
2331a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2332a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    staticInfo.update(ANDROID_FLASH_FIRING_POWER,
2333a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            available_flash_levels,
2334a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            gCamCapability[cameraId]->supported_flash_firing_level_cnt);
2335a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
233700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    uint8_t flashAvailable = gCamCapability[cameraId]->flash_available;
2338e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2339e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2340e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2341e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2342e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2343e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2344e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2345e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2346e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2347e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2348e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2349e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2350e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2351e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2352662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2353662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2354e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2355ea44a483c0e98200c058a85ea339457616516847Zhijun He
2356e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    int32_t sensitivity_range[2];
2357e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2358e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2359ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2360ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2361ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
23622dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
236373c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
236473c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
236500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
236600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
236773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2368e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2369e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
237073c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
237100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle;
237200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_SENSOR_ORIENTATION,
237300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &sensor_orientation,
237400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
237500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
237600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t max_output_streams[3] = {1, 3, 1};
237700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
237800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      max_output_streams,
237900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      3);
238000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2381b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2386662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2387662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2388662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2389662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2390662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2391662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2392662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2393662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2394662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2395662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2396662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2397662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2398662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2399662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2400662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2401662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2402662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2403662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
24040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
24060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
24070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
24080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
24090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
24100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
24110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
24120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
24130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2414c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
24150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
24160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
24170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2418c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2419c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
24200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
24210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
24232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
24242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
24252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
24262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
24282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
24302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
24332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2434e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
24359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
24369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
24372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
24382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
24392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
24402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
24419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
24429443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
24432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
24449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2445e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
2446e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani        overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON;
24479443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
24489443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
24499443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
24509443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
24519443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
24529443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
24539443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
24549443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
24559443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
24569443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
24579443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
24589443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
24599443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
24609443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
24619443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
24629443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
24639443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
24642dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
24652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
24662dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
24672dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2482662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2483662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2484662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2485662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2486662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2487662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2488662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2489662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2490662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2491662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2492662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2493662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2494662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2495662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2496662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2497662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2498662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2499662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2500662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2501662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2502662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2503662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2504662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
25053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
25063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
25073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
25083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
25093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
25103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
25113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
25123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
25133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
25143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
25153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
25163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
25173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
25183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
25193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
25203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
25213fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25223fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
25233fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
25243fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25253fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
25263fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
25273fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25283fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
25293fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
25303fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25313fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
25323fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
25333fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25343fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
25353fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
25363fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25373fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
25383fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
25393fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
25403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
25413fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
25423fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2567662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2570662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2571662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2572662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2573662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2574662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2575662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2576662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2577662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2578662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2579662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2580662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2581662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2582662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2583662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2584662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2596662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2597662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2600662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2618d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2619d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2620d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2622d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2623d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2624d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2625d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2626d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2627d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2682b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2706c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    info->device_version = CAMERA_DEVICE_API_VERSION_3_0;
2707b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
272497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
273497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
27649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
27659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2785e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2786e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2787e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2788e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2789e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2790e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2791e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2792e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
27932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
27942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
27952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
27962dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
27972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2802a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4;
2803a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    settings.update(ANDROID_FLASH_FIRING_POWER,
2804a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            &flashFiringLevel, 1);
2805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
280747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2810b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
281147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2812b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2813b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2814b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
28169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
28179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
281962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* frame duration */
282062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int64_t default_frame_duration = NSEC_PER_33MSEC;
282162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1);
282262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
282362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* sensitivity */
282462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t default_sensitivity = 100;
282562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1);
282662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
2827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2828e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
283480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
283580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
283680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
283780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
283880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
283980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
284062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request   : request that needs to be serviced
284134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy *   @streamTypeMask : bit mask of stream types on which buffers are requested
284280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
284380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
284480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
284580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
284662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request,
284762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                    uint32_t streamTypeMask)
284880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
284980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
285080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
285162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (request->settings == NULL && mFirstRequest) {
285280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
285380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
285533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2856b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2857b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2858b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
285933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
286062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2861b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
286262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (rc < 0) {
286362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGE("%s: Failed to set hal version in the parameters", __func__);
286462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return BAD_VALUE;
286562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
286633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2867662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
286962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                sizeof(request->frame_number), &(request->frame_number));
2870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
28740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
287534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    /* Update stream id mask where buffers are requested */
287634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK,
287734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy                                sizeof(streamTypeMask), &streamTypeMask);
287834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
287934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: Failed to set stream type mask in the parameters", __func__);
288034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return BAD_VALUE;
288134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
288234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
288362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if(request->settings != NULL){
288462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        rc = translateMetadataToParameters(request);
288580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
288680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
288880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
288980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
289080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
289180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
289280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
289380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
289480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
289580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
289680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
289780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
289862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request  : request sent from framework
289980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
290080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
290180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
290280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
290380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
290480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
290562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                  (const camera3_capture_request_t *request)
290680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
290897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
290962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    frame_settings = request->settings;
29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
291797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
291853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
2919e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        int32_t expCompensation = frame_settings.find(
2920e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
2921fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min)
2922fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_min;
2923fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max)
2924fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_max;
292553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
292653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
292753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
292853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
29330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
29350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
29360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
29380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
29399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
294397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
29442b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
29452b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
29462b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
29472b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
29482b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
29492b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
29502b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
29512b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
29532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
29552b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
29562b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
29572b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
29582b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
29592b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
29602b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
29612b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
29622b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
29650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
29670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
29680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
29690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
29700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
29710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
29720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
29750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
29760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
29770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
29780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
29790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
29800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
29810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
29820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
29850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
29860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
29870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
29880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
29890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
29900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
29910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
29950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
29960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2997e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2998e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
29996356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
3000e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
3001e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
3002e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
3003e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
3004e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
3005e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
3006e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
3007e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
3008e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
3009e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
30106356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
3011e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
3012e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
3013f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang                                          fwk_aeMode);
30140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
30150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
3016e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
3017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
3018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
3019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
30200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
30230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
30240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
30250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
30260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
30270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
30280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3029d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3030d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) {
3031d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_gains_t colorCorrectGains;
3032d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 4; i++) {
3033d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            colorCorrectGains.gains[i] =
3034d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i];
3035d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3036d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3037d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS,
3038d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectGains), &colorCorrectGains);
3039d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3040d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3041d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) {
3042d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_matrix_t colorCorrectTransform;
3043d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_rational_type_t transform_elem;
3044d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        int num = 0;
3045d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 3; i++) {
3046d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           for (int j = 0; j < 3; j++) {
3047d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.numerator =
3048d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator;
3049d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.denominator =
3050d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator;
3051d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              colorCorrectTransform.transform_matrix[i][j] = transform_elem;
3052d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              num++;
3053d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           }
3054d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3055d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3056d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM,
3057d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectTransform), &colorCorrectTransform);
3058d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3059d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3060e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
3061e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
3062e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
30632dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
30642dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
30652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
30672dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
30682dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
30690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
30711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
30720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
30742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
30752dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
30762dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
30772dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
30780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
30792dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
30802dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
30810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
30822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
30830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
30899443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
30909443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
30919443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
30929443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
30939443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             fwk_sceneMode);
30949443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
3095827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
3096827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
3097827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
3098827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
3099827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
3100827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
3101827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
3102827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
31039443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                sizeof(sceneMode), &sceneMode);
31049443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
31050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
31080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
31090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
31100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
31110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
31120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
31150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
3116d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE,
31170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
31180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
31210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
31220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
31230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
31250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
3127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
31286356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        int32_t respectFlashMode = 1;
31296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
31306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t fwk_aeMode =
31316356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
31326356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
31336356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                respectFlashMode = 0;
31346356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
31356356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                    __func__);
31366356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            }
31376356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
31386356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (respectFlashMode) {
31396356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t flashMode =
31406356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
31416356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
31426356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          sizeof(FLASH_MODES_MAP),
31436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          flashMode);
31446356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
31456356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            // To check: CAM_INTF_META_FLASH_MODE usage
31466356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
31476356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                          sizeof(flashMode), &flashMode);
31486356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
3149e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
3150e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
31510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
31520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
31530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
31540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
31550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
31560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
31590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
31600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
31610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
31630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
31660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
31670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
31680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
31690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
31700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
31738867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
31740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
31750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
31770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
31780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
31810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
31820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
31830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
31840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
31850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
31880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
31890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
31900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
31960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
31970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
31980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
31990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
32020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
32030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
32040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
32060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
32070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
32100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
32110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
32128867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
32180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
32190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
32208867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
32210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
32220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
32288867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
32300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
32310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
323371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
323471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
32390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
32400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
32410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
324247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
324347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
32440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
324771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
32480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
32510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
32520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
325362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime);
32540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
32560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
32570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
32600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
32610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
326262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int64_t minFrameDuration = getMinFrameDuration(request);
326362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration);
3264e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
3265e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
326662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration);
32670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
32690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
32700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
32730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
32740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
3275e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity <
3276e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
3277e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3278e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
3279e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity >
3280e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
3281e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3282e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
328362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity);
32840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
32860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
32910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
32920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
32930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
32940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
32970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
32980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
33000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
33046990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t fwk_facedetectMode =
33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
33066990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t facedetectMode =
33076990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            lookupHalName(FACEDETECT_MODES_MAP,
33086990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode);
33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
33110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
33120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
33150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
33160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
33170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
33190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
33200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
33230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
33240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
33250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
33270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
33280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
33310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
33320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
33330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
33350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
33360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3337e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */
3338e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /*All tonemap channels will have the same number of points*/
3339e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) &&
3340e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) &&
3341e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) {
3342e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_rgb_tonemap_curves tonemapCurves;
3343e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2;
3344e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3345e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch0 = G*/
3346e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        int point = 0;
3347e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveGreen;
3348e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) {
3349d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3350e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveGreen.tonemap_points[i][j] =
3351e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point];
3352d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3353d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3354d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3355e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[0] = tonemapCurveGreen;
3356e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3357e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 1 = B */
3358e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3359e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveBlue;
3360e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3361d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3362e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveBlue.tonemap_points[i][j] =
3363e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point];
3364d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3365d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3366d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3367e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[1] = tonemapCurveBlue;
3368e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3369e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 2 = R */
3370e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3371d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_tonemap_curve_t tonemapCurveRed;
3372e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3373d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3374d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               tonemapCurveRed.tonemap_points[i][j] =
3375d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                  frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point];
3376d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3377d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3378d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3379e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[2] = tonemapCurveRed;
3380e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3381d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters,
3382e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                CAM_INTF_META_TONEMAP_CURVES,
3383e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                sizeof(tonemapCurves), &tonemapCurves);
3384d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
33850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
33870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
33880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
33890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
33900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
33910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3392662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3393d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) {
3394d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t blackLevelLock =
3395d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0];
3396d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK,
3397d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(blackLevelLock), &blackLevelLock);
3398d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3399d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3400d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) {
3401d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t lensShadingMapMode =
3402d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0];
3403d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
3404d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(lensShadingMapMode), &lensShadingMapMode);
3405d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3406d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
340759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
340859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
340971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
341062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS);
341171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
341271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
341371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
341471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
341571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
341671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
341771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
341859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
341959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
342059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
342159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
342271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
342362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS);
342471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
342571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
342671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
342771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
342871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
342971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
343071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
343159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
343259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
343359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
343459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
343571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
343662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS);
343771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
343871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
343971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
344071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
344171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
344271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
344371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
344459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
3445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
3446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
34490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
3450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
34510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
3452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
3455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
3456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
3459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
3460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
3461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
3462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
3463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
34659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
34669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
34679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
34689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
34699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
34709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
34719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
34729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
34739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
34749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
3475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
3476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
3477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
347997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
34820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
34830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
34840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
34870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
34890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
34900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
34910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
34921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
34930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
34950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
34960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
34970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
34980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
350008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
350108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
35020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
35040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
35059a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
35069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
35070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
35080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
35093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
35109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
35119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
35123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
35130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35149a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
35169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
35179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
35180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
35199a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
35209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
35210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
35249a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
35259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
35269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
35279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
35289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
35299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
35309a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
35319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
35329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
35339a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
35340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35353fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
35360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
35370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
35380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
35393fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
35403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
35410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35429a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
35430b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time;
35440b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi
35450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
35460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
35470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
35480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
354953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
355053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
355153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
355253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
355353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
35540a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
35557ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->is_jpeg_format = true;
35567ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask;
355780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
355880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
355980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
356080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
3561e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
3562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
3567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
3569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
3571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
35721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
3574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
3575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
3578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
3579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
3580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3582e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
3583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
3584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
35867ee407aa1024789089aad411c372c79423699976Ajay Dudani
3587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
3589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
3591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
3596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
3597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
3601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3602d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
36101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3611d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
36121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3632d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
36391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3640d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
36411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3657d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
36641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3665d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
36661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
36809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
36819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
36829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3685d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
369497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3696d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
37109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
37119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
37129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3714d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
371580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
371680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
371780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
371880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
37199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
372080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
37219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
37221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3723d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
37241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3742d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3751d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3769d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3772e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3773e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3775e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3776e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3777e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3778d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3779e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3783c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
3784c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3785c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
3786c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3787c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
3788c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3789c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3790c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
3791c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
3792c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3793c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush(
3794c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                const struct camera3_device *device)
3795c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
3796c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    int rc;
3797c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: E", __func__);
3798c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    QCamera3HardwareInterface *hw =
3799c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3800c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    if (!hw) {
3801c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3802c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        return -EINVAL;
3803c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    }
3804c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3805c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    rc = hw->flush();
3806c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: X", __func__);
3807c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return rc;
3808c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
3809c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3810c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
3811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3813e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3820e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3822d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3825e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3826e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3827e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3828e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3830e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3831e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3832cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3833cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3834cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3835cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3836d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3837e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3838e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3839e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
38407ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
38417ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : getWaveletDenoiseProcessPlate
38427ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38437ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate
38447ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38457ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None
38467ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38477ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : WNR prcocess plate vlaue
38487ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
38497ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate()
38507ee407aa1024789089aad411c372c79423699976Ajay Dudani{
38517ee407aa1024789089aad411c372c79423699976Ajay Dudani    char prop[PROPERTY_VALUE_MAX];
38527ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(prop, 0, sizeof(prop));
38537ee407aa1024789089aad411c372c79423699976Ajay Dudani    property_get("persist.denoise.process.plates", prop, "0");
38547ee407aa1024789089aad411c372c79423699976Ajay Dudani    int processPlate = atoi(prop);
38557ee407aa1024789089aad411c372c79423699976Ajay Dudani    switch(processPlate) {
38567ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 0:
38577ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
38587ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 1:
38597ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_CBCR_ONLY;
38607ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 2:
38617ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
38627ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 3:
38637ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
38647ee407aa1024789089aad411c372c79423699976Ajay Dudani    default:
38657ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
38667ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38677ee407aa1024789089aad411c372c79423699976Ajay Dudani}
38687ee407aa1024789089aad411c372c79423699976Ajay Dudani
38697ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
38707ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : needRotationReprocess
38717ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38727ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp
38737ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38747ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none
38757ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38767ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : true: needed
38777ee407aa1024789089aad411c372c79423699976Ajay Dudani *              false: no need
38787ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
38797ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess()
38807ee407aa1024789089aad411c372c79423699976Ajay Dudani{
38817ee407aa1024789089aad411c372c79423699976Ajay Dudani
38827ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (!mJpegSettings->is_jpeg_format) {
38837ee407aa1024789089aad411c372c79423699976Ajay Dudani        // RAW image, no need to reprocess
38847ee407aa1024789089aad411c372c79423699976Ajay Dudani        return false;
38857ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38867ee407aa1024789089aad411c372c79423699976Ajay Dudani
38877ee407aa1024789089aad411c372c79423699976Ajay Dudani    if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
38887ee407aa1024789089aad411c372c79423699976Ajay Dudani        mJpegSettings->jpeg_orientation > 0) {
38897ee407aa1024789089aad411c372c79423699976Ajay Dudani        // current rotation is not zero, and pp has the capability to process rotation
38907ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGD("%s: need do reprocess for rotation", __func__);
38917ee407aa1024789089aad411c372c79423699976Ajay Dudani        return true;
38927ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38937ee407aa1024789089aad411c372c79423699976Ajay Dudani
38947ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
38957ee407aa1024789089aad411c372c79423699976Ajay Dudani}
38967ee407aa1024789089aad411c372c79423699976Ajay Dudani
38977ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
3898c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION   : needReprocess
3899c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3900c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed
3901c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3902c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none
3903c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3904c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN     : true: needed
3905c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *              false: no need
3906c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/
3907c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess()
3908c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{
3909c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if (!mJpegSettings->is_jpeg_format) {
3910c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // RAW image, no need to reprocess
3911c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return false;
3912c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
3913c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
3914c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if ((mJpegSettings->min_required_pp_mask > 0) ||
3915c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan         isWNREnabled()) {
3916c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // TODO: add for ZSL HDR later
3917c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
3918c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
3919c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return true;
3920c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
3921c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    return needRotationReprocess();
3922c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan}
3923c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
3924c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*===========================================================================
39257ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : addOnlineReprocChannel
39267ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39277ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
39287ee407aa1024789089aad411c372c79423699976Ajay Dudani *              coming from input channel
39297ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39307ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS :
39317ee407aa1024789089aad411c372c79423699976Ajay Dudani *   @pInputChannel : ptr to input channel whose frames will be post-processed
39327ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39337ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : Ptr to the newly created channel obj. NULL if failed.
39347ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
39357ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel(
3936d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle)
39377ee407aa1024789089aad411c372c79423699976Ajay Dudani{
39387ee407aa1024789089aad411c372c79423699976Ajay Dudani    int32_t rc = NO_ERROR;
39397ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCamera3ReprocessChannel *pChannel = NULL;
39407ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (pInputChannel == NULL) {
39417ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: input channel obj is NULL", __func__);
39427ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39437ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39447ee407aa1024789089aad411c372c79423699976Ajay Dudani
39457ee407aa1024789089aad411c372c79423699976Ajay Dudani    pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
39467ee407aa1024789089aad411c372c79423699976Ajay Dudani            mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle);
39477ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (NULL == pChannel) {
39487ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: no mem for reprocess channel", __func__);
39497ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39507ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39517ee407aa1024789089aad411c372c79423699976Ajay Dudani
39527ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Capture channel, only need snapshot and postview streams start together
39537ee407aa1024789089aad411c372c79423699976Ajay Dudani    mm_camera_channel_attr_t attr;
39547ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
39557ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
39567ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue();
39577ee407aa1024789089aad411c372c79423699976Ajay Dudani    rc = pChannel->initialize();
39587ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
39597ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
39607ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
39617ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39627ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39637ee407aa1024789089aad411c372c79423699976Ajay Dudani
39647ee407aa1024789089aad411c372c79423699976Ajay Dudani    // pp feature config
39657ee407aa1024789089aad411c372c79423699976Ajay Dudani    cam_pp_feature_config_t pp_config;
39667ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
39677ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
39687ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
39697ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.sharpness = 10;
39707ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39717ee407aa1024789089aad411c372c79423699976Ajay Dudani
39727ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (isWNREnabled()) {
39737ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
39747ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.denoise_enable = 1;
39757ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate();
39767ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39777ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (needRotationReprocess()) {
39787ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
39797ee407aa1024789089aad411c372c79423699976Ajay Dudani        int rotation = mJpegSettings->jpeg_orientation;
39807ee407aa1024789089aad411c372c79423699976Ajay Dudani        if (rotation == 0) {
39817ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_0;
39827ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 90) {
39837ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_90;
39847ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 180) {
39857ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_180;
39867ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 270) {
39877ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_270;
39887ee407aa1024789089aad411c372c79423699976Ajay Dudani        }
39897ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39907ee407aa1024789089aad411c372c79423699976Ajay Dudani
39917ee407aa1024789089aad411c372c79423699976Ajay Dudani   rc = pChannel->addReprocStreamsFromSource(pp_config,
39927ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             pInputChannel,
39937ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             mMetadataChannel);
39947ee407aa1024789089aad411c372c79423699976Ajay Dudani
39957ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
39967ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
39977ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39987ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39997ee407aa1024789089aad411c372c79423699976Ajay Dudani    return pChannel;
40007ee407aa1024789089aad411c372c79423699976Ajay Dudani}
40017ee407aa1024789089aad411c372c79423699976Ajay Dudani
40027ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue()
40037ee407aa1024789089aad411c372c79423699976Ajay Dudani{
40047ee407aa1024789089aad411c372c79423699976Ajay Dudani    return gCamCapability[mCameraId]->min_num_pp_bufs;
40057ee407aa1024789089aad411c372c79423699976Ajay Dudani}
40067ee407aa1024789089aad411c372c79423699976Ajay Dudani
4007acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() {
4008acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan    return gCamCapability[mCameraId]->isWnrSupported;
4009acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan}
4010acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan
4011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
4012