QCamera3HWI.cpp revision 14dfc272241ba78c85a327da2872e71b3208f8c5
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;
4750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
479d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
480d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
483d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
486c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
487c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
488c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
4890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
5011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
5020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
5030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
5060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
5080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
5090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
5101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
5120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
514c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
517e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
522c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
523c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
524c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
5280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
5291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
542020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    //mMetadataChannel->stop();
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
550f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
551f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
552f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
553f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
554f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
555f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
556f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
557f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
558c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                /* For video encoding stream, set read/write rarely
559c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                 * flag so that they may be set to un-cached */
560c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER)
561c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage =
562c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         (GRALLOC_USAGE_SW_READ_RARELY |
563c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_SW_WRITE_RARELY |
564c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_HW_CAMERA_WRITE);
565c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                else
566c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
570f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5788867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
579f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
580c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
581c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
582c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
583c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
5848bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
585c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
586c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
587c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
588c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
589c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
590c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
591f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
592f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
593f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
594f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
595f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
596f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
597f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
598f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
599f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
600f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
601f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
602f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
6037ee407aa1024789089aad411c372c79423699976Ajay Dudani                    mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle,
604f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
605f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
6067ee407aa1024789089aad411c372c79423699976Ajay Dudani                    if (mPictureChannel == NULL) {
607f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
610f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
6117ee407aa1024789089aad411c372c79423699976Ajay Dudani                    newStream->priv = (QCamera3Channel*)mPictureChannel;
612f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
613f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
614f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
615f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
616f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
617f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
6258867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
6261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
6271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
6281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
6291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
6301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
6311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
6321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
6331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
6341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
6351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
6361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
6371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
6381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
6391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
640a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
641e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
6420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
6461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
6471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
6481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
6491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
6501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
6510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
6541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
6551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
656d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    /*flush the metadata list*/
657d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
658d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
659d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
660d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
661d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
662d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
663d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
664d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
665d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
66633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
6679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
66833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
66933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
67062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Get min frame duration for this streams configuration
67162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    deriveMinFrameDuration();
67262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
67433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
68180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
68280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
68380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
68480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
68580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
68680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
68780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
688e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
6899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
69080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
714c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
715c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
716c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
717c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
718c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
719c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
720c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
721c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
722c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
723c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
724c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
725c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
726c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
727c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
728c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
729c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
730c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
731c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
732c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
733c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
734c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
735c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
736c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
7379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
7409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
7419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
7429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
7439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
7469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
7509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
7519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
7679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
77262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : deriveMinFrameDuration
77362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
77462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based
77562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              on currently configured streams.
77662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
77762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE
77862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
77962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : NONE
78062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
78162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
78262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration()
78362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
78462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t maxJpegDimension, maxProcessedDimension;
78562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
78662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxJpegDimension = 0;
78762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxProcessedDimension = 0;
78862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
78962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    // Figure out maximum jpeg, processed, and raw dimensions
79062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (List<stream_info_t*>::iterator it = mStreamInfo.begin();
79162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        it != mStreamInfo.end(); it++) {
79262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
79362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        // Input stream doesn't have valid stream_type
79462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT)
79562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            continue;
79662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
79762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int32_t dimension = (*it)->stream->width * (*it)->stream->height;
79862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) {
79962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxJpegDimension)
80062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxJpegDimension = dimension;
80162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) {
80262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxProcessedDimension)
80362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxProcessedDimension = dimension;
80462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
80562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
80662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
80762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Assume all jpeg dimensions are in processed dimensions.
80862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (maxJpegDimension > maxProcessedDimension)
80962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        maxProcessedDimension = maxJpegDimension;
81062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
81162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Find minimum durations for processed, jpeg, and raw
81262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration;
81362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
81462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (maxProcessedDimension ==
81562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].width *
81662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].height) {
81762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
81862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
81962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            break;
82062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
82162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
82262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
82362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
82462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : getMinFrameDuration
82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations
82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              and current request configuration.
82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks
83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : min farme duration for a particular request
83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request)
83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    bool hasJpegStream = false;
83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (uint32_t i = 0; i < request->num_output_buffers; i ++) {
83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        const camera3_stream_t *stream = request->output_buffers[i].stream;
84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (stream->format == HAL_PIXEL_FORMAT_BLOB)
84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            hasJpegStream = true;
84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (!hasJpegStream)
84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration);
84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    else
84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration);
84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
85062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
857e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
859e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
860e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
8931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
8941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
8951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
8960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
8971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
8981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
8991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
9001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
9010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
9020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
9030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
9040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
9061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
9070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
9090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
9100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
914e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
917e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
918e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
919e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
920e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
921e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
922e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
923e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
924e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
925e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
926e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
927e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
929e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
930e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
931e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
932e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
936e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
93774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
939d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    MetadataBufferInfo reproc_meta;
940d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    int queueMetadata = 0;
941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9442123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    rc = validateCaptureRequest(request);
9452123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    if (rc != NO_ERROR) {
9462123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
9472123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        pthread_mutex_unlock(&mMutex);
9482123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        return rc;
9492123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    }
9502123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9512123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    meta = request->settings;
9522123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9532123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // For first capture request, send capture intent, and
9542123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // stream on all streams
955d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    if (mFirstRequest) {
9562123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9572123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
9582123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            int32_t hal_version = CAM_HAL_V3;
9592123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            uint8_t captureIntent =
9602123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
9612123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9622123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            memset(mParameters, 0, sizeof(parm_buffer_t));
9632123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
9642123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
9652123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(hal_version), &hal_version);
9662123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
9672123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(captureIntent), &captureIntent);
9682123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mCameraHandle->ops->set_parms(mCameraHandle->camera_handle,
9692123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                mParameters);
9702123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        }
9712123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
972d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
973d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            it != mStreamInfo.end(); it++) {
974d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
975d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            channel->start();
976d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        }
977d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    }
978d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang
979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
98034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    uint32_t streamTypeMask = 0;
9819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
98274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
98374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
98474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
985013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
98674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
98774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
98874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
98974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
99074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
991013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
99274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
99374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
99474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
995d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    ALOGE("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
996c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
997c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
998c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
999c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
1000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
10017ee407aa1024789089aad411c372c79423699976Ajay Dudani    int blob_request = 0;
1002e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
1003e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
100434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1005e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
100666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
100766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
100866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
10097ee407aa1024789089aad411c372c79423699976Ajay Dudani            blob_request = 1;
101066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
101166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
10120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
101366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
101466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
101566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
101666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
101766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
1018e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
1019e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
1020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
1021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
1022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
1023e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
102434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        streamTypeMask |= channel->getStreamTypeMask();
102534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
102634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
102762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = setFrameParameters(request, streamTypeMask);
102834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
102934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: fail to set frame parameters", __func__);
103034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        pthread_mutex_unlock(&mMutex);
103134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return rc;
1032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1033e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
103874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
10397ee407aa1024789089aad411c372c79423699976Ajay Dudani    pendingRequest.blob_request = blob_request;
104013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0;
104174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
10441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
1053e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
10549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
10559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
10569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
10579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
10589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1059c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
106066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
10619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
10629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
10639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
10649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
10659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
106666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
1067c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
1068c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
1069c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
1070c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
1071c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
1072c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
1073c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
1074c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
1075c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
1076c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
1077c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
1078c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
1079c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
1080c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
1081c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
108241da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                    ALOGD("Handle:%p", request->input_buffer->buffer);
1083d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    //TODO: need to get corresponding metadata and send it to pproc
1084d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1085d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         m != mStoredMetadataList.end(); m++) {
1086d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->input_buffer->buffer) {
1087d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            reproc_meta.meta_buf = m->meta_buf;
1088d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            queueMetadata = 1;
1089d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1090d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1091d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1092c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
1093c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
1094c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
1095c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
1096d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (queueMetadata) {
109741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false);
1098d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
109966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
1100d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__,
1101a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
1102d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1103d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1104d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                     m != mStoredMetadataList.end(); m++) {
1105d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (uint32_t j = 0; j < request->num_output_buffers; j++) {
1106d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->output_buffers[j].buffer) {
1107d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mMetadataChannel->bufDone(m->meta_buf);
1108d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            free(m->meta_buf);
1109d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            m = mStoredMetadataList.erase(m);
1110d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1111d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1112d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1113d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1114d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
111566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
111666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
11179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
11189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
11199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
11211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
11221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
11239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
11249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
11259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
11265b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang        pthread_cond_wait(&mRequestCond, &mMutex);
11279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1129e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
113080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
113180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
113280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
11339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
1134e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
11359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
1136e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
11379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
11389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
1139e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1140e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1141e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1142e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1143b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
1144b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
1145e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1146e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
1147e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1148e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1149e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1150e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1152e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1153e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1154e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1155e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
1157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
1159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1160e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1165b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
1166e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1172e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1175e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1176c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
1177c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
1178c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1179c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
1180c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1181c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
1182c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1183c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1184c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
1185c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
1186c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush()
1187c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
1188c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*Enable lock when we implement this function*/
1189c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*
1190c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_lock(&mMutex);
1191c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
1192c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_unlock(&mMutex);
1193c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    */
1194c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return 0;
1195c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
11967ee407aa1024789089aad411c372c79423699976Ajay Dudani
1197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
1199e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
120033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
120133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
1202e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1203e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1204e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
120533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
120633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
12079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
12089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
12099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
12101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1211e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
12129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
12135b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_lock(&mMutex);
1214e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
12151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
12161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
121733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
121833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
1219152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        uint32_t pending_requests = *(uint32_t *)POINTER_OF(
1220152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang            CAM_INTF_META_PENDING_REQUESTS, metadata);
122133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
122233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
12230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
12240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
12260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
12270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
12281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
1229a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
12301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
12311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
12321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1233a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1234e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
12351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
12371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1238e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
12391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
12401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
1241a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
12421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
12441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
1245e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1246e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
1247e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
1248e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
1249e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
1250e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
1251e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
1252e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1253e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
12541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
12551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
12561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
1257e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
12581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
1259a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1260e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
12611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
12631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
12641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
126599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
126699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1267e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
126899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
126974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
127099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
12711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
1272e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
127374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
1274d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (mIsZslMode) {
1275d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   int found_metadata = 0;
1276d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   //for ZSL case store the metadata buffer and corresp. ZSL handle ptr
1277d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1278d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        j != i->buffers.end(); j++) {
1279d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1280d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         //check if corresp. zsl already exists in the stored metadata list
1281d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1282d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m != mStoredMetadataList.begin(); m++) {
1283d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            if (m->frame_number == frame_number) {
1284d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m->meta_buf = metadata_buf;
1285d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               found_metadata = 1;
1286d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               break;
1287d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            }
1288d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1289d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         if (!found_metadata) {
1290d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            MetadataBufferInfo store_meta_info;
1291d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.meta_buf = metadata_buf;
1292d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.frame_number = frame_number;
1293d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mStoredMetadataList.push_back(store_meta_info);
1294d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            found_metadata = 1;
1295d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1296d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      }
1297d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1298d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   if (!found_metadata) {
129913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       if (!i->input_buffer_present && i->blob_request) {
130013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          //livesnapshot or fallback non-zsl snapshot case
130113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
130213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                j != i->buffers.end(); j++){
130313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT &&
130413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                  j->stream->format == HAL_PIXEL_FORMAT_BLOB) {
130541da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                                 mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
130613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                 break;
130713c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              }
130813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                         }
130913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       } else {
131013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            //return the metadata immediately
131113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            mMetadataChannel->bufDone(metadata_buf);
131213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            free(metadata_buf);
131313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       }
1314d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1315d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else if (!mIsZslMode && i->blob_request) {
13167ee407aa1024789089aad411c372c79423699976Ajay Dudani                   //If it is a blob request then send the metadata to the picture channel
131741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                   mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
1318d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else {
13197ee407aa1024789089aad411c372c79423699976Ajay Dudani                   // Return metadata buffer
13207ee407aa1024789089aad411c372c79423699976Ajay Dudani                   mMetadataChannel->bufDone(metadata_buf);
13217ee407aa1024789089aad411c372c79423699976Ajay Dudani                   free(metadata_buf);
1322d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               }
1323d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
13241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
13261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
13271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
13291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
1330e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
13311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1332e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
13391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
13401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
13411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
13431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
13451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1346e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
13471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
13481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
13491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
135013dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang                        j->buffer = NULL;
13511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
13521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
13531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
13551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1357a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1358d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
13591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
13601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
13611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
13621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1363d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                ALOGE("%s: meta frame_number = %d, capture_time = %lld",
1364d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
13651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
13661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
13681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
13691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
137033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
137133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
13721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
13731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
13741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
13751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1376e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
13771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
13781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
13791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
13801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1382152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        if (!max_buffers_dequeued && !pending_requests) {
13831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
13841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
13851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
13861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
13871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
13881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
13891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
13901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
13911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1392c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
13931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
1394c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
13951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
13961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
13971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1398e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
13991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
14001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
14011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
14021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
14051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
140633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
14081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1409a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1410e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
14111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1412d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1413d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                int found = 0;
1414d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin();
1415d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      k != mStoredMetadataList.end(); k++) {
1416d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    if (k->frame_number == frame_number) {
1417d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        k->zsl_buf_hdl = buffer->buffer;
1418d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        found = 1;
1419d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        break;
1420d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1421d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1422d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (!found) {
1423d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   MetadataBufferInfo meta_info;
1424d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.frame_number = frame_number;
1425d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.zsl_buf_hdl = buffer->buffer;
1426d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   mStoredMetadataList.push_back(meta_info);
1427d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1428d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
1429e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
143033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
14311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1432e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
14341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
14351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
14361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
14371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
14381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
14391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1440a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1441e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
14421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
14431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1445e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
14469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
14475b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_unlock(&mMutex);
14489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
14499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
14509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
145197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
145297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
145397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
145497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
145597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
145697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
145797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
145897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
145997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
146097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
146197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
146297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
146397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
146474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
146574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
146697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
146797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
146897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
146997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
14700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
147174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
147297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
147397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
147497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
147597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
147697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
147797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
147897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
147997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
148097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
148197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
148297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
148397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
148497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
148597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
148697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
148797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
148997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
149059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
149297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
149397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
149597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
149699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
149799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
149899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
149999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
150097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
150199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
150399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15058867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
15060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
151297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
151697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
151759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
151897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
151913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab
152013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    uint8_t *ae_state =
15218bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
152213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
152313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab
15240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
15250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
152697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
152797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
152897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
152997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
153197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
153259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
153497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
153997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
154197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
15430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
154497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
154597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
154697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
154797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
154997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
155059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
155297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
15540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
155597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
155697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
155897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
155997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1560d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata);
156197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
156297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
15640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
156597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
156697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
156797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
156897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
156997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
157097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
157197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
157297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
157397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
157497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
15760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
157797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
157897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
15800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
158197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
158297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
158397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
158497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
158597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
158697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
158797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
158897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
158997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
159097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
159197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
159297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
159397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
159497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
159597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
159697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
159797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
159897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
159997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
160097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
160197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
160297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
16040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
16050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
160697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
160797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
160897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
160997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
161097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
16120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
161397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
161497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
161597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
161697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
161897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
161971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
16200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
16210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
16220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
162371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
162471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
162597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
162697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
162797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
16280b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mMetadataResponse.exposure_time = *sensorExpTime;
162962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime);
163097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
163197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
163297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
163397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
163462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration);
163597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
163697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
163797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
163897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
163962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity);
16403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
164197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
164297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
16440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
164597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
164697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
16480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
16496990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP,
16506990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]),
16516990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        *faceDetectMode);
16526990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1);
165397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
16550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
165697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
165797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
16590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
166097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
166197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
166297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
166397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
166497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
166597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
166697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
166797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
166897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
166997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1670d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *)
1671d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata);
1672d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height;
1673d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    int map_width  = gCamCapability[mCameraId]->lens_shading_map_size.width;
1674d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP,
1675d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (float*)lensShadingMap->lens_shading,
1676d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       4*map_width*map_height);
1677d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1678d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*)
1679d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata);
1680d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4);
1681d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1682d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*)
1683d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata);
1684d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM,
1685d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3);
1686d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1687d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*)
1688d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata);
1689d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS,
1690d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       predColorCorrectionGains->gains, 4);
1691d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1692d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*)
1693d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata);
1694d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM,
1695d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3);
1696d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1697d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t *blackLevelLock = (uint8_t*)
1698d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata);
1699d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1);
1700d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1701d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t *sceneFlicker = (uint8_t*)
1702d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata);
1703d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1);
1704d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1705d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
170697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
170733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
170897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
170997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
171097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
171159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
171297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
171397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
171497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
171597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
171697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
171797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
171897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
171997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
172097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
172197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
172259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
172397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
172497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
172559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
172659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
172797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
172997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
173097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
173159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
173259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
173359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
173459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
173559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
173659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
173759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
173859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
173959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
174059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
174159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
174259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
174359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
174459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
174559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
174659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
174759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
174859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
174959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
175059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
175159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
175259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
175359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
175459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
175559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
175659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
175759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
175859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
175959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
176097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
176171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
176271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
176371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
176471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
176571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
176671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
176771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
176871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
176971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
177071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
177171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
177271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
177371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
177471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
177571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
177671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
177771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
177871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
177971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
178071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
178171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
178271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
178371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
178471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
178571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
178671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
178771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
178871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
178971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
179071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
179171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
179271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
179371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
179471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
179571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
179671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
179771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
179871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
179971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
180071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
180171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
180271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
180397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
180497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
180597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
180697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
180797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
180897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
180997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
181097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
181197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
181297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
181397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
181497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
181597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
181697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
181797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
181897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
181997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
182097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
182197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
182297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1894e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1906662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1910662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1911662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1912662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1913662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1914662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1915662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1922662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
194633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
194733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
194833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
194933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
195033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
195133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
195233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
195333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
195433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
195533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
195633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
195733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
195833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
195933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
196033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
196133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
196233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
196333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
196433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
196533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
196633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
19670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
19680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
19700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
19720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
19740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
19750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
19760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
19770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
19780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
19790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
19800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
19810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
19820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
19830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
19840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
19850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
19860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
19870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
19880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
19890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
19900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
2000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
2001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
2003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
200597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
2006c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2007c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
2008c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
2009c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
2010c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
2011c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
2013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
20142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
20152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
20162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
20252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
2028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
2029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2030c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
2031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
2032c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
2033c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
2034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
2036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
2037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
2038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
2040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
2041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
2042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
2045c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
2047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
204880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
204980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
205080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
205180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
205247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
205380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
205480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
205580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
205680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
2057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
205847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
20590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
206080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
206180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
206280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
206380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
206480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
206580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
2066c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
206780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
206880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
206980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
207080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
207280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
207380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
207580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
207680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
2079c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
208080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
208147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
208280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
208380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
208480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
208580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
208622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
208722817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
208880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
208980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
209022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
209180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
209380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
2094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
209580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
209680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
209780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
209980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
210080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
210280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
210380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
21056990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                      (int*)&gCamCapability[cameraId]->max_num_roi, 1);
210680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
210880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
210980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
211180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
211280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
211480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
211580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
211780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
211880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
212080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
212180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
212480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
212580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
212680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212722817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
212822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
212922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
2131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
21328867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
2133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
213447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
213500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
213600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
2139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
214000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2);
214100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2142e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
214300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
214400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
21450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
214647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
21470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
21480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
21490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
2150c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
2151c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
2152c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
215347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
2154c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
2155c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
2156c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
2157c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
2158c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2159c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
216047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
2161c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
2162c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
2163c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2164b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
21659443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
2166c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
2167c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
2168c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
216947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
2170c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
2171c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
2172c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
217347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
21746990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
21756990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_FULL };
2176c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
2177c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
2178c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
2179c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
218047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
2181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
2183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
2184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
2185662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
218647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
218780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
218880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
218980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
219080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
219180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
2192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
219380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
219480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
2195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2196662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
219700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                available_processed_sizes,
2198c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
2199c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2200c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
220108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
220208ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
2203662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
220447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
220597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
220697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
220797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
220897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
220997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
221097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
221197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
221297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
221397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
221497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
221597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
221697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
221747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
22180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
2219662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
22200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
2221b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
22220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
22230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
22250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
2229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
22300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
223247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
2233e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
22342dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
2235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
22360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
2237b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
22380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
22390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
2240e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
2241e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
22422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
22430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2245e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
2247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
22482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
225047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
2251e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
2252e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
2253e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
22549443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
22559443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
2256e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
2257e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
2258e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
2259e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
226047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
22610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
22630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
2264b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
2265b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
22660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
22680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
22700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
2273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
22740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
227647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
22770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
22790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
2280b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
22810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
22820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
22840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
2288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
22890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2290662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
229147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
22920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
22940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
2295b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
22970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
22990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
23000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
2303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
23040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2305662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2306a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX];
2307a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++)
2308a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava      available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i];
2309a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2310a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    staticInfo.update(ANDROID_FLASH_FIRING_POWER,
2311a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            available_flash_levels,
2312a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            gCamCapability[cameraId]->supported_flash_firing_level_cnt);
2313a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
231500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    uint8_t flashAvailable = gCamCapability[cameraId]->flash_available;
2316e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2317e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2318e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2319e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2320e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2321e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2322e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2323e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2324e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2325e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2326e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2327e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2328e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2329e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2332e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2333ea44a483c0e98200c058a85ea339457616516847Zhijun He
2334e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    int32_t sensitivity_range[2];
2335e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2336e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2337ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2338ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2339ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
23402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
234173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
234273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
234300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
234400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
234573c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2346e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2347e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
234873c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
234900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle;
235000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_SENSOR_ORIENTATION,
235100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &sensor_orientation,
235200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
235300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
235400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t max_output_streams[3] = {1, 3, 1};
235500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
235600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      max_output_streams,
235700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      3);
235800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2359b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2364662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2371662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2372662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2373662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2374662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2375662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2376662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2377662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2378662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2379662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2380662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2381662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
23820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
23830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
23840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
23850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
23860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
23870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
23880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
23890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
23900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
23910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2392c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
23930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
23940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
23950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2396c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2397c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
23980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
23990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
24012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
24022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
24032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
24042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
24062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
24082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
24112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2412e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
24139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
24149443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
24152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
24162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
24172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
24182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
24199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
24209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
24212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
24229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2423e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
2424e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani        overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON;
24259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
24269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
24279443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
24289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
24299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
24309443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
24319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
24329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
24339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
24349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
24359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
24369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
24379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
24389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
24399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
24409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
24419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
24422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
24432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
24442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
24452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2465662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2466662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2467662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2482662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
24833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
24843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
24863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
24883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
24903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
24923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
24933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
24943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
24953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
24963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
24973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
24983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
24993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
25013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
25023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
25043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
25053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
25073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
25083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
25103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
25113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
25133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
25143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
25163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
25173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
25183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
25193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
25203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2567662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2570662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2571662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2572662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2573662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2574662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2575662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2576662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2577662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2578662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2579662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2580662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2581662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2582662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2583662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2584662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2596d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2597d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2598d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2600d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2601d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2602d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2603d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2604d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2605d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2660b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2684c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    info->device_version = CAMERA_DEVICE_API_VERSION_3_0;
2685b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
270297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2705e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2707e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
271297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
27429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
27439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2764e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2765e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2766e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2767e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2768e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2769e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2770e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
27712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
27722dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
27732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
27742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
27752dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2780a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4;
2781a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    settings.update(ANDROID_FLASH_FIRING_POWER,
2782a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            &flashFiringLevel, 1);
2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
278547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2788b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
278947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2790b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2791b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2792b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
27949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
27959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
279762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* frame duration */
279862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int64_t default_frame_duration = NSEC_PER_33MSEC;
279962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1);
280062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
280162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* sensitivity */
280262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t default_sensitivity = 100;
280362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1);
280462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
2805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
281280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
281380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
281480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
281580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
281680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
281780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
281862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request   : request that needs to be serviced
281934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy *   @streamTypeMask : bit mask of stream types on which buffers are requested
282080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
282180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
282280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
282380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
282462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request,
282562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                    uint32_t streamTypeMask)
282680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
282780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
282880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
282962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (request->settings == NULL && mFirstRequest) {
283080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
283180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2832662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
283333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2834b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2835b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2836b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
283733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
283862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2839b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
284062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (rc < 0) {
284162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGE("%s: Failed to set hal version in the parameters", __func__);
284262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return BAD_VALUE;
284362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
284433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2846662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
284762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                sizeof(request->frame_number), &(request->frame_number));
2848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2851662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
28520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
285334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    /* Update stream id mask where buffers are requested */
285434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK,
285534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy                                sizeof(streamTypeMask), &streamTypeMask);
285634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
285734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: Failed to set stream type mask in the parameters", __func__);
285834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return BAD_VALUE;
285934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
286034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
286162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if(request->settings != NULL){
286262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        rc = translateMetadataToParameters(request);
286380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
286480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2865662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
286680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
286780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
286880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
286980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
287080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
287180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
287380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
287662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request  : request sent from framework
287780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
288080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
288180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
288280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
288362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                  (const camera3_capture_request_t *request)
288480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
288697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
288762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    frame_settings = request->settings;
28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
28900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
28910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
289597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
289653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
2897e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        int32_t expCompensation = frame_settings.find(
2898e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
2899fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min)
2900fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_min;
2901fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max)
2902fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_max;
290353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
290453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
290553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
290653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
29070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
29179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
29200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
292197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
29222b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
29232b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
29242b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
29252b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
29262b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
29272b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
29282b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
29292b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
29312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
29332b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
29342b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
29352b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
29362b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
29372b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
29382b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
29392b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
29402b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
29430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
29490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
29500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
29530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
29550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
29560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
29570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
29580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
29590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
29600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
29650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
29660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
29670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
29680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
29690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
29700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
29730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
29740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2975e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2976e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
29776356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2978e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2979e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2980e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2981e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2982e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2983e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2984e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2985e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2986e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2987e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
29886356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2989e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2990e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2991f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang                                          fwk_aeMode);
29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
29930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2994e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2995e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2996e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2997e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
29980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
30010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
30020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
30030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
30040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
30050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
30060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3007d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3008d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) {
3009d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_gains_t colorCorrectGains;
3010d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 4; i++) {
3011d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            colorCorrectGains.gains[i] =
3012d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i];
3013d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3014d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3015d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS,
3016d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectGains), &colorCorrectGains);
3017d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3018d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3019d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) {
3020d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_matrix_t colorCorrectTransform;
3021d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_rational_type_t transform_elem;
3022d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        int num = 0;
3023d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 3; i++) {
3024d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           for (int j = 0; j < 3; j++) {
3025d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.numerator =
3026d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator;
3027d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.denominator =
3028d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator;
3029d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              colorCorrectTransform.transform_matrix[i][j] = transform_elem;
3030d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              num++;
3031d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           }
3032d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3033d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3034d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM,
3035d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectTransform), &colorCorrectTransform);
3036d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3037d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3038e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
3039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
3040e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
30412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
30422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
30432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
30440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
30452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
30462dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
30470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
30491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
30500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
30522dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
30532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
30542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
30552dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
30560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
30572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
30582dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
30590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
30602dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
30640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
30650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
30679443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
30689443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
30699443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
30709443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
30719443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             fwk_sceneMode);
30729443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
3073827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
3074827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
3075827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
3076827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
3077827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
3078827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
3079827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
3080827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
30819443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                sizeof(sceneMode), &sceneMode);
30829443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
30830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
30890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
30900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
30930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
3094d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE,
30950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
30960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
30990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
31000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
31010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
31030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
3105e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
31066356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        int32_t respectFlashMode = 1;
31076356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
31086356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t fwk_aeMode =
31096356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
31106356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
31116356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                respectFlashMode = 0;
31126356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
31136356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                    __func__);
31146356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            }
31156356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
31166356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (respectFlashMode) {
31176356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t flashMode =
31186356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
31196356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
31206356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          sizeof(FLASH_MODES_MAP),
31216356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          flashMode);
31226356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
31236356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            // To check: CAM_INTF_META_FLASH_MODE usage
31246356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
31256356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                          sizeof(flashMode), &flashMode);
31266356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
3127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
3128e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
31290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
31300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
31310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
31320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
31330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
31340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
31370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
31380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
31390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
31410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
31440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
31450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
31460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
31470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
31480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
31518867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
31520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
31530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
31550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
31560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
31590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
31600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
31610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
31620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
31630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
31660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
31670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
31680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
31690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
31700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
31730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
31740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
31750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
31760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
31770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
31800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
31810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
31820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
31840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
31850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
31880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
31890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
31908867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
31960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
31970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
31988867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
31990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
32000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
32010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
32040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
32050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
32068867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
32070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
321171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
321271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
32180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
32190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
322047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
322147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
32220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
32240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
322571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
32300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
323162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime);
32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
32340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
32390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
324062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int64_t minFrameDuration = getMinFrameDuration(request);
324162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration);
3242e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
3243e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
324462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration);
32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
32470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
32480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
32510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
32520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
3253e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity <
3254e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
3255e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3256e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
3257e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity >
3258e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
3259e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3260e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
326162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity);
32620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
32640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
32650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
32680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
32690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
32700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
32710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
32720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
32750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
32760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
32770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
32780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
32790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
32826990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t fwk_facedetectMode =
32830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
32846990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t facedetectMode =
32856990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            lookupHalName(FACEDETECT_MODES_MAP,
32866990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode);
32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
32890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
32930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
32940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
32950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
32970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
32980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
33060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
33110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
33130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
33140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3315e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */
3316e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /*All tonemap channels will have the same number of points*/
3317e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) &&
3318e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) &&
3319e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) {
3320e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_rgb_tonemap_curves tonemapCurves;
3321e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2;
3322e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3323e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch0 = G*/
3324e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        int point = 0;
3325e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveGreen;
3326e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) {
3327d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3328e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveGreen.tonemap_points[i][j] =
3329e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point];
3330d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3331d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3332d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3333e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[0] = tonemapCurveGreen;
3334e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3335e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 1 = B */
3336e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3337e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveBlue;
3338e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3339d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3340e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveBlue.tonemap_points[i][j] =
3341e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point];
3342d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3343d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3344d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3345e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[1] = tonemapCurveBlue;
3346e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3347e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 2 = R */
3348e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3349d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_tonemap_curve_t tonemapCurveRed;
3350e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3351d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3352d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               tonemapCurveRed.tonemap_points[i][j] =
3353d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                  frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point];
3354d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3355d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3356d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3357e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[2] = tonemapCurveRed;
3358e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3359d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters,
3360e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                CAM_INTF_META_TONEMAP_CURVES,
3361e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                sizeof(tonemapCurves), &tonemapCurves);
3362d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
33630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
33650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
33660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
33670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
33680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
33690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3371d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) {
3372d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t blackLevelLock =
3373d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0];
3374d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK,
3375d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(blackLevelLock), &blackLevelLock);
3376d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3377d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3378d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) {
3379d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t lensShadingMapMode =
3380d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0];
3381d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
3382d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(lensShadingMapMode), &lensShadingMapMode);
3383d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3384d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
338559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
338659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
338771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
338862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS);
338971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
339071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
339171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
339271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
339371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
339471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
339571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
339659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
339759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
339859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
339959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
340071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
340162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS);
340271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
340371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
340471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
340571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
340671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
340771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
340871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
340959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
341059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
341159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
341259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
341371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
341462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS);
341571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
341671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
341771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
341871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
341971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
342071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
342171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
342259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
3423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
3424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3426662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
34270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
3428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
34290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
3430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
3433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
3434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
3437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
3438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
3439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
3440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
3441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
34439a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
34449a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
34459a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
34469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
34479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
34489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
34499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
34509a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
34519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
34529a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
3453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
3454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
3455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
345797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
34620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
34630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
34640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
34650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
34670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
34690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
34701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
34760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
34770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
347808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
347908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
34800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
34820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
34839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
34849a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
34873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
34889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
34899a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
34903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
34910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34929a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
34930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
34949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
34959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
34960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
34979a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
34989a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
35029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
35039a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
35049a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
35059a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
35069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
35079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
35089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
35099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
35109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
35119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
35120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
35140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
35160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
35173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
35183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
35190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
35210b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time;
35220b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi
35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
35250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
35260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
352753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
352853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
352953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
353053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
353153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
35320a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
35337ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->is_jpeg_format = true;
35347ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask;
353580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
353680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
353780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
353880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
3539e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
3540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
3545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
3547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
3549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
35501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
3552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
3553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
3556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
3557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
3558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3560e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
3561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
3562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
35647ee407aa1024789089aad411c372c79423699976Ajay Dudani
3565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
3567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
3569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
3574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
3575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
3579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3580d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
35881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3589d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
35901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3610d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
36171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3618d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
36191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3635d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
36421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3643d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
36441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
36589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
36599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
36609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3663d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
367297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3674d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
36889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
36899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
36909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3692d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
369380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
369480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
369580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
369680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
36979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
369880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
36999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
37001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3701d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
37021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3720d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3729d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3747d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3756d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3761c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
3762c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3763c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
3764c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3765c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
3766c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3767c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3768c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
3769c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
3770c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3771c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush(
3772c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                const struct camera3_device *device)
3773c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
3774c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    int rc;
3775c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: E", __func__);
3776c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    QCamera3HardwareInterface *hw =
3777c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3778c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    if (!hw) {
3779c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3780c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        return -EINVAL;
3781c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    }
3782c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3783c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    rc = hw->flush();
3784c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: X", __func__);
3785c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return rc;
3786c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
3787c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3788c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
3789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3800d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3810cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3811cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3812cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3813cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3814d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
38187ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
38197ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : getWaveletDenoiseProcessPlate
38207ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38217ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate
38227ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38237ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None
38247ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38257ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : WNR prcocess plate vlaue
38267ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
38277ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate()
38287ee407aa1024789089aad411c372c79423699976Ajay Dudani{
38297ee407aa1024789089aad411c372c79423699976Ajay Dudani    char prop[PROPERTY_VALUE_MAX];
38307ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(prop, 0, sizeof(prop));
38317ee407aa1024789089aad411c372c79423699976Ajay Dudani    property_get("persist.denoise.process.plates", prop, "0");
38327ee407aa1024789089aad411c372c79423699976Ajay Dudani    int processPlate = atoi(prop);
38337ee407aa1024789089aad411c372c79423699976Ajay Dudani    switch(processPlate) {
38347ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 0:
38357ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
38367ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 1:
38377ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_CBCR_ONLY;
38387ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 2:
38397ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
38407ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 3:
38417ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
38427ee407aa1024789089aad411c372c79423699976Ajay Dudani    default:
38437ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
38447ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38457ee407aa1024789089aad411c372c79423699976Ajay Dudani}
38467ee407aa1024789089aad411c372c79423699976Ajay Dudani
38477ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
38487ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : needRotationReprocess
38497ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38507ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp
38517ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38527ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none
38537ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38547ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : true: needed
38557ee407aa1024789089aad411c372c79423699976Ajay Dudani *              false: no need
38567ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
38577ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess()
38587ee407aa1024789089aad411c372c79423699976Ajay Dudani{
38597ee407aa1024789089aad411c372c79423699976Ajay Dudani
38607ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (!mJpegSettings->is_jpeg_format) {
38617ee407aa1024789089aad411c372c79423699976Ajay Dudani        // RAW image, no need to reprocess
38627ee407aa1024789089aad411c372c79423699976Ajay Dudani        return false;
38637ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38647ee407aa1024789089aad411c372c79423699976Ajay Dudani
38657ee407aa1024789089aad411c372c79423699976Ajay Dudani    if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
38667ee407aa1024789089aad411c372c79423699976Ajay Dudani        mJpegSettings->jpeg_orientation > 0) {
38677ee407aa1024789089aad411c372c79423699976Ajay Dudani        // current rotation is not zero, and pp has the capability to process rotation
38687ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGD("%s: need do reprocess for rotation", __func__);
38697ee407aa1024789089aad411c372c79423699976Ajay Dudani        return true;
38707ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38717ee407aa1024789089aad411c372c79423699976Ajay Dudani
38727ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
38737ee407aa1024789089aad411c372c79423699976Ajay Dudani}
38747ee407aa1024789089aad411c372c79423699976Ajay Dudani
38757ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
3876c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION   : needReprocess
3877c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3878c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed
3879c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3880c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none
3881c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3882c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN     : true: needed
3883c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *              false: no need
3884c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/
3885c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess()
3886c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{
3887c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if (!mJpegSettings->is_jpeg_format) {
3888c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // RAW image, no need to reprocess
3889c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return false;
3890c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
3891c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
3892c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if ((mJpegSettings->min_required_pp_mask > 0) ||
3893c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan         isWNREnabled()) {
3894c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // TODO: add for ZSL HDR later
3895c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
3896c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
3897c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return true;
3898c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
3899c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    return needRotationReprocess();
3900c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan}
3901c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
3902c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*===========================================================================
39037ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : addOnlineReprocChannel
39047ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39057ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
39067ee407aa1024789089aad411c372c79423699976Ajay Dudani *              coming from input channel
39077ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39087ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS :
39097ee407aa1024789089aad411c372c79423699976Ajay Dudani *   @pInputChannel : ptr to input channel whose frames will be post-processed
39107ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39117ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : Ptr to the newly created channel obj. NULL if failed.
39127ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
39137ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel(
3914d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle)
39157ee407aa1024789089aad411c372c79423699976Ajay Dudani{
39167ee407aa1024789089aad411c372c79423699976Ajay Dudani    int32_t rc = NO_ERROR;
39177ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCamera3ReprocessChannel *pChannel = NULL;
39187ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (pInputChannel == NULL) {
39197ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: input channel obj is NULL", __func__);
39207ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39217ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39227ee407aa1024789089aad411c372c79423699976Ajay Dudani
39237ee407aa1024789089aad411c372c79423699976Ajay Dudani    pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
39247ee407aa1024789089aad411c372c79423699976Ajay Dudani            mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle);
39257ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (NULL == pChannel) {
39267ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: no mem for reprocess channel", __func__);
39277ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39287ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39297ee407aa1024789089aad411c372c79423699976Ajay Dudani
39307ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Capture channel, only need snapshot and postview streams start together
39317ee407aa1024789089aad411c372c79423699976Ajay Dudani    mm_camera_channel_attr_t attr;
39327ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
39337ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
39347ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue();
39357ee407aa1024789089aad411c372c79423699976Ajay Dudani    rc = pChannel->initialize();
39367ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
39377ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
39387ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
39397ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39407ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39417ee407aa1024789089aad411c372c79423699976Ajay Dudani
39427ee407aa1024789089aad411c372c79423699976Ajay Dudani    // pp feature config
39437ee407aa1024789089aad411c372c79423699976Ajay Dudani    cam_pp_feature_config_t pp_config;
39447ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
39457ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
39467ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
39477ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.sharpness = 10;
39487ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39497ee407aa1024789089aad411c372c79423699976Ajay Dudani
39507ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (isWNREnabled()) {
39517ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
39527ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.denoise_enable = 1;
39537ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate();
39547ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39557ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (needRotationReprocess()) {
39567ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
39577ee407aa1024789089aad411c372c79423699976Ajay Dudani        int rotation = mJpegSettings->jpeg_orientation;
39587ee407aa1024789089aad411c372c79423699976Ajay Dudani        if (rotation == 0) {
39597ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_0;
39607ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 90) {
39617ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_90;
39627ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 180) {
39637ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_180;
39647ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 270) {
39657ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_270;
39667ee407aa1024789089aad411c372c79423699976Ajay Dudani        }
39677ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39687ee407aa1024789089aad411c372c79423699976Ajay Dudani
39697ee407aa1024789089aad411c372c79423699976Ajay Dudani   rc = pChannel->addReprocStreamsFromSource(pp_config,
39707ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             pInputChannel,
39717ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             mMetadataChannel);
39727ee407aa1024789089aad411c372c79423699976Ajay Dudani
39737ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
39747ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
39757ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39767ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39777ee407aa1024789089aad411c372c79423699976Ajay Dudani    return pChannel;
39787ee407aa1024789089aad411c372c79423699976Ajay Dudani}
39797ee407aa1024789089aad411c372c79423699976Ajay Dudani
39807ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue()
39817ee407aa1024789089aad411c372c79423699976Ajay Dudani{
39827ee407aa1024789089aad411c372c79423699976Ajay Dudani    return gCamCapability[mCameraId]->min_num_pp_bufs;
39837ee407aa1024789089aad411c372c79423699976Ajay Dudani}
39847ee407aa1024789089aad411c372c79423699976Ajay Dudani
3985acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() {
3986acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan    return gCamCapability[mCameraId]->isWnrSupported;
3987acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan}
3988acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan
3989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3990