QCamera3HWI.cpp revision e9a0b4995192d264f75543f62efa089845456291
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
53662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
54662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
55662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
56662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED,    CAM_SCENE_MODE_OFF },
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
9397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
97b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
112e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
113e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
114e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
115e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
117e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON   },
123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH}
124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
15297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
15333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
15433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
15533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
15633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
15733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
15897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mJpegSettings(NULL)
159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_init(&mRequestLock, NULL);
1689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_init(&mCaptureResultLock, NULL);
17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
17433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
17533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
18166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
189d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
1901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Clean up all channels */
1911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mMetadataChannel->stop();
1921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    delete mMetadataChannel;
1931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mMetadataChannel = NULL;
194d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
1951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
1961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
1971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
1981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        channel->stop();
199d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
200d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
201d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
202d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
2031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        delete channel;
2041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
20797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
20897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
20997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
21097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
21133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    deinitParameters();
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    closeCamera();
213e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
21433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
21533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
21633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
21733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
218e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mRequestLock);
219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
221e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
22233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_destroy(&mCaptureResultLock);
223d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //int rc = NO_ERROR;
241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (rc == 0)
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    else
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
32333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
32433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
32533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
32633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
32733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
3289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Create metadata channel and initialize it
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
330e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    mCameraHandle->ops, captureResultCb,
331e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    &gCamCapability[mCameraId]->padding_info, this);
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mMetadataChannel == NULL) {
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
3349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        rc = -ENOMEM;
33533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        goto err2;
3369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    rc = mMetadataChannel->initialize();
3389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
3399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: metadata channel initialization failed", __func__);
3409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err3;
3419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
344e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
345e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
3479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3:
3499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    delete mMetadataChannel;
3509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mMetadataChannel = NULL;
35133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangerr2:
35233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    deinitParameters();
3539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
37333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
3740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
379e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
385e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
392e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
3970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
3980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
3991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
401d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
402d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
405d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
4081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ALOGV("%s: newStream type = %d, stream format = %d",
4091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                __func__, newStream->stream_type, newStream->format);
4100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
4221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
4230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
4240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
4260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
4270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
4280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
4290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
4300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
4311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
4320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
4330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT) {
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
437e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
4461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
4480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
4491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
4501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
4531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
4541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
4551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
4560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
45933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //mMetadataChannel->stop();
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
467f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
468f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
469f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
470f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
471f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
472f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
473f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
474f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
475f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
476f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
477f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
478f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
479f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
4831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
486f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
4878867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
488f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
489f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
490f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
491f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
492f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
493f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
494f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
495f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
496f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
497f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
498f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
499f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
500f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
501f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
502f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
503f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
504f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
505f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
506f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
507f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
508f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
509f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
510f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
511f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
512f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
513f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
514f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
515f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
516f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
5248867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
5251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
5261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
5271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
5281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
5291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
5301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
5311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
5331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
5341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
5351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
5371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
5381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
539d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                ALOGD("%s: channel %p has %d buffers",
540e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
5410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
5420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
5441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
5451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
5461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
5471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
5491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
5500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
5511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
5521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
5531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
5541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
55533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
5569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
55733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
55833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
56033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
564e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
56780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
56880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
56980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
57080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
57180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
57280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
57380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
5759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
57680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
5779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
5789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
5799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
5809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
5819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
5829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
5839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
5849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
5859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
5879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
5889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
5899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
5909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
5919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
5929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
5939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
5959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
5969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
5979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
5989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
6009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        //TODO
6019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Not supporting input buffer yet", __func__);
6029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
6069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
6079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
6089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
6099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
6109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
6119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
6129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
6169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
6179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
6219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
6229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
6269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
6279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
6319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
6329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
6339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
636e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
638e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
640e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
642e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
643e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
644e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
645e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
646e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
648e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
649e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
650e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
651e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
652e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
653e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
654e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
6790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
6801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
6811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
6821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
6830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
6841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
6851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
6861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
6871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
6880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
6890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
6900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
6910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
6931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
6940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
6960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
699e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (stream->stream_type != CAMERA3_STREAM_OUTPUT) {
700e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: not yet support non output type stream", __func__);
701e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
702e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
703e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
705e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
707e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
708e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
709e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
711e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
712e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
713e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
714e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
743662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = setFrameParameters(request->frame_number, request->settings);
7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
750e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang    ALOGV("%s: %d, num_output_buffers = %d", __func__, __LINE__,
751e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                    request->num_output_buffers);
752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
75666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
75766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
75866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
75966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
76066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
7610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
76266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
76366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
76466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
76566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
76666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
772e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
773e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
7751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
7761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
7771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
7781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
7791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
7801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
7811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
7821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
7831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
7841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
7851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
7861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
7871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
7881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
7891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
7901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
7919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
7939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
7949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
7959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
7979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
79866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
7999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
8029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
80466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
80566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber, mJpegSettings);
80666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
807d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            ALOGI("%s: %d, request with buffer %p, frame_number %d", __func__, __LINE__, output.buffer, frameNumber);
80866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
80966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
8109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
8119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
8129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
8151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
8179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_lock(&mRequestLock);
8189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
8199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
8209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_wait(&mRequestCond, &mRequestLock);
8219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_unlock(&mRequestLock);
8239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
82580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
82680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
82780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
831e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
8329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
8339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
834e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
835e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
836e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
837e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
838b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
839b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
840e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
841e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
842e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
843e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
844e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
845e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
846e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
847e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
848e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
857e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
859e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
860b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
87433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
87533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
87933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
88033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
8819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
8829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
8839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
8841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
8869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
8871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
8901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
89133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
89233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
89333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
89433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
8950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
8960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
8970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
8980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
8990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
9001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
901d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            ALOGD("%s: Not a valid frame number, used as SOF only", __func__);
9021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
9031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
9041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
905d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        ALOGD("%s: valid frame_number = %d, capture_time = %lld", __func__,
906e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
9071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
9091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
910e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
9111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
9121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
913d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            ALOGD("%s: frame_number in the list is %d", __func__, i->frame_number);
9141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
9161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
917e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
918e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
919e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
920e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
921e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
922e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
923e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
924e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
925e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
9261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
9271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
9281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
929e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
931d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            ALOGD("%s: notify frame_number = %d, capture_time = %lld", __func__,
932e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
9331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
9351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
9361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
937e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                CameraMetadata emptyMetadata(1, 0);
938e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                emptyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
939e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
940e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = emptyMetadata.release();
9411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
942e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
943e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        current_capture_time);
9441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                // Return metadata buffer
9451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mMetadataChannel->bufDone(metadata_buf);
9461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
9481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
9491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
9511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
952e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
9531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
954e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
9551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
9561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
9571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
9581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
9611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
9621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
9631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
9641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
9651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
9661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
9671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
968e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
9691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
9701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
9711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
9721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
9731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
9741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
9751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
9761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
978d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                ALOGD("%s: meta frame_number = %d, capture_time = %lld",
979d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
9801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
9811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
9821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
9831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
984d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                ALOGD("%s: meta frame_number = %d, capture_time = %lld",
985d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
9861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
9871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
9891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
9901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
99133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
99233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
9931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
9941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
9951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
9961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
997e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
9981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
9991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
10001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
10011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
10031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!max_buffers_dequeued) {
10041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
10051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
10061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
10071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
10081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
10091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
10101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
10111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
10121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
10131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        while (i != mPendingRequestsList.end() && i->frame_number != frame_number)
10141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
10151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
10161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
10171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1018e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
10191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
10201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
10211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
10221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
102633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1029d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            ALOGD("%s: result frame_number = %d, buffer = %p",
1030e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
10311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
103333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1035e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
10381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
10391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
10401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1043d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        ALOGD("%s: cache buffer %p at result frame_number %d",
1044e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1048e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
10499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
10509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
10529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
10539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
10549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
105597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
105697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
105797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
105897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
105997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
106097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
106197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
106297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
106397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
106497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
106597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
106697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
106797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
10680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                (metadata_buffer_t *metadata, nsecs_t timestamp)
106997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
107097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
107197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
107297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
107333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
10740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
107597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
107697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
107797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
107897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
107997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
108097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
108197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
108297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
108397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
108497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
108597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
108697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
108797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
108897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
108997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
109097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
109197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
109297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
109359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
109497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
109597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
109697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
109797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
109897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
109997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
110097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
110197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
110297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
110397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
110497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
110597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
110697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
110797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*autofocus - TODO*/
110897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_auto_focus_data_t  *afData =(cam_auto_focus_data_t *)
110997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      POINTER_OF(CAM_INTF_META_AUTOFOCUS_DATA,metadata);*/
111097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11118867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
11120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
111397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
111497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
111597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
111697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
111797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
111897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
111997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
112097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
112197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
112297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
112359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
112497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
112597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *ae_state =
11270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
112897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
112997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
11310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
113297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
113397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
113497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
113597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
113697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
113797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
113859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
113997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
114097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
114297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
114397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
114497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
114597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
114697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
114797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
11490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
115097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
115197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
115297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
115397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
115497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
115597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
115659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
115797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
115897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
11600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
116197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
116297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
116497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
116597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
116797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
116897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
11700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
117197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
117297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
117397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
117497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
117597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
117697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
117797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
117897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
117997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
118097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
11820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
118497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
11860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
118797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
118897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
118997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
119397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
119497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
119997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
120397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
12100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
12110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
121397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
12180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
121997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
122097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
122197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
122297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
122497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t scalerCropRegion[3];
12260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
12270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
12280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
12290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 3);
123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
123697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
123797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
123897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
124097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
124297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
12440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
124597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
124697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
12480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
124997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
125097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
12520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
125497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
12560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
125897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
125997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
126097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
126197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
126297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
126397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
126497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
126597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
126697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
126797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
126833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
126997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
127259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
127497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
127997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
128359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
128597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
128659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
128759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
128997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
129097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
129259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
129359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
129459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
129559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
129659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
129759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
129859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
129959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
130059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
130159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
130259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
130359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
130459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
130559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
130659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
130759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
130859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
130959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
131059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
131159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
131259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
131359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
131459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
131559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
131659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
131759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
131859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
131959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
132059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
132897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
132997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
133097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
133197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
133597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
133697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
133797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
133897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
133997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
134097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
134197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1370e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1371e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1412e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1413e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1421662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1426662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1427662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1429662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1443662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1444662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
146533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
146633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
146733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
146833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
146933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
147033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
147133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
147233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
147333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
147433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
147533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
147633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
147733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
147833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
147933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
148033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
148133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
148233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
148333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
148433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
148533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
14860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
14870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
14880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
14890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
14900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
14910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
14920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
14930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
14940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
14950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
14960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
14970a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
14980a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
14990a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
15000a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
15010a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
15020a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
15030a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
15040a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
15050a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
15060a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
15070a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
15080a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
15090a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
1520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
152497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
1525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
15272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
15282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
15292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1530e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
1531e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
1532e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
1533e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
1534e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
1535e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
1536e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
15382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
1539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1543c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
1544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1545c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
1546c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
1547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
1550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
1551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1558c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
156180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
156280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
156380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
156480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
156580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
156680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
156780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
156880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
156980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
157180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map,
15720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            sizeof(gCamCapability[cameraId]->lens_shading_map)/ sizeof(float));
1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
157480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
157680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
157780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
157880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
157980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
158080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
158180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
1582c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
158380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
158480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
158580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
158680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
158780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
158880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
158980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
159080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
159180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
159280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
159380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
159480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1595c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
159680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
159780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
159880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
159980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
160080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
160180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
160280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width,
160380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
160480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
160580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      active_array_size, 2);
160680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
160780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
160880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
1609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
161080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
161180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
161280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
161380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
161480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
161580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
161680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
161780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
161880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1619c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1620c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1621c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*hardcode 0 for now*/
1622c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    int32_t max_face_count = 0;
162380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1624c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &max_face_count, 1);
162580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
162680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
162780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
162880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
162980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
163080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
163180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
163280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
163380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
163480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
163580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
163680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
163780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
163880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
163980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
164080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
164180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
164280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
164380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
164480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
164580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t scalar_formats[CAM_FORMAT_MAX];
16478867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    int scalar_formats_count = gCamCapability[cameraId]->supported_scalar_format_cnt;
16488867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    for (int i = 0; i < scalar_formats_count; i++) {
1649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        scalar_formats[i] = getScalarFormat(gCamCapability[cameraId]->supported_scalar_fmts[i]);
1650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
16518867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    scalar_formats[scalar_formats_count] = HAL_PIXEL_FORMAT_YCbCr_420_888;
16528867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    scalar_formats_count++;
1653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
16558867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
1656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
16572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
1658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
1661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
1663c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
16640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
16652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
16660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
16670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
16680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
1669c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1670c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1671c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1672c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    static const camera_metadata_rational exposureCompensationStep = {
1673c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
1674c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
1675c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1676c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
1677c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1678c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
1679c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    static const uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1680c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1681c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
1682c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1683b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
1684e3b82c765b3e267c18601aad04159005be581c87Mansoor Aftab    static const float maxZoom = 10;
1685c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1686c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
1687c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
16882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const int32_t max3aRegions = 1;
1689c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1690c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
1691c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1692c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    static const uint8_t availableFaceDetectModes[] = {
1693c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1694c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1695c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1696c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
1697c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
1698c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1699c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    static const int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1700662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
1701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
1703662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
1704662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
170580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
170680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
170780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
170880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
170980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
171080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
171280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
171380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
17152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2];
1716662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1717662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1718662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_jpeg_sizes);
1719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_jpeg_sizes,
1721c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1722c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1723c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
1724c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      available_jpeg_sizes,
1725c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1726662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
172797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    static int32_t max_jpeg_size = 0;
172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
172997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
173097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
173197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
173297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
173397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
173497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
173597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
173697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
173797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
173897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
173997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
17400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    static uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
17410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
1742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
17430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
1744b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
17450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
17460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
17470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
17480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
17490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1751662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1752662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
17530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1754662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
17550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    static uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1756e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
17572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
1758662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
17590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
1760b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
17610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
17620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
1763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
1764e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
17652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
17660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1767662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1768e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1769662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
17712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
1772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1773e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
1774e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
1775e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
1776e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1777e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_indexes);
1778e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
1779e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1780e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
1781e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
17820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    static uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
17830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
17850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
1786b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
1787b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
17880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
17890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
17900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
17910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
17920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
1793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1794662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
17960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
17990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
18010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
1802b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
18030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
18040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
18060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1809662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1810662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
18110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1812662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
18130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    static uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
18140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1815662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
18160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1817b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
18180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
18190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
18210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
1825662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
18260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1827662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
18280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    static uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX];
18290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1830662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
18310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FLASH_MODES_MAP,
1832b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]),
18330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_flash_modes[i]);
18340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_flash_modes[size] = (uint8_t)val;
18360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1838662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1839e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t flashAvailable = 0;
1840e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (size > 1) {
1841e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        //flash is supported
1842e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        flashAvailable = 1;
1843e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1844662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_MODE,
1845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_flash_modes,
18460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1847662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1848e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1849e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
1850e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
1851e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1852e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
1853e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
1854e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
1855e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
1856e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
1857e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1858e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
1859e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
1860e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
1861e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
1862e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1863662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
1864662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
1865e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
18662dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1867b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
1873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
1875662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1878662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1879662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1880662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
1881662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
1882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
1884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
1885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
1886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
1887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
1888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1889662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
18900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
18910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
18920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
18930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
18940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
18950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
18960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
18970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
18980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
18990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
1900c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
19010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
19020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
19030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
1904c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
1905c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
19060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
19070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
19080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
19092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
19102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
19112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
19122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
19132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
19142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
19152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
19162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
19172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
19182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
19192dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
1920e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
1921e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t* supported_indexes)
19222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
19232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
19242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
19252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
1926e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    int j = 0, index = 0;
19272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
1928e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
1929e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j] = (int32_t)overridesTable[index].ae_mode;
1930e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j+1] = (int32_t)overridesTable[index].awb_mode;
1931e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j+2] = (int32_t)overridesTable[index].af_mode;
19322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
19332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
19342dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
19352dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1946662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
1947662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1948662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
1949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1950662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
1952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
1953662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
1955662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1956662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1957662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
1958662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
1959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
1961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
1966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1968662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1969662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
1970662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1971662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1972662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
1973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
1974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
1980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
1981662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
1982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1984662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1985662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1986662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1987662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
1988662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
1989662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
1990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
1991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
1993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
1994662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
1996662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
1997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
1998662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
1999662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2000662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2001662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2002662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2003662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2004662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2008662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2009662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2010662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2015662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2016662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2017662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2022662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2024662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2025662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2026662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2029662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2031662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2036662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2041662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2042662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2043662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
20440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2046662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2047662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2048d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2049d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2050d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2051662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2052d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2053d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2054d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2055d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2056d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2057d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2063662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2066662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2067662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2070662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2071662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2072662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2073662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
20750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2076662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2077662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2078662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2079662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2080662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
20820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2086662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2112b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2136e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2137b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
215497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
216497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
21949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
21959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2215e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2216e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2217e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2218e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2219e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2220e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2221e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2222e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
22232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
22242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
22252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
22262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
22272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
2234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_aperture = gCamCapability[mCameraId]->apertures[0];
2235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2237b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
2238b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2239b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2240b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2241b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2243b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    /* TODO: Enable focus lengths once supported*/
2244b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    /*if (gCamCapability[mCameraId]->focal_lengths_count) {
2245b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0];
2246b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2247b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }*/
2248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2250e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2251e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
225680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
225780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
225880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
225980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
226080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
226180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
226280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
226380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
226480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
226580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
226680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
226780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id,
2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                  const camera_metadata_t *settings)
227080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
227180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
227280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
227333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (settings == NULL && mFirstRequest) {
227480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
227580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
227733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2278b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2279b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2280b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
228133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2282b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2283b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
228433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                sizeof(frame_id), &frame_id);
2288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2289662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2290662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2291662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
22920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(settings != NULL){
22941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        rc = translateMetadataToParameters(settings);
229580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
229680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
229880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
229980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
230080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
230180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
230280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
230380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
230480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
230580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
230680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
230780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
230880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
230980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
231080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
231180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
231280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
231380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
231480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
231580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
231680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
231897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    frame_settings = settings;
2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
23210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
23220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
23230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
23240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
23250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
23260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
23270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
232897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
232997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t expCompensation = frame_settings.find().data.i32[0];
23300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole      rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
233197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      sizeof(expCompensation), &expCompensation);*/
23320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
23330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
23340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
23350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
23360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
233797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
23380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
23390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
23400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
23410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
23420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
23430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
23440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
23450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
23460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
234797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
23480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
23492dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
23500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
23512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t focusMode = lookupHalName(FOCUS_MODES_MAP,
23522dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                                          sizeof(FOCUS_MODES_MAP),
23532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                                          fwk_focusMode);
23540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
23550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
23560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2357662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
23580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
23590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
23600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
23610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
23620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
23630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
23640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
23650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
23660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
23670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
23680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
23690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
23700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
23710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
23720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
23730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
23740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
23750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
23760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
23770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
23780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
23790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
23800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
23810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
23820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
23830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
23840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
23850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
23860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
23870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2388e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2389e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
2390e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2391e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2392e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2393e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2394e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2395e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2396e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2397e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2398e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2399e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2400e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2401e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2402e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          aeMode);
24030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
24040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2405e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2406e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2407e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2408e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
24090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_REQUEST_FRAME_COUNT)) {
24120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t metaFrameNumber =
24130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_REQUEST_FRAME_COUNT).data.i32[0];
24140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
24150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaFrameNumber), &metaFrameNumber);
24160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
24190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
24200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
24210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
24220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
24230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
24240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2425e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
2426e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
2427e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
24282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
24292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
24302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
24310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
24332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
24340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
24361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
24370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
24392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
24402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
24412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
24422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
24430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
24442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
24452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
24460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
24472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
24480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
24510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
24520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
24530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
24540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
24570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
24580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
24590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
24600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
24610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
24640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
24650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
24670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
24700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
24710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
24720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
24730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
24740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2476e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
2477e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t flashMode =
2478e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
2479e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
2480e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                CAM_INTF_META_FLASH_MODE, sizeof(flashMode), &flashMode);
2481e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2482e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
24830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
24840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
24850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
24860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
24870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
24880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
24910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
24920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
24930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
24940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
24950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
24960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
24980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
24990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
25000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
25010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
25020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
25058867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
25060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
25070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
25080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
25090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
25100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
25130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
25140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
25150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
25160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
25170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
25200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
25210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
25220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
25230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
25240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
25270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
25280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
25290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
25300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
25310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
25340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
25350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
25360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
25370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
25380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
25390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
25420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalDistance =
25430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
25448867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
25450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCUS_DISTANCE,
25460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalDistance), &focalDistance);
25470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
25500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
25510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
25528867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
25530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
25540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
25550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
25580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
25608867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
25610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
25620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
25630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
25660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
25670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
25688867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
25690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_crop_region_t scalerCropRegion;
25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
25760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
25770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
25790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
25800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
25810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
25830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
25870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
25880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
25890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
25900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
25950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
25970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
25990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
26000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
26030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
26040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
26050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
26070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
26080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
26110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
26130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
26180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
26190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
26200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
26210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t facedetectMode =
26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
26460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
26500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
26510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
26530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
26540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
26570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
26580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
26590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
26600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
26610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
266359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
266459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
266559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
266659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
266759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                sizeof(roi), &roi);
266859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
266959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
267059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
267159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
267259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
267359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
267459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                sizeof(roi), &roi);
267559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
267659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
267759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
267859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
267959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
268059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
268159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                sizeof(roi), &roi);
268259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
2683662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2684662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2685662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2686662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
2688662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
26890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
2690662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2691662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2692662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2693662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
2694662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2695662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
2697662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
2698662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2699662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
2700662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
2701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
2703662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
2704662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
2705662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2706662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
270797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
2708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
2709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
27100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
27110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
27120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
27130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
27140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
27150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
27170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
27180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
27190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
27201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
27210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
27230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
2727f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab        mJpegSettings->thumbnail_size.width = 320;
2728f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab        mJpegSettings->thumbnail_size.height = 240;
27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width = 640;
27310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height = 480;
27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mJpegSettings->gps_coordinates[i] =
27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->gps_timestamp =
27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
27450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->gps_processing_method =
27460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[0];
27470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
27490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
27500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
27510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27560a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
275780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
275880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
275980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
276080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
2761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
2762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
2764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
2767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
2768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
2769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
2771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
27721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
2773e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
2774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
2775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
2779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
2780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
2784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
2788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
2790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
2795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
2796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
2799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
2800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2801d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
28091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
2810d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
28111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
2812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
2816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
2823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
2824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
2825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
2828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
2829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
2830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2831d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
28381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
2839d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
28401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
2841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
2845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
2847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
2853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
2854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
2855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2856d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
28631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
2864d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
28651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
2866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
2870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
2872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
2877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
2878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
28799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
28809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
28819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
2882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2884d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
2886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
2891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
289397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
2894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2895d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
2896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
2897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
2901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
29099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
29109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
29119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
2912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2913d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
291480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
291580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
291680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
291780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
29189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
291980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
29209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
29211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
2922d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
29231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
2924625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
2928625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2929625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
2938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
2939e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
2940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2941d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
2943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
2945e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
2947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
2948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2949e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
2950d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
2951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
2952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
2956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
2966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
2967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2968d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
2970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
2972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2973e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
2974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
2975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
2977d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
2978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
2979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2980625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
2982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
2983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
2985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
2987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
2990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
2991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
2992e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
2993d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
2995e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
2996e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
2997e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
2998e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
2999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3002e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3003d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3004e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3005e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3006e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3008