QCamera3HWI.cpp revision 8bb5784949bef76a5880ca3c9a795c71b6ac680b
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 {
48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
5080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings;
51b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
53cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
54cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    PTHREAD_MUTEX_INITIALIZER;
55cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
56cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
9697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
100b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
115e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
117e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
118e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON   },
126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH}
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
12908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
13008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
157cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
15897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
15933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
16033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
16133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
16233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
16333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
16499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      mJpegSettings(NULL),
1658bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani      mIsZslMode(false),
16699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      m_pPowerModule(NULL)
167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_init(&mRequestLock, NULL);
1769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
17874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
179e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
18033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_init(&mCaptureResultLock, NULL);
18133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
18233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
18333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
18499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
18599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
18699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
18799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
18899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
18999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
19566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
203d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
204d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
2051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
208dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
209dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            channel->stop();
210d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
211d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
212d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
213d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
214dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
215dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
21997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
22097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
22197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
22297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
223dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
224dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
225dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
226d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        mMetadataChannel->stop();
227d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        delete mMetadataChannel;
228d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        mMetadataChannel = NULL;
229dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
230dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
231dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
232cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
233cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
234e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
23533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
23633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
23733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
23833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
239e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mRequestLock);
240e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
241e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
242e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
24333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_destroy(&mCaptureResultLock);
244d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
262cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
263cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
264cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
265cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
266cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        return INVALID_OPERATION;
267cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
268cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
275cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
277cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
278cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
280cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
28199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
28299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == 0) {
28399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
28499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
28599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
28699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=1");
28799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
28899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
28999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
29099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
291cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
34299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
34399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == NO_ERROR) {
34499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
34599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
34699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
34799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=0");
34899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
34999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
35099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
35199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
35299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
373e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
37433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
37533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
37633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
37733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
37833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
379d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    //Create metadata channel and initialize it
380d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
381d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani                    mCameraHandle->ops, captureResultCb,
382d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani                    &gCamCapability[mCameraId]->padding_info, this);
383d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    if (mMetadataChannel == NULL) {
384d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        ALOGE("%s: failed to allocate metadata channel", __func__);
385d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        rc = -ENOMEM;
386d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        goto err2;
387d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    }
388d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    rc = mMetadataChannel->initialize();
389d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    if (rc < 0) {
390d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        ALOGE("%s: metadata channel initialization failed", __func__);
391d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        goto err3;
392d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    }
393d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani
3949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
395e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
396e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
397cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
3989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
3999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
400d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr3:
401d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    delete mMetadataChannel;
402d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    mMetadataChannel = NULL;
403d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr2:
404d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    deinitParameters();
4059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
406e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
4079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
42533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
4260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
430e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
436e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
443e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
448c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    camera3_stream_t *jpegStream = NULL;
4490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
453d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
454d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
457d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
460c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
461c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
462c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
4630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
4751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
4760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
4770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
4790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
4800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
4830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
4841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
4850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
4860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
487c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
488c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
491e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
496c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
497c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
498c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
5020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
5031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
516d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    //mMetadataChannel->stop();
517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
524f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
525f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
526f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
527f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
528f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
529f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
530f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
531f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
532f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
533f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
534f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
535f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
536f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
543f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5448867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
545f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
546c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
547c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
548c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
549c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
5508bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
551c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
552c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
553c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
554c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
555c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
556c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
557f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
558f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
559f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
560f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
561f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
562f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
563f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
564f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
565f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
570f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
571f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
572f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
573f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
574f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
575f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
576f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
579f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
580f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
581f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
582f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
583f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
5918867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
5921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
5931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
5941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
5951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
5961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
5971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
5981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
5991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
6001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
6011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
6021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
6031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
6041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
6051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
606a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
607e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
6080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
6121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
6131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
6141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
6151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
6161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
6170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
6201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
6211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
62233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
62433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
62533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
626e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
62733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
631e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
63480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
63580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
63680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
63780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
63880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
63980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
64080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
6429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
64380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
6459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
6479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
6499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
6509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
6559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
6569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
6579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
6589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
6629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
6639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
667c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
668c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
669c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
670c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
671c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
672c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
673c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
674c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
675c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
676c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
677c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
678c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
679c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
680c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
681c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
682c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
683c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
684c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
685c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
686c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
687c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
688c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
689c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
6909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
7189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
7199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
7209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
758e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
764e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
765e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
7660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
7671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
7681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
7691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
7700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
7711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
7721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
7731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
7741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
7750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
7760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
7770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
7780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
7801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
7810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
7830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
7840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
785e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
786e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
787e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
800e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
810e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
81174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
813e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
820e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
822e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = setFrameParameters(request->frame_number, request->settings);
8259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
8269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
827e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
8299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
83174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    meta = request->settings;
83274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
83374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
83474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
835013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
83674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
83774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
83874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
83974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
84074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
841013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
84274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
84374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
84474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
845c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
846c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
847c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
848c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
849c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
85466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
85566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
85666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
85766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
85866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
8590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
86066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
86166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
86266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
86366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
86466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
8741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
8751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
8761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
8771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
87874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
87974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
8801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
8811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
8821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
8831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
8841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
8851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
8871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
8881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
8891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
8901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
892e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
8939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
8959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
8969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
8979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
898c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
89966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
9009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
9019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
9029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
9039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
9049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
90566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
906c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
907c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
908c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
909c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
910c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
911c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
912c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
913c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
914c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
915c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
916c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
917c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
918c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
919c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
920c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
921c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
922c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
923c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
924c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
925c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
92666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
927a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
928a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
92966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
93066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
9319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
9329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
9339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
9349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
9351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
9361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
9389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_lock(&mRequestLock);
9399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
9409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
9419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_wait(&mRequestCond, &mRequestLock);
9429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
9439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_unlock(&mRequestLock);
9449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
945e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
94680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
94780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
94880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
9499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
950e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
9519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
952e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
9539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
9549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
959b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
960b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
961e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
962e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
967e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
968e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
973e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
977e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
981b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
992e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
993e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
99533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
99633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
997e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
998e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
100033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
100133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
10029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
10039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
10049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
10051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1006e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
10079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
10081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
1009e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
10101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
10111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
101233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
101333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
101433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
101533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
10160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
10170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
10180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
10190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
10200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
10211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
1022a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
10231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
10241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1026a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1027e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
10301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1031e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
10321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
10331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
1034a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
1038e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1039e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
1040e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
1041e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
1042e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
1043e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
1044e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
1045e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1046e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
1050e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
1052a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1053e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
10541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
10561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
10571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
105899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
105999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1060e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
106199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
106274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
106399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
10641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
1065e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
106674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
10671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                // Return metadata buffer
10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mMetadataChannel->bufDone(metadata_buf);
10691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
10711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
10721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
10741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
1075e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
10761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1077e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
10781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
10791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
10801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
10841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
10851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
10861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
10871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
10881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1091e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
10921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
10931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
10941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
109513dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang                        j->buffer = NULL;
10961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
10971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
10981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
11001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
11011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1102a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1103d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
11041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
11051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
11061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
11071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1108a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1109d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
11101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
11111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
11131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
11141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
111533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
111633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
11171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
11181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
11191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
11201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1121e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
11221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
11231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
11241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
11251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
11271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!max_buffers_dequeued) {
11281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
11291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
11301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
11311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
11321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
11331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
11341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
11351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
11361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1137c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
11381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
1139c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
11401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
11411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
11421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1143e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
11441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
11451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
11461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
11471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
11501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
115133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
11521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
11531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1154a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1155e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
11561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
115833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
11591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1160e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
11611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
11621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
11631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
11641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
11651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
11661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
11671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1168a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1169e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
11701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
11711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
11749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
11761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
11779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
11789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
11799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
118097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
118197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
118297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
118497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
118597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
118697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
118797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
118897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
118997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
119374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
119474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
120074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
120397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
120997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
121097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
121397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
121959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
122097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
122197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
122297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
122497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
122599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
122699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
122799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
122899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
122997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
123099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
123299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12348867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
12350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
123697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
123797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
124097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
124297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
124397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
124497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
124597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
124659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
124797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
12488bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani   if(mIsZslMode) {
12498bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
12508bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
12518bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani    } else {
12528bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        uint8_t *ae_state =
12538bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
12548bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
12558bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani   }
12560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
12570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
125897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
125997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
126097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
126197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
126297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
126397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
126459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
126597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
126697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
126897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
126997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
127297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
12750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
127997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
128259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
128397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
12860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
129097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
129397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
129497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
12960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
129797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
129897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
129997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
130097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
130197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
130297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
130597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
130697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
13080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
131097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
13120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
131397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
131497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
131797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
131897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
132897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
132997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
133097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
133197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
13360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
13370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
133897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
133997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
134097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
134197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
134297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
13440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
134597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
134697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
134797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
134897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
135097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
135171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
13520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
13530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
13540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
135571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
135671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
135797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
135897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
135997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
136097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
136197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
136297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
136397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
136497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
136597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
136697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
136797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
13683fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
136997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
137097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
13720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
137397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
137497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
13760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
137797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
137897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
13800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
138197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
138297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
13840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
138597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
138697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
138797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
138897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
138997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
139097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
139197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
139297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
139397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
139497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
139597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
139633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
139797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
139897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
139997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
140059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
140197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
140297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
140397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
140497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
140597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
140697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
140797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
140897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
140997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
141159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
141297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
141397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
141459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
141559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
141697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
141797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
141897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
141997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
142059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
142159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
142259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
142359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
142459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
142559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
142659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
142759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
142859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
142959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
143059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
143159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
143259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
143359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
143459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
143559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
143659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
143759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
143859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
143959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
144059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
144159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
144259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
144359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
144459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
144559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
144659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
144759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
144859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
144997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
145071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
145171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
145271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
145371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
145471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
145571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
145671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
145771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
145871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
145971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
146071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
146171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
146271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
146371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
146471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
146571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
146671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
146771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
146871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
146971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
147071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
147171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
147271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
147371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
147471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
147571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
147671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
147771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
147871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
147971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
148071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
148171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
148271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
148371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
148471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
148571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
148671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
148771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
148871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
148971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
149071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
149171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
149297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
149397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
149597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
149697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
149797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
149897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
149997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
150097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
150197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
150597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
150697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1538e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1539e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1540e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1541e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1542e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1582e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1583e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1596662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1597662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1600662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
163533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
163633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
163733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
163833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
163933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
164033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
164133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
164233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
164333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
164433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
164533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
164633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
164733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
164833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
164933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
165033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
165133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
165233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
165333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
165433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
165533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
16560a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
16570a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16580a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
16590a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16600a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
16610a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16620a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
16630a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
16640a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
16650a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
16660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
16670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
16680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
16690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
16700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
16710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
16720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
16730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
16740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
16750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
16760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
16770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
16780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
16790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
1690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
169497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
1695c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
1696c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
1697c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
1698c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
1699c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
1700c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
1701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
17032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
17042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
17052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1706e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
1707e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
1708e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
1709e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
1710e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
1711e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
1712e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
17142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
1715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1719c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
1720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1721c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
1722c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
1723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
1726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
1727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
1730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
1731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1734c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
1736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
173780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
173880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
173980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
174080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
174147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
174280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
174380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
174480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
174580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
174747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
17480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
174980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
175080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
175180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
175280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
175380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
175480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
1755c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
175680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
175780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
175880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
175980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
176180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
176280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
176480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
176580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1768c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
176980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
177047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
177180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
177280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
177380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
177480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
177522817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
177622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
177780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
177880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
177922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
178080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
178180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
178280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
1783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
178480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
178580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
178680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
178780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
178880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
178980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
179080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
179180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
179280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1793c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1794c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1795c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*hardcode 0 for now*/
1796c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    int32_t max_face_count = 0;
179780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1798c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &max_face_count, 1);
179980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
180180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
180280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
180480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
180580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
180780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
180880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
181080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
181180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
181380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
181480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
181780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
181880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
181980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
182022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
182122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
182222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
18258867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
1826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
182747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
1828662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1829662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1830662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
1831662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1832662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
1833c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
18340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
183547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
18360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
18370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
18380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
1839c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1840c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1841c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
184247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
1843c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
1844c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
1845c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1846c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
1847c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1848c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
184947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1850c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1851c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
1852c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1853b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
18549443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
1855c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1856c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
1857c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
185847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
1859c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1860c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
1861c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
186247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
186347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1864c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1865c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
1866c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
1867c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
186847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1869662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
1870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
1872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
1873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
187447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
187580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
187680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
187780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
187880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
187980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1880662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
188180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
188280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
188447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2];
1885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_jpeg_sizes);
1888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1889662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_jpeg_sizes,
1890c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1891c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1892c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
189308ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
189408ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
1895662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
189647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
189797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
189897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
189997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
190097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
190197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
190297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
190397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
190497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
190597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
190697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
190797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
190897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
190947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
19100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
1911662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
19120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
1913b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
19140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
19150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
19170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
19220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
192447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1925e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
19262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
19280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
1929b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
19300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
19310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
1932e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
1933e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
19342dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
19350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1937e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
19402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
194247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
1943e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
1944e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
1945e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
19469443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
19479443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
1948e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
1949e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1950e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
1951e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
195247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
19530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
19550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
1956b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
1957b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
19580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
19600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
19620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
1963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
19660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
196847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
19690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1970662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
19710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
1972b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
19730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
19740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
19760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
19810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
198347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
19840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1985662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
19860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1987b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
19880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
19890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
19910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1994662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
1995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
19960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
199847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX];
19990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2000662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
20010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FLASH_MODES_MAP,
2002b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]),
20030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_flash_modes[i]);
20040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
20050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_flash_modes[size] = (uint8_t)val;
20060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
20070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2008662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2009e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t flashAvailable = 0;
2010e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (size > 1) {
2011e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        //flash is supported
2012e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        flashAvailable = 1;
2013e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_MODE,
2015662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_flash_modes,
20160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2017662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2024e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2025e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2026e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2027e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2028e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2029e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2030e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2031e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2034e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2035ea44a483c0e98200c058a85ea339457616516847Zhijun He
2036ea44a483c0e98200c058a85ea339457616516847Zhijun He    int32_t min = INT_MAX, max = INT_MIN;
20373fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_iso_modes_cnt; i++) {
20383fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        int32_t sensitivity = getSensorSensitivity(gCamCapability[cameraId]->supported_iso_modes[i]);
20393fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        if (sensitivity != -1) {
2040ea44a483c0e98200c058a85ea339457616516847Zhijun He            min = (sensitivity >= min) ? min : sensitivity;
2041ea44a483c0e98200c058a85ea339457616516847Zhijun He            max = (sensitivity <= max) ? max : sensitivity;
20423fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
20433fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
2044ea44a483c0e98200c058a85ea339457616516847Zhijun He    int32_t sensitivity_range[] = {min, max};
2045ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2046ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2047ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
20482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
204973c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
205073c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
205173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      sizeof(int32_t) );
205273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
205373c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->processed_min_duration,
205473c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      sizeof(int32_t));
205573c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
205673c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->jpeg_min_duration,
205773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      sizeof(int32_t));
205873c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
2059b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2066662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2067662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2070662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2071662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2072662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2073662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2075662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2076662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2077662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2078662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2079662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2080662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
20820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
20830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
20840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
20850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
20870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
20890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
20910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2092c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
20930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
20940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
20950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2096c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2097c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
20980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
20990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
21000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
21012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
21022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
21032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
21042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
21062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
21082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
21112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2112e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
21139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
21149443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
21152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
21162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
21172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
21182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
21199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
21209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
21212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
21229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
21249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j] = (uint8_t)overridesTable[index].ae_mode;
21259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
21269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
21279443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
21289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
21299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
21309443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
21319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
21329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
21339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
21349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
21359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
21369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
21379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
21389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
21399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
21409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
21419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
21422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
21432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
21442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
21452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2146662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2147662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2148662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2149662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2171662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2172662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2173662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2174662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2175662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2176662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2177662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2178662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2179662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2180662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
21833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
21843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
21863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
21883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
21903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
21923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
21933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
21943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
21953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
21963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
21973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
21983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
21993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
22013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
22023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
22043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
22053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
22073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
22083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
22103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
22113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
22133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
22143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
22163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
22173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
22183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
22193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
22203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2221662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2222662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2223662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2224662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2232662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2233662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2236662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2237662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2238662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2239662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2240662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2242662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2252662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2254662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2255662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2256662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2258662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2259662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2260662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2263662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2264662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2265662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2267662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2279662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2280662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2282662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2283662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2284662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2289662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2290662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2291662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
22920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2296d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2297d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2298d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2300d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2301d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2302d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2303d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2304d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2305d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2306662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2307662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2308662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2311662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2318662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
23230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2326662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2327662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2328662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
23300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2332662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2360b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2384e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2385b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
240297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2404e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2405e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2407e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
241297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
24429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
24439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2463e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2464e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2465e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2466e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2467e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2468e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2469e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2470e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
24712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
24722dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
24732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
24742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
24752dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
248247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2485b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
248647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2487b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2488b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2489b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
24919a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
24929a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2495e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2496e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
250180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
250280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
250380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
250480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
250580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
250680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
250780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
250880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
250980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
251080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
251180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
251280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
2513662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id,
2514662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                  const camera_metadata_t *settings)
251580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
251680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
251780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
251833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (settings == NULL && mFirstRequest) {
251980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
252080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
252233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2523b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2524b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2525b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
252633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2527b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2528b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
252933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                sizeof(frame_id), &frame_id);
2533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
25370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(settings != NULL){
25391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        rc = translateMetadataToParameters(settings);
254080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
254180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
254380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
254480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
254580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
254680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
254780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
254880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
254980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
255080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
255380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
255480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
255780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
255880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
255980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
256080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
256180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
256397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    frame_settings = settings;
2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
25660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
25680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
25690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
257397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
257453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
257553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        int32_t expCompensation = frame_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
257653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
257753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
257853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
257953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
25800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
25810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
25830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
25860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
25870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
25880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
25890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
25909443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
259497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
25952b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
25962b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
25972b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
25982b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
25992b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
26002b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
26012b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
26022b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
26030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
26042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
26050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
26062b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
26072b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
26082b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
26092b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
26102b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
26112b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
26122b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
26132b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
26180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
26190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
26200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
26210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
26460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2648e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2649e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
2650e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2651e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2652e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2653e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2654e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2655e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2656e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2657e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2658e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2659e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2660e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2661e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2662f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang                                          fwk_aeMode);
26630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
26640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2665e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2666e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2667e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2668e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
26730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
26760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
26770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2678e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
2679e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
2680e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
26812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
26822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
26832dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
26840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
26852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
26862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
26891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
26900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
26922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
26932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
26942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
26952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
26960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
26972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
26982dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
26990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
27010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
27040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
27050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
27060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
27079443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
27089443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
27099443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
27109443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
27119443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             fwk_sceneMode);
27129443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2713827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
2714827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
2715827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2716827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2717827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
2718827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
2719827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2720827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
27219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                sizeof(sceneMode), &sceneMode);
27229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
27230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
27270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
27280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2745e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
2746e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t flashMode =
2747e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
2748e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
2749e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                CAM_INTF_META_FLASH_MODE, sizeof(flashMode), &flashMode);
2750e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2751e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
27560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
27570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
27600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
27610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
27620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
27640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
27670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
27680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
27690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
27700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
27710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
27748867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
27750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
27760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
27780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
27790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
27820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
27830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
27840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
27850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
27860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
27980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
28030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
28040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
28050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
28070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
28080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
28110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
28120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
28138867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
28150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
28160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
28190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
28200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
28218867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
28230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
28240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
28270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
28280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
28298867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
28310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
28320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
283471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
283571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
28360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
28370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
28380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
28390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
28400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
28410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
28420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
284347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
284447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
28450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
28470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
284871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
28490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
28520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
28530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
28540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
28560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
28570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
28600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
28610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
28620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
28640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
28650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
28680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
28690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
28700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
28720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
28730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
28760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
28770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
28780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
28790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
28800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
28830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
28840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
28850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
28860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
28870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
28900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t facedetectMode =
28910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
28950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
28980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
28990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
29000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
29020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
29030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
29060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
29070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
29220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
29230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
29240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
29250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
29260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
292859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
292959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
293071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
293159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
293271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
293371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
293471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
293571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
293671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
293771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
293871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
293959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
294059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
294159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
294259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
294371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
294459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
294571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
294671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
294771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
294871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
294971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
295071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
295171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
295259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
295359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
295459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
295559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
295671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
295759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
295871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
295971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
296071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
296171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
296271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
296371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
296471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
296559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
2966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2968662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2969662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
29700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
2971662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
29720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
2973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
2977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
2980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
2981662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
2983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
2984662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2985662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
29869a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
29879a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
29889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
29899a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
29909a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
29919a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
29929a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
29939a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
29949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
29959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
2996662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
2997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
2998662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2999662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
300097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3001662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3002662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
30030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
30040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
30050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
30060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
30070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
30080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
30100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
30110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
30120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
30131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
30140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
30160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
30170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
30180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
30190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
30200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
302108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
302208ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
30230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
30250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
30269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
30279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
30280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
30290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
30303fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
30319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
30329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
30333fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
30340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30359a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
30360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
30379a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
30389a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
30390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
30409a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
30419a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
30420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
30459a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
30469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
30479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
30489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
30499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30509a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
30519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
30529a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30539a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
30549a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
30550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30563fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
30570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
30580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
30590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
30603fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
30613fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
30620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30639a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
30640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
30650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
30670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
306853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
306953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
307053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
307153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
307253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
30730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
307480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
307580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
307680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
307780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
3078e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
3079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
3084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
3086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
3088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
30891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3090e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
3091e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
3092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
3095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
3096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
3097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3099e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
3100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
3101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
3105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
3107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
3112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
3113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
3117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3118d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
31261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3127d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3148d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
31551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3156d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3173d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
31801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3181d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
31969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
31979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
31989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3201d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
321097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3212d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
32269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
32279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
32289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3230d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
323180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
323280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
323380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
323480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
32359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
323680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
32379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
32381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3239d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
32401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3254e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3255e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3256e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3258d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3259e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3260e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3261e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3262e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3263e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3264e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3265e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3267d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3268e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3282e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3283e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3285d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3286e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3288e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3289e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3290e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3291e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3292e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3293e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3294d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3295e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3298e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3299e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3301e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3302e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3303e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3304e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3305e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3306e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3307e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3308e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3310d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3311e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3312e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3313e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3316e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3317e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3318e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3319e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3320cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3321cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3322cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3323cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3324d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3329