QCamera3HWI.cpp revision 6356e2d4fc01ff878ac4664d86892c8d81e330a9
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  },
1256356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE },
1266356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { 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_cond_init(&mRequestCond, NULL);
1769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
17774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
17933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
18033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
18133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
18299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
18399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
18499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
18599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
18699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
18799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
19366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
201d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
202d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
2031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
206dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
207dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            channel->stop();
208d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
209d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
210d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
211d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
212dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
213dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
21797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
21897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
21997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
22097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
221dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
222dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
223dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
224d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        mMetadataChannel->stop();
225d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        delete mMetadataChannel;
226d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        mMetadataChannel = NULL;
227dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
228dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
229dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
230cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
231cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
232e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
23333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
23433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
23533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
23633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
237e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
238e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
239e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
240d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
258cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
259cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
260cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
261cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
262cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        return INVALID_OPERATION;
263cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
264cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
271cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
273cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
274cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
276cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
27799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
27899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == 0) {
27999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
28099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
28199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
28299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=1");
28399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
28499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
28599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
28699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
287cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
33899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
33999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == NO_ERROR) {
34099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
34199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
34299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
34399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=0");
34499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
34599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
34699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
34799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
34899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
37033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
37133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
37233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
37333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
37433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
375d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    //Create metadata channel and initialize it
376d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
377d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani                    mCameraHandle->ops, captureResultCb,
378d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani                    &gCamCapability[mCameraId]->padding_info, this);
379d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    if (mMetadataChannel == NULL) {
380d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        ALOGE("%s: failed to allocate metadata channel", __func__);
381d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        rc = -ENOMEM;
382d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        goto err2;
383d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    }
384d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    rc = mMetadataChannel->initialize();
385d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    if (rc < 0) {
386d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        ALOGE("%s: metadata channel initialization failed", __func__);
387d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        goto err3;
388d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    }
389d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani
3909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
391e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
392e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
393cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
3949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
3959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
396d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr3:
397d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    delete mMetadataChannel;
398d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    mMetadataChannel = NULL;
399d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr2:
400d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    deinitParameters();
4019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
402e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
4039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
42133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
4220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
426e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
432e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
439e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
444c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    camera3_stream_t *jpegStream = NULL;
4450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
449d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
450d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
453d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
456c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
457c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
458c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
4590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
4711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
4720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
4730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
4750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
4760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
4770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
4790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
4801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
483c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
484c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
487e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
492c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
493c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
494c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
512d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    //mMetadataChannel->stop();
513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
520f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
521f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
522f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
523f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
524f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
525f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
526f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
527f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
528f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
529f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
530f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
531f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
532f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
539f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5408867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
541f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
542c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
543c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
544c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
545c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
5468bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
547c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
548c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
549c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
550c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
551c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
552c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
553f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
554f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
555f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
556f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
557f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
558f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
559f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
560f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
561f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
562f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
563f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
564f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
565f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
570f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
571f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
572f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
573f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
574f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
575f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
576f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
579f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
5878867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
5881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
5891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
5901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
5911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
5921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
5931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
5941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
5951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
5961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
5971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
5981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
5991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
6001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
6011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
602a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
603e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
6040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
6081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
6091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
6101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
6111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
6121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
6130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
6161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
6171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
61833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
62033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
62133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
622e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
62333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
627e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
629e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
63080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
63180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
63280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
63380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
63480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
63580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
63680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
6389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
63980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
6419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
6429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
6439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
6459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
6479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
6539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
6549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
6589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
6599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
663c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
664c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
665c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
666c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
667c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
668c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
669c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
670c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
671c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
672c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
673c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
674c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
675c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
676c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
677c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
678c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
679c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
680c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
681c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
682c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
683c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
684c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
685c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
6869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
6899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
6909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
758e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
7620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
7631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
7641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
7651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
7660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
7671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
7681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
7691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
7701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
7710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
7720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
7730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
7740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
7761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
7770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
7790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
7800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
781e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
783e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
784e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
785e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
786e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
787e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
800e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
80774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
810e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
813e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
820662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = setFrameParameters(request->frame_number, request->settings);
8219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
8229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
8249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
8259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
82774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    meta = request->settings;
82874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
82974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
83074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
831013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
83274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
83374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
83474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
83574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
83674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
837013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
83874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
83974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
84074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
841c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
842c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
843c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
844c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
845c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
846e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
847e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
848e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
85066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
85166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
85266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
85366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
85466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
8550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
85666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
85766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
85866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
85966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
86066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
8701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
8711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
8721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
87374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
87474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
8751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
8761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
8771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
8781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
8791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
8801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
8821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
8831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
8841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
8879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
8899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
8909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
8919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
892c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
89366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
8949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
8959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
8969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
8979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
89966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
900c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
901c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
902c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
903c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
904c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
905c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
906c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
907c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
908c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
909c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
910c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
911c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
912c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
913c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
914c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
915c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
916c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
917c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
918c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
919c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
92066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
921a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
922a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
92366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
92466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
9259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
9269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
9279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
9289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
9291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
9329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
9339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
9345b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang        pthread_cond_wait(&mRequestCond, &mMutex);
9359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
9369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
93880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
93980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
94080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
9419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
9439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
9459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
9469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
949e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
950e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
951b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
952b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
954e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
959e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
960e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
961e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
962e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
967e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
968e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
973b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
977e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
98733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
98833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
99233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
99333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
9949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
9959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
9969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
9971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
998e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
9999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
10005b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_lock(&mMutex);
1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
10021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
10031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
100433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
100533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
1006152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        uint32_t pending_requests = *(uint32_t *)POINTER_OF(
1007152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang            CAM_INTF_META_PENDING_REQUESTS, metadata);
100833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
100933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
10100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
10110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
10120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
10130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
10140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
10151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
1016a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
10171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
10181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
10191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1020a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1021e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
10221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
10241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1025e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
10261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
1028a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
10291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
10311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
1032e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1033e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
1034e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
1035e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
1036e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
1037e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
1038e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
1039e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1040e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
1044e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
1046a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1047e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
105299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
105399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1054e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
105599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
105674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
105799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
1059e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
106074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
10611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                // Return metadata buffer
10621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mMetadataChannel->bufDone(metadata_buf);
10631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
10651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
10661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
1069e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
10701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1071e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
10721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
10731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
10741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
10781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
10791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
10801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
10811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
10821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
10841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1085e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
10861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
10871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
10881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
108913dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang                        j->buffer = NULL;
10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
10911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
10921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
10941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1096a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1097d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
10981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
10991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
11001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
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            }
11061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
11071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
11081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
110933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
111033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
11111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
11121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
11131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
11141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1115e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
11161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
11171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
11181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
11191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1121152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        if (!max_buffers_dequeued && !pending_requests) {
11221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
11231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
11241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
11251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
11261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
11271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
11281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
11291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
11301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1131c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
11321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
1133c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
11341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
11351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
11361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1137e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
11381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
11391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
11401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
11411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
11441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
114533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
11461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
11471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1148a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1149e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
11501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
115233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
11531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1154e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
11551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
11561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
11571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
11581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
11591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
11601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
11611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1162a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1163e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
11641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
11651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
11689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
11705b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_unlock(&mMutex);
11719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
11729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
11739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
117497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
117597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
117697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
117797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
117897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
117997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
118097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
118197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
118297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
118497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
118597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
118697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
118774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
118874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
118997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
119474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
119997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
120397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
120997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
121097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
121359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
121999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
122099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
122199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
122299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
122499b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
122597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
122699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
122797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12288867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
12290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
123597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
123797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
123897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
124059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
12428bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani   if(mIsZslMode) {
12438bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
12448bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
12458bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani    } else {
12468bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        uint8_t *ae_state =
12478bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
12488bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
12498bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani   }
12500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
12510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
125297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
125497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
125597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
125697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
125859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
125997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
126097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
126297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
126397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
126497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
126597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
126697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
126797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
12690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
127497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
127659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
12800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
128597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
12900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
129297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
129397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
129497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
129597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
129697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
129797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
129897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
129997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
130097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
13020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
13060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
130797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
130897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
131097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
131197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
131297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
131497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
131897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
132897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
13300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
13310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
133597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
133697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
13380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
133997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
134097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
134197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
134297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
134497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
134571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
13460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
13470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
13480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
134971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
135071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
135197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
135297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
135397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
135497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
135597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
135697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
135797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
135897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
135997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
136097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
136197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
13623fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
136397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
136497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
13660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
136797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
136897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
13700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
137197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
137297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
13740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
137597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
137697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
13780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
137997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
138097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
138197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
138297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
138397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
138497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
138597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
138697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
138797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
138897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
138997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
139033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
139197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
139297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
139397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
139459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
139597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
139697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
139797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
139897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
139997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
140097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
140197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
140297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
140397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
140497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
140559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
140697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
140797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
140859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
140959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
141097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
141197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
141297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
141397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
141459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
141559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
141659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
141759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
141859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
141959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
142059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
142159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
142259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
142359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
142459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
142559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
142659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
142759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
142859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
142959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
143059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
143159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
143259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
143359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
143459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
143559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
143659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
143759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
143859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
143959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
144059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
144159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
144259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
144397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
144471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
144571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
144671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
144771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
144871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
144971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
145071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
145171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
145271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
145371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
145471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
145571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
145671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
145771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
145871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
145971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
146071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
146171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
146271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
146371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
146471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
146571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
146671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
146771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
146871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
146971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
147071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
147171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
147271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
147371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
147471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
147571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
147671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
147771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
147871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
147971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
148071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
148171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
148271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
148371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
148471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
148571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
148697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
148797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
148997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
149097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
149297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
149397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
149597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
149697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
149797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
149897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
149997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
150097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
150197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
150597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1532e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1533e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1534e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1535e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1536e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1576e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1577e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1596662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1597662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1600662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
162933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
163033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
163133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
163233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
163333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
163433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
163533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
163633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
163733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
163833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
163933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
164033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
164133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
164233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
164333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
164433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
164533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
164633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
164733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
164833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
164933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
16500a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
16510a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16520a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
16530a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16540a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
16550a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16560a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
16570a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
16580a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
16590a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
16600a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
16610a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
16620a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
16630a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
16640a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
16650a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
16660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
16670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
16680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
16690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
16700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
16710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
16720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
16730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
1684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
168897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
1689c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
1690c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
1691c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
1692c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
1693c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
1694c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
1695662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
16972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
16982dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
16992dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1700e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
1701e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
1702e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
1703e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
1704e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
1705e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
1706e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
17082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
1709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1713c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
1714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1715c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
1716c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
1717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
1720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
1721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
1724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
1725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1728c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
1730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
173180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
173280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
173380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
173480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
173547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
173680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
173780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
173880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
173980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
174147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
17420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
174380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
174480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
174580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
174680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
174780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
174880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
1749c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
175080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
175180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
175280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
175380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
175480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
175580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
175680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
175780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
175880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
175980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1762c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
176380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
176580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
176680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
176780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
176880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
177022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
177180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
177280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
177322817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
177480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
177580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
177680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
1777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
177880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
177980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
178080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
178180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
178280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
178380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
178480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
178580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
178680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1787c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1788c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1789c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*hardcode 0 for now*/
1790c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    int32_t max_face_count = 0;
179180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1792c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &max_face_count, 1);
179380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
179480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
179580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
179680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
179780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
179880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
179980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
180180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
180280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
180480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
180580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
180780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
180880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
181180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
181280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
181380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181422817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
181522817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
181622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
1817662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1818662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
18198867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
1820662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
182147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
1822662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
1825662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
1827c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
1828e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
1829e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->min_duration[0],
1830e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->supported_sizes_tbl_cnt);
18310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
183247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
18330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
18340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
18350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
1836c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1837c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1838c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
183947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
1840c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
1841c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
1842c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1843c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
1844c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1845c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
184647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1847c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1848c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
1849c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1850b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
18519443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
1852c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1853c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
1854c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
185547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
1856c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1857c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
1858c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
185947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
186047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1861c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1862c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
1863c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
1864c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
186547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1866662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
1867662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
1869662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
1870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
187147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
187280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
187380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
187480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
187580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
187680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
187880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
187980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
188147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2];
1882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_jpeg_sizes);
1885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_jpeg_sizes,
1887c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1888c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1889c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
189008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
189108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
1892662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
189347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
189497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
189597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
189697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
189797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
189897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
189997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
190097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
190197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
190297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
190397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
190497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
190597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
190647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
19070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
19090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
1910b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
19110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
19120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
19140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
19190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
192147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1922e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
19232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
19250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
1926b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
19270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
19280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
1929e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
1930e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
19312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
19320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1934e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
19372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
193947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
1940e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
1941e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
1942e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
19439443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
19449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
1945e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
1946e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1947e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
1948e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
194947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
19500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
19520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
1953b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
1954b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
19550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
19570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
19590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
1960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
19630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
196547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
19660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
19680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
1969b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
19700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
19710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
19730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
19780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
198047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
19810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
19830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1984b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
19850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
19860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
19880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
1992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
19930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1994662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
199547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX];
19960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
19980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FLASH_MODES_MAP,
1999b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]),
20000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_flash_modes[i]);
20010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
20020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_flash_modes[size] = (uint8_t)val;
20030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
20040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2006e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t flashAvailable = 0;
2007e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (size > 1) {
2008e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        //flash is supported
2009e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        flashAvailable = 1;
2010e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_MODE,
2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_flash_modes,
20130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2015e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2016e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2024e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2025e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2026e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2027e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2028e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2029662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2031e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2032ea44a483c0e98200c058a85ea339457616516847Zhijun He
2033e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    int32_t sensitivity_range[2];
2034e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2035e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2036ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2037ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2038ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
20392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
204073c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
204173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
204273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      sizeof(int32_t) );
204373c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2044e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2045e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
204673c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
2047b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2052662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2053662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2056662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2063662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2066662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2067662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
20700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
20710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
20720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
20730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
20750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
20770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
20790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2080c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
20810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
20820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
20830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2084c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2085c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
20860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
20870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
20880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
20892dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
20902dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
20912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
20922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
20942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
20962dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20982dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
20992dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2100e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
21019443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
21029443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
21032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
21042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
21052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
21062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
21079443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
21089443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
21092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
21109443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2111e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
21129443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j] = (uint8_t)overridesTable[index].ae_mode;
21139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
21149443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
21159443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
21169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
21179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
21189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
21199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
21209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
21219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
21229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
21239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
21249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
21259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
21269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
21279443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
21289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
21299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
21302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
21312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
21322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
21332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2134662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2135662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2140662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2141662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2142662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2143662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2144662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2145662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2146662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2147662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2148662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2149662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
21713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
21723fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21733fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
21743fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21753fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
21763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21773fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
21783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21793fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
21803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
21813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
21823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
21833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
21843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
21853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
21863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
21873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
21883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
21893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
21903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
21913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
21923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
21933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
21943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
21953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
21963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
21973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
21983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
21993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
22013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
22023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
22043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
22053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
22063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
22073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
22083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2209662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2210662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2211662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2212662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2213662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2215662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2216662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2217662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2219662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2220662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2221662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2222662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2223662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2224662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2232662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2233662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2236662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2237662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2238662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2239662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2240662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2242662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2252662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2254662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2255662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2256662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2258662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2259662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2260662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2263662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2264662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2265662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2267662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2279662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
22800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2282662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2283662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2284d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2285d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2286d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2288d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2289d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2290d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2291d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2292d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2293d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2296662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2298662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2304662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2305662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2306662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2307662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2308662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
23110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
23180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2348b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2373b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
239097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2392e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2393e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2395e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
240097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
24309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
24319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2451e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2452e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2453e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2454e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2455e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2456e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2457e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2458e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
24592dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
24602dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
24612dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
24622dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
24632dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
247047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2473b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
247447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2475b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2476b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2477b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
24799a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
24809a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2483e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2484e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
248980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
249080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
249180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
249280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
249380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
249480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
249580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
249680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
249780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
249880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
249980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
250080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
2501662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id,
2502662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                  const camera_metadata_t *settings)
250380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
250480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
250580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
250633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (settings == NULL && mFirstRequest) {
250780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
250880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2509662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
251033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2511b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2512b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2513b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
251433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2515b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2516b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
251733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2519662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                sizeof(frame_id), &frame_id);
2521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
25250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(settings != NULL){
25271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        rc = translateMetadataToParameters(settings);
252880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
252980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
253180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
253280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
253380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
253480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
253580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
253680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
253780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
253880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
253980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
254080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
254180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
254280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
254380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
254480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
254580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
254680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
254780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
254880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
254980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
255197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    frame_settings = settings;
2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
25540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
25560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
25580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
25600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
256197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
256253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
2563e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        int32_t expCompensation = frame_settings.find(
2564e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
2565e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (expCompensation < gCamCapability[mCameraId]->exposure_time_range[0])
2566e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_time_range[0];
2567e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (expCompensation > gCamCapability[mCameraId]->exposure_time_range[1])
2568e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_time_range[1];
256953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
257053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
257153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
257253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
25760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
25770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
25790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
25800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
25810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
25839443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
25850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
25860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
258797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
25882b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
25892b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
25902b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
25912b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
25922b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
25932b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
25942b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
25952b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
25972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
25992b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
26002b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
26012b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
26022b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
26032b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
26042b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
26052b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
26062b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
26070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
26080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
26090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
26110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
26130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
26190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
26200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
26210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2641e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2642e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
26436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2644e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2645e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2646e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2647e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2648e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2649e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2650e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2651e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2652e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2653e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
26546356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2655e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2656e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2657f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang                                          fwk_aeMode);
26580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
26590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2660e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2661e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2662e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2663e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
26640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
26670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
26680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
26700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
26710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2673e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
2674e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
2675e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
26762dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
26772dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
26782dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
26790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
26802dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
26812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
26820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
26841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
26872dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
26882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
26892dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
26902dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
26910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
26922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
26932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
26940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
26960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
26990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
27000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
27010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
27029443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
27039443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
27049443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
27059443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
27069443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             fwk_sceneMode);
27079443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2708827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
2709827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
2710827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2711827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2712827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
2713827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
2714827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2715827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
27169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                sizeof(sceneMode), &sceneMode);
27179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
27180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
27210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
27220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
27230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
27280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
27310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2740e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
27416356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        int32_t respectFlashMode = 1;
27426356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
27436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t fwk_aeMode =
27446356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
27456356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
27466356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                respectFlashMode = 0;
27476356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
27486356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                    __func__);
27496356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            }
27506356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
27516356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (respectFlashMode) {
27526356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t flashMode =
27536356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
27546356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
27556356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          sizeof(FLASH_MODES_MAP),
27566356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          flashMode);
27576356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
27586356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            // To check: CAM_INTF_META_FLASH_MODE usage
27596356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
27606356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                          sizeof(flashMode), &flashMode);
27616356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
2762e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
27640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
27650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
27660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
27670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
27680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
27690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
27720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
27730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
27740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
27760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
27790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
27800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
27810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
27820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
27830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
27868867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
27870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
27980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
28020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
28030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
28040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
28050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
28080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
28090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
28100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
28110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
28120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
28150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
28160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
28170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
28190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
28200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
28230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
28240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
28258867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
28270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
28280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
28310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
28320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
28338867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
28350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
28360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
28390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
28400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
28418867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
28430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
28440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
284671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
284771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
28480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
28490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
28500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
28510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
28520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
28530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
28540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
285547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
285647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
28570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
28590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
286071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
28610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
28640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
28650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
28660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
28680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
28690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
28720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
28730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
2874e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
2875e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
28760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
28780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
28790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
28820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
28830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
2884e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity <
2885e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
2886e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
2887e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
2888e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity >
2889e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
2890e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
2891e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
28950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
28980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
28990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
29000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
29010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
29020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
29050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
29060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
29070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t facedetectMode =
29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
29200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
29210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
29220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
29240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
29250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
29280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
29330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
29360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
29380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
29440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
295059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
295159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
295271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
295359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
295471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
295571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
295671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
295771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
295871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
295971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
296071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
296159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
296259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
296359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
296459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
296571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
296659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
296771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
296871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
296971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
297071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
297171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
297271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
297371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
297459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
297559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
297659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
297759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
297871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
297959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
298071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
298171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
298271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
298371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
298471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
298571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
298671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
298759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
2988662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2989662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
2993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
29940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
2995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2996662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2998662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
2999662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3000662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3001662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
3002662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
3003662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
3004662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
3005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
3006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
30089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
30099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
30109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
30119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
30139a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
30149a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
30159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
30169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
30179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
3018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
3019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
3020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
302297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3024662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
30250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
30260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
30270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
30280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
30290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
30300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
30320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
30330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
30340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
30351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
30360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
30380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
30390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
30400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
30410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
30420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
304308ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
304408ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
30450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
30470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
30489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
30499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
30500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
30510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
30523fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
30539a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
30549a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
30553fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
30560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30579a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
30580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
30599a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
30609a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
30629a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
30639a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
30640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
30679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
30689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
30699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
30709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
30719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
30739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
30749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
30769a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
30770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
30790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
30800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
30810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
30823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
30833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30859a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
30890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
309053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
309153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
309253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
309353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
309453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
30950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
309680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
309780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
309880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
309980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
3100e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
3101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
3106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
3108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
3110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
31111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3112e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
3113e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
3114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
3117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
3118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3121e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
3122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
3123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
3127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
3129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
3134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
3135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
3139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3140d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
31481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3149d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3170d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
31771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3178d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3195d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
32021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3203d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
32041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
32189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
32199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
32209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3223d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
323297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3234d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
32489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
32499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
32509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3252d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
325380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
325480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
325580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
325680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
32579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
325880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
32599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
32601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3261d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
32621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3276e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3277e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3278e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3280d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3281e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3282e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3283e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3284e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3285e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3286e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3288e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3289d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3290e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3304e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3305e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3307d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3308e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3310e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3311e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3312e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3313e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3316d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3317e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3320e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3328e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3329e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3330e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3331e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3332d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3333e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3334e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3335e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3336e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3337e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3338e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3339e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3340e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3342cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3343cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3344cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3345cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3346d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3351