QCamera3HWI.cpp revision dbeda6fde21ef974c09a2a8a89c6729f1873f660
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without
4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are
5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met:
6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions of source code must retain the above copyright
7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       notice, this list of conditions and the following disclaimer.
8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions in binary form must reproduce the above
9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       copyright notice, this list of conditions and the following
10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       disclaimer in the documentation and/or other materials provided
11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       with the distribution.
12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Neither the name of The Linux Foundation nor the names of its
13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       contributors may be used to endorse or promote products derived
14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       from this software without specific prior written permission.
15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/
29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI"
31625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h>
33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h>
34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h>
35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h>
36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h>
37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h>
38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h>
39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h>
40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h"
41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h"
42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h"
4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h"
44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera {
48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
5080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings;
51b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
53cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
54cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    PTHREAD_MUTEX_INITIALIZER;
55cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
56cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
9697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
100b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
115e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
117e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
118e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON   },
126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH}
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
12908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
13008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
157cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
15897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
15933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
16033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
16133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
16233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
16333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
16497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mJpegSettings(NULL)
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_init(&mRequestLock, NULL);
1749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
17674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
177e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
17933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_init(&mCaptureResultLock, NULL);
18033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
18133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
18233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
18866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
196d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
197d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
1981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
1991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
201dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
202dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            channel->stop();
203d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
204d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
205d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
206d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
207dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
208dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
21297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
21397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
21497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
21597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
216dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
217dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
218dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
219dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        mMetadataChannel->stop();
220dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        delete mMetadataChannel;
221dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        mMetadataChannel = NULL;
222dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
223dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
224dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
225cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
226cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
227e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
22833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
22933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
23033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
23133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
232e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mRequestLock);
233e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
234e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
235e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
23633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_destroy(&mCaptureResultLock);
237d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
255cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
256cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
257cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
258cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
259cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        return INVALID_OPERATION;
260cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
261cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
268cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
270cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
271cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
273cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
274cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
344e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
345e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
34633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
34733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
34833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
34933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
35033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
3519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Create metadata channel and initialize it
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
353e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    mCameraHandle->ops, captureResultCb,
354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    &gCamCapability[mCameraId]->padding_info, this);
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mMetadataChannel == NULL) {
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
3579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        rc = -ENOMEM;
35833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        goto err2;
3599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    rc = mMetadataChannel->initialize();
3619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
3629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: metadata channel initialization failed", __func__);
3639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err3;
3649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
367e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
369cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
3709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
3719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3:
3739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    delete mMetadataChannel;
3749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mMetadataChannel = NULL;
37533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangerr2:
37633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    deinitParameters();
3779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
378e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
39733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
3980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
399e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
403e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
409e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
416e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
4210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
425d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
426d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
429d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
4321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ALOGV("%s: newStream type = %d, stream format = %d",
4331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                __func__, newStream->stream_type, newStream->format);
4340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
4461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
4470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
4480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
4500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
4530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
4540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
4551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
4560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
4570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT) {
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
461e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
4720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
4731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
4741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
4750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
4760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
4771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
4781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
4791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
4800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
48333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //mMetadataChannel->stop();
484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
491f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
492f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
493f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
494f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
495f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
496f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
497f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
498f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
499f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
500f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
501f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
502f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
503f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
510f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5118867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
512f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
513f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
514f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
515f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
516f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
517f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
518f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
519f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
520f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
521f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
522f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
523f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
524f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
525f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
526f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
527f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
528f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
529f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
530f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
531f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
532f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
533f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
534f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
535f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
536f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
537f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
538f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
539f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
540f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
5488867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
5491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
5501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
5511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
5521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
5531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
5541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
5551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
5561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
5571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
5581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
5591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
5601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
5611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
5621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
563a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
564e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
5650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
5660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
5681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
5691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
5701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
5711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
5731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
5740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
5751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
5761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
5771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
5781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
57933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
5809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
58133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
58233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
583e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
58433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
588e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
590e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
59180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
59280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
59380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
59480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
59580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
59680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
59780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
598e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
5999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
60080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
6019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
6029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
6039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
6049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
6069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
6079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
6089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
6129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
6139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
6149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
6159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
6209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
6249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        //TODO
6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Not supporting input buffer yet", __func__);
6269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
6309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
6319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
6329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
6339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
6349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
6359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
6369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
6419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
6459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
6509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
6559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
6569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
6579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
681e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
682e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
683e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
684e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
685e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
686e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
687e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
688e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
689e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
690e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
691e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
692e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
693e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
694e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
695e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
696e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
697e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
698e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
699e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
700e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
701e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
702e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
7030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
7041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
7051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
7061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
7070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
7081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
7091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
7101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
7111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
7120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
7130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
7140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
7150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
7171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
7180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
7200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
7210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
7220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (stream->stream_type != CAMERA3_STREAM_OUTPUT) {
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: not yet support non output type stream", __func__);
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
75474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
758e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
764e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
765e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
768662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = setFrameParameters(request->frame_number, request->settings);
7699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
7709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
7729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
7739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
77574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    meta = request->settings;
77674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
77774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
77874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
779013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
78074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
78174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
78274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
78374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
78474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
785013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
78674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
78774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
78874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
78974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
790e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang    ALOGV("%s: %d, num_output_buffers = %d", __func__, __LINE__,
791e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                    request->num_output_buffers);
792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
79666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
79766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
79866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
79966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
80066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
8010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
80266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
80366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
80466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
80566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
80666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
810e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
813e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
8161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
8171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
8181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
8191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
82074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
82174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
8221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
8231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
8241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
8251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
8261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
8271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
8291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
8301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
8311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
8321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
834e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
8359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
8379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
8389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
8399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
84066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
8419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
8429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
8439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
8449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
84666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
84766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber, mJpegSettings);
84866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
849a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
850a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
85166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
85266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
8539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
8549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
8559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
8581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
8609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_lock(&mRequestLock);
8619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
8629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
8639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_wait(&mRequestCond, &mRequestLock);
8649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_unlock(&mRequestLock);
8669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
86880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
86980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
87080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
8719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
8739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
8759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
8769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
881b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
882b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
892e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
894e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
895e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
896e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
897e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
898e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
899e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
900e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
901e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
902e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
903b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
904e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
905e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
906e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
907e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
908e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
909e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
914e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
91733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
91833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
919e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
920e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
921e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
92233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
92333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
9249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
9259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
9269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
9271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
9299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
931e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
9331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
93433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
93533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
93633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
93733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
9380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
9390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
9400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
9410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
9420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
9431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
944a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
9451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
9461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
9471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
948a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
949e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
9501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
9521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
953e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
9541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
9551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
956a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
9571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
9591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
960e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
961e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
962e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
963e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
964e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
965e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
966e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
967e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
968e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
9691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
9701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
9711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
972e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
9731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
974a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
975e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
9761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
9781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
9791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
98099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
98199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
982e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
98399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
98474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
98599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
9861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
987e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
98874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
9891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                // Return metadata buffer
9901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mMetadataChannel->bufDone(metadata_buf);
9911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
9931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
9941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
9961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
997e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
9981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
999e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
10001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
10011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
10021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
10061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
10071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
10081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
10091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
10101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
10121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1013e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
10141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
10151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
10161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
10171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
10181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
10191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
10211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1023a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1024d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
10261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1029a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1030d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
10311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
10321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
103633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
103733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
10381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
10391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
10401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1042e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
10441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!max_buffers_dequeued) {
10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
10521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
10531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
10541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
10551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
10561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
10571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        while (i != mPendingRequestsList.end() && i->frame_number != frame_number)
10591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
10601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
10611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
10621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1063e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
10641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
10651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
10661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
10671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
10701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
107133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
10721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
10731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1074a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1075e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
10761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1077e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
107833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
10791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1080e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
10811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
10821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
10831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
10841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
10851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
10861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
10871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1088a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1089e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
10911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1093e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
10949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
10959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
10961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
10979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
10989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
10999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
110097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
110197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
110297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
110397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
110497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
110597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
110697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
110797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
110897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
110997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
111097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
111197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
111297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
111374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
111474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
111597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
111697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
111797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
111897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
112074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
112197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
112297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
112397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
112497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
112597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
112697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
112797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
112897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
112997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
113097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
113197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
113297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
113397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
113497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
113597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
113697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
113797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
113897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
113959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
114097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
114197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
114297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
114397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
114497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
114599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
114699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
114799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
114899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
114997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
115099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
115197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
115299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
115397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11548867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
11550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
115697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
115797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
115897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
115997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
116097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
116197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
116297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
116397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
116497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
116597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
116659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
116797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
116897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *ae_state =
11700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
117197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
117297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
11740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
117597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
117697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
117797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
117897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
117997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
118097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
118159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
118297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
118597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
118697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
118797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
118897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
118997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
11920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
119397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
119497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
119959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
12030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
121097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
12130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
121997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
122097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
122197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
122297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
122697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
122797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
12290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
123597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
123797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
123897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
124097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
124297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
124397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
124497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
124597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
124697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
124797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
124897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
124997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
125097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
125197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
12530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
12540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
125597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
125697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
125897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
125997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
12610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
126297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
126397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
126497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
126597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
126797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
126871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
12690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
12700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
12710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
127271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
127371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
127497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
128397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
12853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
128697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
12890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
129097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
12930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
129497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
129597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
12970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
129897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
129997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
13010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
130297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
130597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
130697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
130797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
130897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
131097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
131197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
131333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
131497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
131759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
131897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
132859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
132997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
133097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
133159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
133259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
133597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
133697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
133759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
133859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
133959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
134059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
134159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
134259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
134359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
134459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
134559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
134659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
134759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
134859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
134959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
135059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
135159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
135259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
135359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
135459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
135559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
135659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
135759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
135859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
135959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
136059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
136159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
136259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
136359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
136459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
136559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
136697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
136771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
136871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
136971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
137071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
137171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
137271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
137371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
137471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
137571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
137671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
137771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
137871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
137971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
138071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
138171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
138271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
138371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
138471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
138571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
138671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
138771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
138871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
138971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
139071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
139171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
139271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
139371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
139471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
139571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
139671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
139771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
139871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
139971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
140071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
140171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
140271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
140371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
140471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
140571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
140671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
140771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
140871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
140997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
141097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
141297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
141497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
141597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
141697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
141997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
142097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
142197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
142297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
142397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
142497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
142597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
142697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
142797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
142897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1455e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1456e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1457e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1458e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1459e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1499e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1500e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1508662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1509662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1510662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1511662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1512662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1513662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1514662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1515662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1516662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1517662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1519662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
155233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
155333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
155433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
155533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
155633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
155733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
155833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
155933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
156033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
156133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
156233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
156333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
156433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
156533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
156633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
156733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
156833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
156933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
157033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
157133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
157233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
15730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
15740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
15750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
15760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
15770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
15780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
15790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
15800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
15810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
15820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
15830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
15840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
15850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
15860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
15870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
15880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
15890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
15900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
15910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
15920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
15930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
15940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
15950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
15960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
1607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
161197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
1612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
16142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
16152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
16162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1617e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
1618e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
1619e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
1620e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
1621e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
1622e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
1623e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
16252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
1626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1630c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
1631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1632c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
1633c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
1634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
1637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
1638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
1641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
1642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1645c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
1647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
164880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
164980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
165080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
165180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
165247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
165380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
165480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
165580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
165680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
165880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map,
16590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            sizeof(gCamCapability[cameraId]->lens_shading_map)/ sizeof(float));
1660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
166147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
16620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
166380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
166480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
166580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
166680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
166780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
166880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
1669c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
167080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
167180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
167280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
167380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
167480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
167580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
167680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
167780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
167880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
167980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
168080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
168180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1682c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
168380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
168447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
168580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
168680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
168780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
168880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
168947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width,
169080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
169147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang
169280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
169380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      active_array_size, 2);
169480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
169580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
169680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
1697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
169880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
169980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
170080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
170180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
170280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
170380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
170480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
170580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
170680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1707c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1708c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1709c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*hardcode 0 for now*/
1710c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    int32_t max_face_count = 0;
171180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1712c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &max_face_count, 1);
171380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
171480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
171580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
171680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
171780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
171880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
171980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
172180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
172280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
172480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
172580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
172780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
172880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
173080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
173180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
173280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
173380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
173459907a1735a991f67d84bff196879de2611ac732Mansoor Aftab    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888};
173559907a1735a991f67d84bff196879de2611ac732Mansoor Aftab    int scalar_formats_count = 1;
1736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1737662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
17388867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
1739662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
174047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
1741662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1743662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
1744662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1745662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
1746c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
17470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
174847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
17490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
17500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
17510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
1752c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1753c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1754c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
175547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
1756c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
1757c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
1758c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1759c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
1760c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1761c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
176247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1763c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1764c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
1765c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1766b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
176747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float maxZoom = 10;
1768c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1769c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
1770c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
177147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
1772c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1773c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
1774c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
177547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
177647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1777c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1778c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
1779c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
1780c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
178147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1782662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
1783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
1785662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
1786662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
178747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
178880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
178980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
179080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
179180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
179280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
179480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
179580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
179747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2];
1798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_jpeg_sizes);
1801662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1802662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_jpeg_sizes,
1803c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1804c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1805c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
180608ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
180708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
1808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
180947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
181097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
181197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
181297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
181397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
181497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
181597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
181697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
181797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
181897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
181997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
182097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
182197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
182247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
18230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
18250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
1826b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
18270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
18280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
18300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1832662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1834662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
18350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1836662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
183747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1838e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
18392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
1840662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
18410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
1842b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
18430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
18440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
1845e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
1846e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
18472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
18480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1850e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1851662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1852662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
18532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
1854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
185547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
1856e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
1857e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
1858e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1859e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_indexes);
1860e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
1861e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1862e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
1863e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
186447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
18650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1866662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
18670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
1868b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
1869b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
18700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
18720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
18740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
1875662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
18780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1879662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
188047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
18810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
18830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
1884b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
18850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
18860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
18880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1890662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1891662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1892662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
18930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1894662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
189547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
18960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1897662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
18980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1899b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
19000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
19010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
19030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1906662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
1907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
19080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
191047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX];
19110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1912662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
19130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FLASH_MODES_MAP,
1914b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]),
19150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_flash_modes[i]);
19160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_flash_modes[size] = (uint8_t)val;
19180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1921e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t flashAvailable = 0;
1922e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (size > 1) {
1923e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        //flash is supported
1924e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        flashAvailable = 1;
1925e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_MODE,
1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_flash_modes,
19280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1930e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
1931e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
1932e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1933e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
1934e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
1935e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
1936e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
1937e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
1938e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1939e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
1940e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
1941e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
1942e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
1943e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
1946e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
19473fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    size = 0;
19483fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t avail_sensitivities[CAM_ISO_MODE_MAX];
19493fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_iso_modes_cnt; i++) {
19503fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        int32_t sensitivity = getSensorSensitivity(gCamCapability[cameraId]->supported_iso_modes[i]);
19513fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        if (sensitivity != -1) {
19523fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang            avail_sensitivities[size] = sensitivity;
19533fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang            size++;
19543fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
19553fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
19563fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_AVAILABLE_SENSITIVITIES,
19573fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang                      avail_sensitivities,
19583fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang                      size);
19592dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1960b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
1961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
1966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
1968662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1969662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1970662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1971662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1972662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
1974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
1975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
1980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
1981662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
19830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
19840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
19850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
19860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
19870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
19880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
19890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
19900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
19910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
19920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
1993c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
19940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
19950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
19960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
1997c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
1998c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
19990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
20000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
20010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
20022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
20032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
20042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
20052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
20072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
20092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
20122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2013e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
2014e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t* supported_indexes)
20152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
20162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
20172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
20182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    int j = 0, index = 0;
20202dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j] = (int32_t)overridesTable[index].ae_mode;
2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j+1] = (int32_t)overridesTable[index].awb_mode;
2024e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j+2] = (int32_t)overridesTable[index].af_mode;
20252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
20262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
20272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
20282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2029662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2031662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2036662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2041662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2042662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2043662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2044662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2046662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2047662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2048662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2049662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2050662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2051662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2052662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2053662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2056662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2063662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
20663fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
20673fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20683fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
20693fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20703fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
20713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20723fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
20733fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20743fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
20753fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
20763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
20773fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
20783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
20793fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
20803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
20813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
20823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
20843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
20853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
20873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
20883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
20903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
20913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
20933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
20943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
20963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
20973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
20993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
21003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
21013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
21023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
21033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2134662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2135662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2140662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2141662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2142662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2143662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2144662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2145662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2146662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2147662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2148662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2149662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2171662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2172662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2173662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2174662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
21750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2176662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2177662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2178662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2179d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2180d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2181d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2183d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2184d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2185d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2186d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2187d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2188d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2189662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2190662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2193662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2194662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2195662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2196662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2197662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2198662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2199662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2200662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2201662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2202662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2203662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2204662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2205662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
22060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2207662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2208662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2209662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2210662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2211662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2212662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
22130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2215662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2216662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2217662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2243b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2268b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
228597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2288e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2290e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
229597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
23259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
23269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2346e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2347e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2348e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2349e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2350e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2351e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2352e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2353e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
23542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
23552dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
23562dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
23572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
23582dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
236547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2368b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
236947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2370b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2371b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2372b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
23749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
23759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2378e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2379e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
238480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
238580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
238680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
238780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
238880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
238980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
239080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
239180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
239280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
239380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
239480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
239580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
2396662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id,
2397662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                  const camera_metadata_t *settings)
239880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
239980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
240080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
240133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (settings == NULL && mFirstRequest) {
240280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
240380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2404662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
240533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2406b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2407b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2408b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
240933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2410b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2411b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
241233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2413662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2414662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2415662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                sizeof(frame_id), &frame_id);
2416662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2417662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2418662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
24200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2421662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(settings != NULL){
24221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        rc = translateMetadataToParameters(settings);
242380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
242480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
242680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
242780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
242880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
242980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
243080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
243180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
243380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
243680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
243780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
244080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
244180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
244280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
244380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
244480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
244697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
2447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    frame_settings = settings;
2448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
24490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
24510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
24520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
24530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
24540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
24550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
245697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
245753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
245853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        int32_t expCompensation = frame_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
245953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
246053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
246153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
246253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
24630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
24640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
24650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
24670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
246897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
24690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
24700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
24710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
24720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
24730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
24740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
24750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
24760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
24770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
247897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
24792b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
24802b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
24812b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
24822b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
24832b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
24842b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
24852b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
24862b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
24870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
24882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
24890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
24902b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
24912b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
24922b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
24932b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
24942b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
24952b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
24962b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
24972b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
24980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
24990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
25000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2501662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
25020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
25030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
25040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
25050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
25060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
25070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
25100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
25110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
25120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
25130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
25140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
25150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
25160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
25170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
25200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
25210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
25220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
25230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
25240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
25250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
25260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
25270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
25300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
25310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2532e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2533e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
2534e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2535e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2536e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2537e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2538e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2539e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2540e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2541e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2542e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2543e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2544e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2545e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2546e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          aeMode);
25470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
25480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2549e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2550e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2551e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2552e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
25530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_REQUEST_FRAME_COUNT)) {
25560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t metaFrameNumber =
25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_REQUEST_FRAME_COUNT).data.i32[0];
25580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaFrameNumber), &metaFrameNumber);
25600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
25630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
25640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
25650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
25660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
25670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
25680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2569e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
2570e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
2571e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
25722dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
25732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
25742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
25762dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
25772dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
25801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
25810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
25832dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
25842dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
25852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
25862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
25870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
25882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
25892dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
25900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
25912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
25950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
25970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
26010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
26020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
26030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
26040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
26050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
26080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
26090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
26100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
26110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
26180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2620e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
2621e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t flashMode =
2622e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
2623e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
2624e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                CAM_INTF_META_FLASH_MODE, sizeof(flashMode), &flashMode);
2625e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2626e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
26460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
26498867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
26500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
26510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
26530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
26540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
26570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
26580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
26590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
26600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
26610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
26640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
26650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
26660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
26670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
26680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
26710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
26730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
26780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
26790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
26800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
26820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
26830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
26860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
26888867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
26890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
26900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
26910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
26940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
26950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
26968867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
26970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
26990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
27020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
27030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
27048867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
27050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
27060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
27070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
270971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
271071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
27110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
27120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
27130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
27140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
27150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
27160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
27170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
271847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
271947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
27200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
27220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
272371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
27270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
27280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
27310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
27450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
27470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
27480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
27510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
27580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
27590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
27600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
27610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
27620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
27650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t facedetectMode =
27660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
27670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
27690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
27700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
27730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
27740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
27750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
27770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
27780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
27810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
27820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
27830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
27850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
27860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
27980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2802662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
280359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
280459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
280571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
280659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
280771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
280871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
280971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
281071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
281171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
281271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
281371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
281459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
281559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
281659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
281759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
281871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
281959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
282071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
282171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
282271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
282371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
282471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
282571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
282671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
282759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
282859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
282959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
283059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
283171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
283259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
283371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
283471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
283571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
283671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
283771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
283871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
283971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
284059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
2841662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2842662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2843662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2844662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
28450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
2846662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
28470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
2848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2851662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
2852662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2853662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
2855662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
2856662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2857662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
2858662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
2859662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2860662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
28619a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
28629a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
28639a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
28649a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
28659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
28669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
28679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
28689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
28699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
28709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
2871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
2872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
2873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
287597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
2876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
2877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
28780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
28790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
28800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
28810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
28820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
28830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
28850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
28860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
28870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
28881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
28910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
28950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
289608ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
289708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
28980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
29000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
29019a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
29029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
29030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
29040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
29053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
29069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
29079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
29083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
29129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
29139a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
29159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
29169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
29209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
29219a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
29229a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
29239a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
29249a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
29259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
29269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
29279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
29289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
29299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29313fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
29330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
29353fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
29363fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29389a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
29390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
294353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
294453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
294553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
294653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
294753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
29480a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
294980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
295080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
295180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
295280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
2953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
2954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
2956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
2959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
2960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
2961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
2963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
29641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
2965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
2966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
2967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
2969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
2970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
2971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
2972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
2975625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
2976625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2977625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2978625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
2980625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2981625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
2982625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2983625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2984625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2985625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2986625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
2987625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
2988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
2991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
2992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2993d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
30011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3002d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
30031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3023d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
30301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3031d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
30321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3048d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
30551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3056d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
30571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
30719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
30729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
30739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3076d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
308597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3087d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
31019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
31029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
31039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3105d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
310680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
310780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
310880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
310980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
31109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
311180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
31129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
31131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3114d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3129e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3130e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3131e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3133d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3134e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3135e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3136e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3137e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3138e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3139e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3140e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3141e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3142d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3143e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3160d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3165e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3166e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3169d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3175e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3176e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3177e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3179e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3180e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3181e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3182e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3183e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3185d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3186e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3187e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3189e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3190e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3191e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3192e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3193e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3194e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3195cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3196cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3197cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3198cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3199d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3200e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3201e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3202e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3204