QCamera3HWI.cpp revision e2f4853167052a8f9c3aa42daf56d88cfa9090e3
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"
31625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h>
33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h>
34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h>
35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h>
36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h>
37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h>
38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h>
39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h>
40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h"
41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h"
42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h"
4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h"
44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera {
4862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
4962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang#define MAX(a, b) ((a) > (b) ? (a) : (b))
5062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
5380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings;
54b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
55625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
56cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
57cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    PTHREAD_MUTEX_INITIALIZER;
58cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
59cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
9997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
103b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
118e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
121e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
122e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
1286356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE },
1296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH }
130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1326990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = {
1336990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,    CAM_FACE_DETECT_MODE_OFF     },
1346990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL,   CAM_FACE_DETECT_MODE_FULL    }
1356990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang};
1366990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang
13708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
13808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
148c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    flush:                              QCamera3HardwareInterface::flush,
149c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    reserved:                           {0},
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
167cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
16897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
16933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
17033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
1717ee407aa1024789089aad411c372c79423699976Ajay Dudani      mPictureChannel(NULL),
17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
17433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
17599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      mJpegSettings(NULL),
1768bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani      mIsZslMode(false),
17762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinProcessedFrameDuration(0),
17862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinJpegFrameDuration(0),
17962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang      mMinRawFrameDuration(0),
18099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      m_pPowerModule(NULL)
181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
183e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1887ee407aa1024789089aad411c372c79423699976Ajay Dudani    // TODO: hardcode for now until mctl add support for min_num_pp_bufs
1897ee407aa1024789089aad411c372c79423699976Ajay Dudani    //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3
1907ee407aa1024789089aad411c372c79423699976Ajay Dudani    gCamCapability[cameraId]->min_num_pp_bufs = 3;
1919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
19474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
195e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
19633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
19733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
19833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
19999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
20099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
20199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
20299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
20399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
20499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
21066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
218d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
219d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
220d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        /*flush the metadata list*/
221d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
222d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
223d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
224d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
225d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
226d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
227d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
228d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
2291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
232dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
2337ee407aa1024789089aad411c372c79423699976Ajay Dudani           channel->stop();
234d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
235d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
236d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
237d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
238dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
239dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
2437ee407aa1024789089aad411c372c79423699976Ajay Dudani    mPictureChannel = NULL;
2447ee407aa1024789089aad411c372c79423699976Ajay Dudani
24597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
24697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
24797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
24897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
249dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
250dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
251dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
252020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        mMetadataChannel->stop();
253020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        delete mMetadataChannel;
254020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        mMetadataChannel = NULL;
255dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
256dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
257dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
258cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
259cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
260e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
26133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
26233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
26333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
26433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
265e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
268d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
286cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
287cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
288cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
289cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
290cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        return INVALID_OPERATION;
291cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
292cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
299cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
301cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
302cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
304cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
30599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
30699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == 0) {
30799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
30899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
30999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
31099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=1");
31199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
31299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
31399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
31499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
315cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
36699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
36799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == NO_ERROR) {
36899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
36999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
37099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
37199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=0");
37299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
37399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
37499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
37599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
37699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
396e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
397e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
39833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
39933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
40033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
40133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
40233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
403020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    //Create metadata channel and initialize it
404020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
405020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava                    mCameraHandle->ops, captureResultCb,
406020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava                    &gCamCapability[mCameraId]->padding_info, this);
407020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    if (mMetadataChannel == NULL) {
408020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        ALOGE("%s: failed to allocate metadata channel", __func__);
409020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        rc = -ENOMEM;
410020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        goto err2;
411020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    }
412020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    rc = mMetadataChannel->initialize();
413020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    if (rc < 0) {
414020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        ALOGE("%s: metadata channel initialization failed", __func__);
415020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava        goto err3;
416020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    }
417020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava
4189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
419e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
420e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
421cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
4229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
4239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
424020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr3:
425020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    delete mMetadataChannel;
426020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    mMetadataChannel = NULL;
427020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr2:
428020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    deinitParameters();
4299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
430e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
4319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
44933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
450d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    mIsZslMode = false;
4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
455e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
461e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
468e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
473c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    camera3_stream_t *jpegStream = NULL;
4740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
478d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
479d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
482d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
485c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
486c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
487c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
4880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
5010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
5020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
5060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
5080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
5091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
512c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
516e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
521c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
522c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
523c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
5270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
5281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
541020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava    //mMetadataChannel->stop();
542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
549f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
550f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
551f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
552f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
553f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
554f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
555f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
556f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
557c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                /* For video encoding stream, set read/write rarely
558c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                 * flag so that they may be set to un-cached */
559c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER)
560c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage =
561c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         (GRALLOC_USAGE_SW_READ_RARELY |
562c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_SW_WRITE_RARELY |
563c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                         GRALLOC_USAGE_HW_CAMERA_WRITE);
564c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                else
565c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                    newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
576f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5778867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
579c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
580c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
581c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
582c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
5838bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
584c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
585c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
586c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
587c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
588c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
589c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
590f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
591f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
592f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
593f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
594f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
595f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
596f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
597f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
598f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
599f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
600f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
601f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
6027ee407aa1024789089aad411c372c79423699976Ajay Dudani                    mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle,
603f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
604f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
6057ee407aa1024789089aad411c372c79423699976Ajay Dudani                    if (mPictureChannel == NULL) {
606f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
607f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
6107ee407aa1024789089aad411c372c79423699976Ajay Dudani                    newStream->priv = (QCamera3Channel*)mPictureChannel;
611f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
612f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
613f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
614f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
615f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
616f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
6248867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
6251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
6261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
6271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
6281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
6291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
6301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
6311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
6321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
6331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
6341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
6351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
6361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
6371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
6381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
639a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
640e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
6410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
6451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
6461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
6471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
6481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
6491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
6500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
6531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
6541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
655d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    /*flush the metadata list*/
656d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    if (!mStoredMetadataList.empty()) {
657d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
658d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              m != mStoredMetadataList.end(); m++) {
659d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            mMetadataChannel->bufDone(m->meta_buf);
660d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            free(m->meta_buf);
661d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            m = mStoredMetadataList.erase(m);
662d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab        }
663d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    }
664d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
66533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
6669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
66733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
66833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
66962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Get min frame duration for this streams configuration
67062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    deriveMinFrameDuration();
67162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
67333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
68080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
68180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
68280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
68380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
68480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
68580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
68680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
687e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
6889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
68980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
6909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
713c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
714c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
715c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
716c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
717c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
718c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
719c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
720c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
721c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
722c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
723c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
724c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
725c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
726c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
727c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
728c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
729c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
730c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
731c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
732c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
733c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
734c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
735c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
7369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
7399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
7409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
7419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
7429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
7439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
7509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
77162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : deriveMinFrameDuration
77262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
77362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based
77462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              on currently configured streams.
77562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
77662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE
77762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
77862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : NONE
77962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
78062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
78162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration()
78262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
78362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t maxJpegDimension, maxProcessedDimension;
78462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
78562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxJpegDimension = 0;
78662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    maxProcessedDimension = 0;
78762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
78862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    // Figure out maximum jpeg, processed, and raw dimensions
78962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (List<stream_info_t*>::iterator it = mStreamInfo.begin();
79062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        it != mStreamInfo.end(); it++) {
79162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
79262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        // Input stream doesn't have valid stream_type
79362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT)
79462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            continue;
79562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
79662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int32_t dimension = (*it)->stream->width * (*it)->stream->height;
79762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) {
79862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxJpegDimension)
79962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxJpegDimension = dimension;
80062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) {
80162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            if (dimension > maxProcessedDimension)
80262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                maxProcessedDimension = dimension;
80362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
80462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
80562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
80662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Assume all jpeg dimensions are in processed dimensions.
80762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (maxJpegDimension > maxProcessedDimension)
80862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        maxProcessedDimension = maxJpegDimension;
80962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
81062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    //Find minimum durations for processed, jpeg, and raw
81162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration;
81262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
81362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (maxProcessedDimension ==
81462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].width *
81562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            gCamCapability[mCameraId]->picture_sizes_tbl[i].height) {
81662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
81762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i];
81862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            break;
81962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        }
82062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
82162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
82262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
82362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
82462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION   : getMinFrameDuration
82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations
82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *              and current request configuration.
82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks
83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN     : min farme duration for a particular request
83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *
83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/
83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request)
83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{
83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    bool hasJpegStream = false;
83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    for (uint32_t i = 0; i < request->num_output_buffers; i ++) {
83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        const camera3_stream_t *stream = request->output_buffers[i].stream;
83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        if (stream->format == HAL_PIXEL_FORMAT_BLOB)
84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang            hasJpegStream = true;
84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (!hasJpegStream)
84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration);
84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    else
84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration);
84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang}
84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*===========================================================================
850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
857e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
859e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
860e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
8921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
8931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
8941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
8950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
8961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
8971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
8981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
8991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
9000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
9010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
9020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
9030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
9051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
9060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
9071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
9080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
9090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
914e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
917e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
918e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
919e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
920e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
921e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
922e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
923e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
924e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
925e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
926e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
927e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
929e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
930e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
931e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
932e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
93674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
938d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    MetadataBufferInfo reproc_meta;
939d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    int queueMetadata = 0;
940e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9432123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    rc = validateCaptureRequest(request);
9442123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    if (rc != NO_ERROR) {
9452123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
9462123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        pthread_mutex_unlock(&mMutex);
9472123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        return rc;
9482123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    }
9492123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9502123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    meta = request->settings;
9512123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9522123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // For first capture request, send capture intent, and
9532123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang    // stream on all streams
954d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    if (mFirstRequest) {
9552123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9562123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
9572123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            int32_t hal_version = CAM_HAL_V3;
9582123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            uint8_t captureIntent =
9592123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
9602123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
9612123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            memset(mParameters, 0, sizeof(parm_buffer_t));
9622123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
9632123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
9642123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(hal_version), &hal_version);
9652123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
9662123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                sizeof(captureIntent), &captureIntent);
9672123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang            mCameraHandle->ops->set_parms(mCameraHandle->camera_handle,
9682123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang                mParameters);
9692123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang        }
9702123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang
971d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
972d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            it != mStreamInfo.end(); it++) {
973d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
974d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang            channel->start();
975d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang        }
976d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang    }
977d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang
978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
97934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    uint32_t streamTypeMask = 0;
9809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
98174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
98274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
98374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
984013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
98574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
98674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
98774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
98874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
98974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
990013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
99174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
99274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
99374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
994d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    ALOGE("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
995c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
996c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
997c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
998c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
10007ee407aa1024789089aad411c372c79423699976Ajay Dudani    int blob_request = 0;
1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
1002e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
100334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1004e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
100566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
100666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
100766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
10087ee407aa1024789089aad411c372c79423699976Ajay Dudani            blob_request = 1;
100966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
101066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
10110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
101266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
101366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
101466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
101566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
101666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
1017e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
1018e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
1019e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
1020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
1021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
1022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
102334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        streamTypeMask |= channel->getStreamTypeMask();
102434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
102534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
102662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = setFrameParameters(request, streamTypeMask);
102734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
102834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: fail to set frame parameters", __func__);
102934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        pthread_mutex_unlock(&mMutex);
103034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return rc;
1031e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
10331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
103774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
10387ee407aa1024789089aad411c372c79423699976Ajay Dudani    pendingRequest.blob_request = blob_request;
103913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0;
104074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
10441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
1052e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
10539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
10549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
10559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
10569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
10579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
1058c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
105966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
10609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
10619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
10629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
10639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
10649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
106566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
1066c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
1067c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
1068c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
1069c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
1070c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
1071c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
1072c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
1073c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
1074c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
1075c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
1076c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
1077c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
1078c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
1079c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
1080c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
108141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                    ALOGD("Handle:%p", request->input_buffer->buffer);
1082d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    //TODO: need to get corresponding metadata and send it to pproc
1083d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1084d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         m != mStoredMetadataList.end(); m++) {
1085d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->input_buffer->buffer) {
1086d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            reproc_meta.meta_buf = m->meta_buf;
1087d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            queueMetadata = 1;
1088d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1089d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1090d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1091c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
1092c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
1093c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
1094c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
1095d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (queueMetadata) {
109641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false);
1097d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
109866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
1099d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__,
1100a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
1101d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1102d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1103d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                     m != mStoredMetadataList.end(); m++) {
1104d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (uint32_t j = 0; j < request->num_output_buffers; j++) {
1105d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        if (m->zsl_buf_hdl == request->output_buffers[j].buffer) {
1106d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mMetadataChannel->bufDone(m->meta_buf);
1107d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            free(m->meta_buf);
1108d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            m = mStoredMetadataList.erase(m);
1109d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            break;
1110d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        }
1111d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1112d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1113d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
111466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
111566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
11169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
11179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
11189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
11201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
11211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
11229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
11239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
11249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
11255b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang        pthread_cond_wait(&mRequestCond, &mMutex);
11269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1128e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
112980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
113080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
113180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
11329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
1133e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
11349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
1135e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
11369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
11379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
1138e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1139e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1140e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1141e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1142b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
1143b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
1144e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1145e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
1146e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1147e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1148e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1149e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1150e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1152e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1153e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1154e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1155e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
1156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
1158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1160e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1164b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
1165e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1166e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
1172e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1175c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
1176c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
1177c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1178c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
1179c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1180c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
1181c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1182c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
1183c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
1184c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
1185c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush()
1186c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
1187c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*Enable lock when we implement this function*/
1188c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    /*
1189c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_lock(&mMutex);
1190c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
1191c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    pthread_mutex_unlock(&mMutex);
1192c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    */
1193c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return 0;
1194c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
11957ee407aa1024789089aad411c372c79423699976Ajay Dudani
1196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
1198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
119933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
120033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
1201e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1202e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1203e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
120433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
120533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
12069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
12079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
12089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
12091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1210e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
12119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
12125b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_lock(&mMutex);
1213e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
12141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
12151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
121633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
121733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
1218152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        uint32_t pending_requests = *(uint32_t *)POINTER_OF(
1219152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang            CAM_INTF_META_PENDING_REQUESTS, metadata);
122033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
122133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
12220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
12230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
12240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
12260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
12271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
1228a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
12291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
12301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
12311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1232a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1233e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
12341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
12361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1237e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
12381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
12391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
1240a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
12411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
12431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
1244e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1245e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
1246e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
1247e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
1248e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
1249e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
1250e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
1251e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1252e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
12531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
12541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
12551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
1256e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
12571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
1258a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1259e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
12601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
12611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
12621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
12631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
126499b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
126599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1266e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
126799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
126874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
126999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
12701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
1271e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
127274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
1273d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (mIsZslMode) {
1274d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   int found_metadata = 0;
1275d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   //for ZSL case store the metadata buffer and corresp. ZSL handle ptr
1276d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1277d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        j != i->buffers.end(); j++) {
1278d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1279d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         //check if corresp. zsl already exists in the stored metadata list
1280d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin();
1281d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m != mStoredMetadataList.begin(); m++) {
1282d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            if (m->frame_number == frame_number) {
1283d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               m->meta_buf = metadata_buf;
1284d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               found_metadata = 1;
1285d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                               break;
1286d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            }
1287d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1288d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         if (!found_metadata) {
1289d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            MetadataBufferInfo store_meta_info;
1290d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.meta_buf = metadata_buf;
1291d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            store_meta_info.frame_number = frame_number;
1292d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            mStoredMetadataList.push_back(store_meta_info);
1293d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                            found_metadata = 1;
1294d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                         }
1295d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      }
1296d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1297d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   if (!found_metadata) {
129813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       if (!i->input_buffer_present && i->blob_request) {
129913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          //livesnapshot or fallback non-zsl snapshot case
130013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                          for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
130113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                j != i->buffers.end(); j++){
130213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT &&
130313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                  j->stream->format == HAL_PIXEL_FORMAT_BLOB) {
130441da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                                 mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
130513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                                 break;
130613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                              }
130713c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                         }
130813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       } else {
130913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            //return the metadata immediately
131013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            mMetadataChannel->bufDone(metadata_buf);
131113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                            free(metadata_buf);
131213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab                       }
1313d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   }
1314d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else if (!mIsZslMode && i->blob_request) {
13157ee407aa1024789089aad411c372c79423699976Ajay Dudani                   //If it is a blob request then send the metadata to the picture channel
131641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab                   mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true);
1317d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               } else {
13187ee407aa1024789089aad411c372c79423699976Ajay Dudani                   // Return metadata buffer
13197ee407aa1024789089aad411c372c79423699976Ajay Dudani                   mMetadataChannel->bufDone(metadata_buf);
13207ee407aa1024789089aad411c372c79423699976Ajay Dudani                   free(metadata_buf);
1321d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab               }
1322d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab
13231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
13251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
13261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
13281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
1329e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
13301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1331e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
13321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
13381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
13391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
13401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
13411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
13441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1345e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
13461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
13471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
13481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
134913dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang                        j->buffer = NULL;
13501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
13511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
13521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
13531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
13541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
13551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1356a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1357d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
13581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
13591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
13601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
13611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1362d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                ALOGE("%s: meta frame_number = %d, capture_time = %lld",
1363d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
13641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
13651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
13671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
13681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
136933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
137033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
13711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
13721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
13731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
13741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1375e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
13761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
13771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
13781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
13791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
13801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1381152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        if (!max_buffers_dequeued && !pending_requests) {
13821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
13831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
13841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
13851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
13861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
13871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
13881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
13891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
13901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1391c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
13921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
1393c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
13941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
13951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
13961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1397e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
13981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
13991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
14001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
14011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
14041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
140533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
14061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1408a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1409e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
14101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1411d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
1412d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                int found = 0;
1413d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin();
1414d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                      k != mStoredMetadataList.end(); k++) {
1415d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    if (k->frame_number == frame_number) {
1416d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        k->zsl_buf_hdl = buffer->buffer;
1417d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        found = 1;
1418d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                        break;
1419d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                    }
1420d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1421d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                if (!found) {
1422d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   MetadataBufferInfo meta_info;
1423d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.frame_number = frame_number;
1424d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   meta_info.zsl_buf_hdl = buffer->buffer;
1425d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                   mStoredMetadataList.push_back(meta_info);
1426d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                }
1427d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab            }
1428e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
142933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
14301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1431e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
14321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
14341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
14351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
14361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
14371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
14381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1439a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1440e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
14411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
14421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
14431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1444e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
14459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
14465b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_unlock(&mMutex);
14479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
14489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
14499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
145097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
145197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
145297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
145397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
145497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
145597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
145697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
145797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
145897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
145997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
146097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
146197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
146297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
146374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
146474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
146597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
146697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
146797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
146897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
14690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
147074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
147197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
147297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
147397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
147497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
147597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
147697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
147797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
147897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
147997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
148097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
148197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
148297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
148397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
148497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
148597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
148697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
148797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
148959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
149097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
149297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
149397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
149599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
149699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
149799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
149899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
149997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
150099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
150197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
150299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15048867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
15050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
150697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
151297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
151659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
151797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
151813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab
151913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    uint8_t *ae_state =
15208bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
152113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
152213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab
15230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
15240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
152597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
152697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
152797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
152897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
152997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
153159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
153297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
153597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
153997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
15420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
154397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
154497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
154597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
154697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
154797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
154959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
155097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
15530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
155497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
155597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
155797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
155897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1559d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata);
156097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
156197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
15630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
156497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
156597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
156697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
156797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
156897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
156997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
157097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
157197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
157297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
157397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
157697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
157797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
15780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
15790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
158097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
158197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
158297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
158397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
158497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
158597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
158697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
158797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
158897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
158997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
159097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
159197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
159297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
159397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
159497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
159597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
159697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
159797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
159897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
159997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
160097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
160197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
16030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
16040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
160597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
160697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
160797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
160897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
160997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
16110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
161297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
161397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
161497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
161597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
161797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
161871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
16190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
16200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
16210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
162271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
162371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
162497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
162597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
162697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
16270b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mMetadataResponse.exposure_time = *sensorExpTime;
162862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime);
162997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
163097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
163197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
163297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
163362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration);
163497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
163597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
163697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
163797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
163862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity);
16393fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
164097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
164197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
16430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
164497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
164597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
16470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
16486990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP,
16496990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]),
16506990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        *faceDetectMode);
16516990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1);
165297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
16540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
165597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
165697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
16570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
16580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
165997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
166097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
166197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
166297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
166397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
166497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
166597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
166697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
166797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
166897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1669d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *)
1670d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata);
1671d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height;
1672d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    int map_width  = gCamCapability[mCameraId]->lens_shading_map_size.width;
1673d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP,
1674d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (float*)lensShadingMap->lens_shading,
1675d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       4*map_width*map_height);
1676d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1677d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*)
1678d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata);
1679d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4);
1680d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1681d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*)
1682d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata);
1683d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM,
1684d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3);
1685d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1686d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*)
1687d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata);
1688d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS,
1689d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       predColorCorrectionGains->gains, 4);
1690d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1691d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*)
1692d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata);
1693d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM,
1694d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                       (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3);
1695d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1696d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t *blackLevelLock = (uint8_t*)
1697d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata);
1698d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1);
1699d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1700d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    uint8_t *sceneFlicker = (uint8_t*)
1701d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata);
1702d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1);
1703d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
1704d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
170597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
170633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
170797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
170897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
170997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
171059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
171197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
171297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
171397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
171497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
171597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
171697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
171797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
171897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
171997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
172097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
172159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
172297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
172397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
172459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
172559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
172697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
172797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
172997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
173059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
173159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
173259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
173359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
173459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
173559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
173659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
173759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
173859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
173959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
174059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
174159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
174259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
174359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
174459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
174559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
174659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
174759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
174859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
174959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
175059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
175159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
175259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
175359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
175459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
175559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
175659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
175759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
175859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
175997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
176071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
176171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
176271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
176371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
176471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
176571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
176671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
176771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
176871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
176971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
177071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
177171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
177271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
177371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
177471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
177571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
177671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
177771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
177871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
177971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
178071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
178171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
178271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
178371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
178471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
178571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
178671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
178771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
178871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
178971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
179071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
179171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
179271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
179371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
179471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
179571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
179671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
179771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
179871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
179971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
180071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
180171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
180297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
180397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
180497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
180597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
180697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
180797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
180897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
180997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
181097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
181197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
181297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
181397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
181497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
181597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
181697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
181797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
181897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
181997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
182097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
182197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1848e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1892e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1901662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1906662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1910662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1911662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1912662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1913662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1914662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1915662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1922662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
194533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
194633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
194733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
194833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
194933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
195033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
195133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
195233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
195333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
195433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
195533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
195633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
195733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
195833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
195933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
196033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
196133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
196233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
196333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
196433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
196533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
19660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
19670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
19690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
19710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
19720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
19730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
19740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
19750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
19760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
19770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
19780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
19790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
19800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
19810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
19820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
19830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
19840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
19850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
19860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
19870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
19880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
19890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
2000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
200497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
2005c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2006c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
2007c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
2008c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
2009c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
2010c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
2011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
20132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
20142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
20152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2016e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
2017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
20242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
2025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
2027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
2028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2029c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
2030625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
2031c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
2032c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
2033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
2035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
2036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
2037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
2039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
2040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
2041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
2044c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
2045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
204780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
204880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
204980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
205080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
205147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
205280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
205380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
205480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
205580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
2056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
205747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
20580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
205980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
206080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
206180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
206280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
206380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
206480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
2065c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
206680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
206780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
206880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
206980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
207180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
207280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
207480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
207580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
207780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
2078c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
207980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
208047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
208180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
208280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
208380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
208480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
208522817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
208622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
208780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
208880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
208922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
209080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
209280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
2093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
209480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
209580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
209680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
209780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
209880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
209980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
210180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
210280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
21046990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                      (int*)&gCamCapability[cameraId]->max_num_roi, 1);
210580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
210780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
210880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
210980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
211080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
211180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
211380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
211480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
211680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
211780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
211880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
211980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
212080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
212380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
212480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
212580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
212622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
212722817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
212822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
2129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
21318867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
2132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
213347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
213400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
213500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
2136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
213900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2);
214000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2141e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
214200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
214300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
21440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
214547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
21460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
21470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
21480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
2149c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
2150c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
2151c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
215247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
2153c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
2154c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
2155c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
2156c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
2157c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2158c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
215947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
2160c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
2161c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
2162c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2163b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
21649443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
2165c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
2166c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
2167c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
216847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
2169c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
2170c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
2171c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
217247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
21736990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
21746990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_FULL };
2175c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
2176c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
2177c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
2178c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
217947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
2180662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
2181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
2183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
2184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
218547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
218680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
218780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
218880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
218980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
219080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
2191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
219280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
219380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
2194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2195662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
219600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                available_processed_sizes,
2197c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
2198c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
2199c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
220008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
220108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
2202662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
220347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
220497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
220597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
220697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
220797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
220897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
220997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
221097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
221197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
221297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
221397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
221497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
221597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
221647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
22170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
2218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
22190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
2220b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
22210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
22220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
22240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
22290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
223147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
2232e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
22332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
2234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
22350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
2236b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
22370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
22380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
2239e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
2240e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
22412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
22420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2244e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
22472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
2248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
224947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
2250e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
2251e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
2252e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
22539443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
22549443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
2255e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
2256e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
2257e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
2258e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
225947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
22600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
22620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
2263b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
2264b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
22650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
22670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
22690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
22730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
227547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
22760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
22780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
2279b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
22800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
22810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
22830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
22880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2289662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
229047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
22910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2292662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
22930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
2294b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
22950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
22970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
22980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
22990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
2302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
23030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2304662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2305a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX];
2306a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++)
2307a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava      available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i];
2308a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2309a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    staticInfo.update(ANDROID_FLASH_FIRING_POWER,
2310a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            available_flash_levels,
2311a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            gCamCapability[cameraId]->supported_flash_firing_level_cnt);
2312a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava
2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
231400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    uint8_t flashAvailable = gCamCapability[cameraId]->flash_available;
2315e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2316e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2317e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2318e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2319e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2320e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2321e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2322e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2323e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2324e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2325e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2326e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2327e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2328e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2331e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2332ea44a483c0e98200c058a85ea339457616516847Zhijun He
2333e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    int32_t sensitivity_range[2];
2334e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2335e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2336ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2337ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2338ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
23392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
234073c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
234173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
234200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
234300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
234473c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2345e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2346e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
234773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
234800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle;
234900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_SENSOR_ORIENTATION,
235000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      &sensor_orientation,
235100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      1);
235200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
235300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    int32_t max_output_streams[3] = {1, 3, 1};
235400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang    staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
235500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      max_output_streams,
235600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang                      3);
235700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang
2358b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2363662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2364662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2371662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2372662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2373662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2374662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2375662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2376662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2377662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2378662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2379662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2380662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
23810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
23820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
23830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
23840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
23850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
23860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
23870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
23880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
23890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
23900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2391c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
23920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
23930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
23940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2395c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2396c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
23970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
23980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
23990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
24002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
24012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
24022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
24032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
24052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
24072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
24092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
24102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2411e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
24129443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
24139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
24142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
24152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
24162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
24172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
24189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
24199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
24202dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
24219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2422e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
2423e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani        overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON;
24249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
24259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
24269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
24279443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
24289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
24299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
24309443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
24319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
24329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
24339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
24349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
24359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
24369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
24379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
24389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
24399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
24409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
24412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
24422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
24432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
24442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2465662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2466662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2467662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
24823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
24833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
24853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
24873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
24893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
24903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
24913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
24923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
24933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
24943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
24953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
24963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
24973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
24983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
24993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
25003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
25013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
25033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
25043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
25063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
25073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
25093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
25103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
25123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
25133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
25143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
25153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
25163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
25173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
25183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
25193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2567662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2570662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2571662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2572662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2573662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2574662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2575662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2576662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2577662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2578662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2579662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2580662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2581662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2582662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2583662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2584662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2595d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2596d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2597d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2599d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2600d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2601d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2602d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2603d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2604d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2659b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2683c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    info->device_version = CAMERA_DEVICE_API_VERSION_3_0;
2684b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
270197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2703e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
271197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
27419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
27429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2762e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2764e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2765e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2766e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2767e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2768e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2769e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
27702dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
27712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
27722dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
27732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
27742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2779a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4;
2780a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava    settings.update(ANDROID_FLASH_FIRING_POWER,
2781a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava            &flashFiringLevel, 1);
2782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
278447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2787b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
278847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2789b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2790b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2791b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
27939a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
27949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
279662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* frame duration */
279762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int64_t default_frame_duration = NSEC_PER_33MSEC;
279862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1);
279962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
280062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    /* sensitivity */
280162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    int32_t default_sensitivity = 100;
280262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1);
280362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang
2804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
281180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
281280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
281380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
281480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
281580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
281680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
281762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request   : request that needs to be serviced
281834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy *   @streamTypeMask : bit mask of stream types on which buffers are requested
281980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
282080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
282180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
282280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
282362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request,
282462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                    uint32_t streamTypeMask)
282580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
282680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
282780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
282862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (request->settings == NULL && mFirstRequest) {
282980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
283080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2831662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
283233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2833b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2834b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2835b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
283633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
283762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2838b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
283962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if (rc < 0) {
284062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGE("%s: Failed to set hal version in the parameters", __func__);
284162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        return BAD_VALUE;
284262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    }
284333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2844662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
284662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                sizeof(request->frame_number), &(request->frame_number));
2847662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
28510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
285234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    /* Update stream id mask where buffers are requested */
285334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK,
285434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy                                sizeof(streamTypeMask), &streamTypeMask);
285534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    if (rc < 0) {
285634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        ALOGE("%s: Failed to set stream type mask in the parameters", __func__);
285734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy        return BAD_VALUE;
285834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy    }
285934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy
286062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    if(request->settings != NULL){
286162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        rc = translateMetadataToParameters(request);
286280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
286380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2864662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
286580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
286680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
286780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
286880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
286980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
287080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
287280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
287562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *   @request  : request sent from framework
287680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
287880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
287980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
288080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
288180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
288262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang                                  (const camera3_capture_request_t *request)
288380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
288597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
288662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang    frame_settings = request->settings;
28870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
28900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
28910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
289497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
289553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
2896e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        int32_t expCompensation = frame_settings.find(
2897e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
2898fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min)
2899fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_min;
2900fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang        if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max)
2901fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_compensation_max;
290253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
290353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
290453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
290553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
29060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
29070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
29169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
292097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
29212b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
29222b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
29232b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
29242b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
29252b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
29262b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
29272b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
29282b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
29302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
29322b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
29332b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
29342b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
29352b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
29362b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
29372b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
29382b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
29392b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
29440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
29490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
29530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
29550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
29560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
29570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
29580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
29590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
29620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
29650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
29660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
29670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
29680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
29690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
29720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
29730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2974e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2975e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
29766356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2977e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2978e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2979e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2980e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2981e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2982e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2983e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2984e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2985e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2986e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
29876356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2988e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2989e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2990f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang                                          fwk_aeMode);
29910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2993e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2994e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2995e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2996e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
29970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
30000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
30010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
30020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
30030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
30040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
30050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3006d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3007d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) {
3008d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_gains_t colorCorrectGains;
3009d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 4; i++) {
3010d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            colorCorrectGains.gains[i] =
3011d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i];
3012d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3013d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3014d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS,
3015d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectGains), &colorCorrectGains);
3016d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3017d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3018d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) {
3019d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_color_correct_matrix_t colorCorrectTransform;
3020d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_rational_type_t transform_elem;
3021d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        int num = 0;
3022d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        for (int i = 0; i < 3; i++) {
3023d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           for (int j = 0; j < 3; j++) {
3024d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.numerator =
3025d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator;
3026d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              transform_elem.denominator =
3027d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator;
3028d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              colorCorrectTransform.transform_matrix[i][j] = transform_elem;
3029d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy              num++;
3030d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy           }
3031d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3032d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc =
3033d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM,
3034d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                    sizeof(colorCorrectTransform), &colorCorrectTransform);
3035d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3036d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3037e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
3038e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
3039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
30402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
30412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
30422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
30430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
30442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
30452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
30460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
30481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
30490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30502dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
30512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
30522dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
30532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
30542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
30550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
30562dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
30572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
30580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
30592dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
30600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
30630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
30640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
30650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
30669443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
30679443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
30689443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
30699443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
30709443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             fwk_sceneMode);
30719443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
3072827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
3073827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
3074827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
3075827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
3076827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
3077827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
3078827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
3079827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
30809443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                sizeof(sceneMode), &sceneMode);
30819443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
30820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
30850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
30890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
30920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
3093d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE,
30940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
30950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
30980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
30990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
31000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
31020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
3104e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
31056356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        int32_t respectFlashMode = 1;
31066356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
31076356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t fwk_aeMode =
31086356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
31096356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
31106356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                respectFlashMode = 0;
31116356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
31126356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                    __func__);
31136356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            }
31146356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
31156356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (respectFlashMode) {
31166356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t flashMode =
31176356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
31186356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
31196356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          sizeof(FLASH_MODES_MAP),
31206356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          flashMode);
31216356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
31226356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            // To check: CAM_INTF_META_FLASH_MODE usage
31236356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
31246356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                          sizeof(flashMode), &flashMode);
31256356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
3126e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
3127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
31280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
31290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
31300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
31310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
31320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
31330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
31360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
31370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
31380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
31400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
31430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
31440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
31450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
31460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
31470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
31508867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
31510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
31520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
31540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
31550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
31580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
31590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
31600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
31610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
31620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
31650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
31660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
31670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
31680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
31690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
31720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
31730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
31740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
31750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
31760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
31790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
31800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
31810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
31820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
31830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
31840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
31870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
31880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
31898867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
31900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
31960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
31978867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
31980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
31990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
32000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
32030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
32040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
32058867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
32060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
32070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
321071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
321171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
32120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
32180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
321947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
322047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
32210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
322471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
32250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
32280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
323062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime);
32310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
32330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
32340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
323962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        int64_t minFrameDuration = getMinFrameDuration(request);
324062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration);
3241e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
3242e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
324362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration);
32440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
32470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
32500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
32510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
3252e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity <
3253e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
3254e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3255e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
3256e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity >
3257e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
3258e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
3259e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
326062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity);
32610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
32630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
32640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
32670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
32680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
32690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
32700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
32710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
32740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
32750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
32760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
32770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
32780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
32816990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t fwk_facedetectMode =
32820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
32836990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang        uint8_t facedetectMode =
32846990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang            lookupHalName(FACEDETECT_MODES_MAP,
32856990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang                sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode);
32860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
32880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
32890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
32920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
32930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
32940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
32950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
32970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
32980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
33000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
33040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
33060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
33080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
33110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
33120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
33130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3314e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */
3315e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    /*All tonemap channels will have the same number of points*/
3316e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) &&
3317e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) &&
3318e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) {
3319e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_rgb_tonemap_curves tonemapCurves;
3320e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2;
3321e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3322e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch0 = G*/
3323e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        int point = 0;
3324e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveGreen;
3325e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) {
3326d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3327e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveGreen.tonemap_points[i][j] =
3328e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point];
3329d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3330d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3331d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3332e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[0] = tonemapCurveGreen;
3333e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3334e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 1 = B */
3335e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3336e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        cam_tonemap_curve_t tonemapCurveBlue;
3337e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3338d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3339e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang               tonemapCurveBlue.tonemap_points[i][j] =
3340e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                  frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point];
3341d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3342d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3343d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3344e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[1] = tonemapCurveBlue;
3345e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3346e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        /* ch 2 = R */
3347e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        point = 0;
3348d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        cam_tonemap_curve_t tonemapCurveRed;
3349e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) {
3350d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            for (int j = 0; j < 2; j++) {
3351d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               tonemapCurveRed.tonemap_points[i][j] =
3352d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                  frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point];
3353d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy               point++;
3354d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            }
3355d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        }
3356e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang        tonemapCurves.curves[2] = tonemapCurveRed;
3357e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang
3358d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters,
3359e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                CAM_INTF_META_TONEMAP_CURVES,
3360e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang                sizeof(tonemapCurves), &tonemapCurves);
3361d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
33620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
33630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
33640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
33650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
33660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
33670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
33680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
3369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3370d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) {
3371d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t blackLevelLock =
3372d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0];
3373d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK,
3374d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(blackLevelLock), &blackLevelLock);
3375d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3376d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
3377d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) {
3378d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        uint8_t lensShadingMapMode =
3379d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy            frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0];
3380d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
3381d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy                sizeof(lensShadingMapMode), &lensShadingMapMode);
3382d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy    }
3383d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy
338459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
338559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
338671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
338762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS);
338871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
338971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
339071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
339171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
339271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
339371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
339471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
339559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
339659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
339759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
339859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
339971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
340062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS);
340171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
340271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
340371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
340471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
340571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
340671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
340771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
340859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
340959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
341059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
341159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
341271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
341362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang        convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS);
341471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
341571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
341671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
341771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
341871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
341971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
342071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
342159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
3422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
3423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
34260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
3427662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
34280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
3429662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
3432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
3433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
3436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
3437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
3438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
3439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
3440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
34429a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
34439a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
34449a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
34459a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
34469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
34479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
34489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
34499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
34509a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
34519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
3452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
3453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
3454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
345697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
34590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
34620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
34630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
34640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
34660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
34670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
34691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
34700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
34760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
347708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
347808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
34790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
34810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
34829a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
34839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
34840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
34863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
34879a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
34889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
34893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
34900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34919a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
34920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
34939a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
34949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
34950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
34969a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
34979a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
34980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
35000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
35019a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
35029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
35039a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
35049a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
35059a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
35069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
35079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
35089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
35099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
35109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
35110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
35130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
35140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
35163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
35173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
35180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
35199a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
35200b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi    mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time;
35210b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi
35220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
35250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
352653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
352753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
352853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
352953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
353053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
35310a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
35327ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->is_jpeg_format = true;
35337ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask;
353480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
353580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
353680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
353780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
3538e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
3539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
3544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
3546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
3548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
35491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
3551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
3552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
3555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
3556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
3557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
3560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
3561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
35637ee407aa1024789089aad411c372c79423699976Ajay Dudani
3564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
3566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
3568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
3573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
3574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
3578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3579d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
35871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3588d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
35891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3609d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
36161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3617d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
36181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3634d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
36411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3642d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
36431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
36579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
36589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
36599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3662d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
367197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3673d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
36879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
36889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
36899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3691d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
369280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
369380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
369480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
369580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
36969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
369780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
36989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
36991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3700d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
37011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3719d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3728d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3746d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3755d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3760c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION   : flush
3761c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3762c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION:
3763c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3764c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS :
3765c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3766c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *
3767c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN     :
3768c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/
3769c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3770c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush(
3771c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang                const struct camera3_device *device)
3772c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{
3773c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    int rc;
3774c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: E", __func__);
3775c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    QCamera3HardwareInterface *hw =
3776c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3777c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    if (!hw) {
3778c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3779c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang        return -EINVAL;
3780c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    }
3781c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3782c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    rc = hw->flush();
3783c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    ALOGV("%s: X", __func__);
3784c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang    return rc;
3785c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang}
3786c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang
3787c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*===========================================================================
3788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3799d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3800e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3809cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3810cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3811cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3812cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3813d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
38177ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
38187ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : getWaveletDenoiseProcessPlate
38197ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38207ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate
38217ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38227ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None
38237ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38247ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : WNR prcocess plate vlaue
38257ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
38267ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate()
38277ee407aa1024789089aad411c372c79423699976Ajay Dudani{
38287ee407aa1024789089aad411c372c79423699976Ajay Dudani    char prop[PROPERTY_VALUE_MAX];
38297ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(prop, 0, sizeof(prop));
38307ee407aa1024789089aad411c372c79423699976Ajay Dudani    property_get("persist.denoise.process.plates", prop, "0");
38317ee407aa1024789089aad411c372c79423699976Ajay Dudani    int processPlate = atoi(prop);
38327ee407aa1024789089aad411c372c79423699976Ajay Dudani    switch(processPlate) {
38337ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 0:
38347ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
38357ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 1:
38367ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_CBCR_ONLY;
38377ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 2:
38387ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
38397ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 3:
38407ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
38417ee407aa1024789089aad411c372c79423699976Ajay Dudani    default:
38427ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
38437ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38447ee407aa1024789089aad411c372c79423699976Ajay Dudani}
38457ee407aa1024789089aad411c372c79423699976Ajay Dudani
38467ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
38477ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : needRotationReprocess
38487ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38497ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp
38507ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38517ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none
38527ee407aa1024789089aad411c372c79423699976Ajay Dudani *
38537ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : true: needed
38547ee407aa1024789089aad411c372c79423699976Ajay Dudani *              false: no need
38557ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
38567ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess()
38577ee407aa1024789089aad411c372c79423699976Ajay Dudani{
38587ee407aa1024789089aad411c372c79423699976Ajay Dudani
38597ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (!mJpegSettings->is_jpeg_format) {
38607ee407aa1024789089aad411c372c79423699976Ajay Dudani        // RAW image, no need to reprocess
38617ee407aa1024789089aad411c372c79423699976Ajay Dudani        return false;
38627ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38637ee407aa1024789089aad411c372c79423699976Ajay Dudani
38647ee407aa1024789089aad411c372c79423699976Ajay Dudani    if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
38657ee407aa1024789089aad411c372c79423699976Ajay Dudani        mJpegSettings->jpeg_orientation > 0) {
38667ee407aa1024789089aad411c372c79423699976Ajay Dudani        // current rotation is not zero, and pp has the capability to process rotation
38677ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGD("%s: need do reprocess for rotation", __func__);
38687ee407aa1024789089aad411c372c79423699976Ajay Dudani        return true;
38697ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
38707ee407aa1024789089aad411c372c79423699976Ajay Dudani
38717ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
38727ee407aa1024789089aad411c372c79423699976Ajay Dudani}
38737ee407aa1024789089aad411c372c79423699976Ajay Dudani
38747ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
3875c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION   : needReprocess
3876c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3877c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed
3878c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3879c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none
3880c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *
3881c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN     : true: needed
3882c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *              false: no need
3883c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/
3884c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess()
3885c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{
3886c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if (!mJpegSettings->is_jpeg_format) {
3887c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // RAW image, no need to reprocess
3888c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return false;
3889c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
3890c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
3891c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    if ((mJpegSettings->min_required_pp_mask > 0) ||
3892c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan         isWNREnabled()) {
3893c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // TODO: add for ZSL HDR later
3894c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
3895c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
3896c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan        return true;
3897c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    }
3898c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan    return needRotationReprocess();
3899c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan}
3900c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan
3901c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*===========================================================================
39027ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : addOnlineReprocChannel
39037ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39047ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
39057ee407aa1024789089aad411c372c79423699976Ajay Dudani *              coming from input channel
39067ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39077ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS :
39087ee407aa1024789089aad411c372c79423699976Ajay Dudani *   @pInputChannel : ptr to input channel whose frames will be post-processed
39097ee407aa1024789089aad411c372c79423699976Ajay Dudani *
39107ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : Ptr to the newly created channel obj. NULL if failed.
39117ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
39127ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel(
3913d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab              QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle)
39147ee407aa1024789089aad411c372c79423699976Ajay Dudani{
39157ee407aa1024789089aad411c372c79423699976Ajay Dudani    int32_t rc = NO_ERROR;
39167ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCamera3ReprocessChannel *pChannel = NULL;
39177ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (pInputChannel == NULL) {
39187ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: input channel obj is NULL", __func__);
39197ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39207ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39217ee407aa1024789089aad411c372c79423699976Ajay Dudani
39227ee407aa1024789089aad411c372c79423699976Ajay Dudani    pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
39237ee407aa1024789089aad411c372c79423699976Ajay Dudani            mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle);
39247ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (NULL == pChannel) {
39257ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: no mem for reprocess channel", __func__);
39267ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39277ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39287ee407aa1024789089aad411c372c79423699976Ajay Dudani
39297ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Capture channel, only need snapshot and postview streams start together
39307ee407aa1024789089aad411c372c79423699976Ajay Dudani    mm_camera_channel_attr_t attr;
39317ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
39327ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
39337ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue();
39347ee407aa1024789089aad411c372c79423699976Ajay Dudani    rc = pChannel->initialize();
39357ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
39367ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
39377ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
39387ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39397ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39407ee407aa1024789089aad411c372c79423699976Ajay Dudani
39417ee407aa1024789089aad411c372c79423699976Ajay Dudani    // pp feature config
39427ee407aa1024789089aad411c372c79423699976Ajay Dudani    cam_pp_feature_config_t pp_config;
39437ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
39447ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
39457ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
39467ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.sharpness = 10;
39477ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39487ee407aa1024789089aad411c372c79423699976Ajay Dudani
39497ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (isWNREnabled()) {
39507ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
39517ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.denoise_enable = 1;
39527ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate();
39537ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39547ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (needRotationReprocess()) {
39557ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
39567ee407aa1024789089aad411c372c79423699976Ajay Dudani        int rotation = mJpegSettings->jpeg_orientation;
39577ee407aa1024789089aad411c372c79423699976Ajay Dudani        if (rotation == 0) {
39587ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_0;
39597ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 90) {
39607ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_90;
39617ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 180) {
39627ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_180;
39637ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 270) {
39647ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_270;
39657ee407aa1024789089aad411c372c79423699976Ajay Dudani        }
39667ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39677ee407aa1024789089aad411c372c79423699976Ajay Dudani
39687ee407aa1024789089aad411c372c79423699976Ajay Dudani   rc = pChannel->addReprocStreamsFromSource(pp_config,
39697ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             pInputChannel,
39707ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             mMetadataChannel);
39717ee407aa1024789089aad411c372c79423699976Ajay Dudani
39727ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
39737ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
39747ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
39757ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
39767ee407aa1024789089aad411c372c79423699976Ajay Dudani    return pChannel;
39777ee407aa1024789089aad411c372c79423699976Ajay Dudani}
39787ee407aa1024789089aad411c372c79423699976Ajay Dudani
39797ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue()
39807ee407aa1024789089aad411c372c79423699976Ajay Dudani{
39817ee407aa1024789089aad411c372c79423699976Ajay Dudani    return gCamCapability[mCameraId]->min_num_pp_bufs;
39827ee407aa1024789089aad411c372c79423699976Ajay Dudani}
39837ee407aa1024789089aad411c372c79423699976Ajay Dudani
3984acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() {
3985acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan    return gCamCapability[mCameraId]->isWnrSupported;
3986acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan}
3987acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan
3988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3989