QCamera3HWI.cpp revision cd500de28de7d527e4d6b1fbbfbe25bdc58829ed
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without
4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are
5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met:
6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions of source code must retain the above copyright
7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       notice, this list of conditions and the following disclaimer.
8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions in binary form must reproduce the above
9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       copyright notice, this list of conditions and the following
10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       disclaimer in the documentation and/or other materials provided
11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       with the distribution.
12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Neither the name of The Linux Foundation nor the names of its
13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       contributors may be used to endorse or promote products derived
14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       from this software without specific prior written permission.
15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/
29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI"
31625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h>
33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h>
34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h>
35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h>
36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h>
37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h>
38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h>
39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h>
40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h"
41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h"
42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h"
4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h"
44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera {
48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
5080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings;
51b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
53cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
54cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    PTHREAD_MUTEX_INITIALIZER;
55cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
56cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
9697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
100b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
115e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
117e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
118e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON   },
126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH}
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
12908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
13008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
157cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
15897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
15933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
16033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
16133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
16233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
16333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
16497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mJpegSettings(NULL)
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_init(&mRequestLock, NULL);
1749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
17674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
177e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
17933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_init(&mCaptureResultLock, NULL);
18033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
18133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
18233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
18866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
196d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
1971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Clean up all channels */
198cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraInitialized) {
19999259cbb8af6188f391311cd8e09d4c01832dd5aShuzhen Wang        mMetadataChannel->stop();
20099259cbb8af6188f391311cd8e09d4c01832dd5aShuzhen Wang        delete mMetadataChannel;
20199259cbb8af6188f391311cd8e09d4c01832dd5aShuzhen Wang        mMetadataChannel = NULL;
202cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        deinitParameters();
20399259cbb8af6188f391311cd8e09d4c01832dd5aShuzhen Wang    }
204cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
205d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
2061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
2091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        channel->stop();
210d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
211d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
212d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
213d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
2141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        delete channel;
2151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
21897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
21997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
22097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
22197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
222cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
223cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
224e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
22533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
22633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
22733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
22833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
229e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mRequestLock);
230e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
231e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
232e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
23333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_destroy(&mCaptureResultLock);
234d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
252cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
253cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
254cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
255cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
256cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        return INVALID_OPERATION;
257cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
258cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
265cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
267cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
268cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
270cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
271cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
342e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
34333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
34433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
34533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
34633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
34733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
3489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Create metadata channel and initialize it
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    mCameraHandle->ops, captureResultCb,
351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    &gCamCapability[mCameraId]->padding_info, this);
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mMetadataChannel == NULL) {
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
3549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        rc = -ENOMEM;
35533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        goto err2;
3569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    rc = mMetadataChannel->initialize();
3589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
3599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: metadata channel initialization failed", __func__);
3609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err3;
3619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
364e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
365e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
366cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
3679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
3689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3:
3709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    delete mMetadataChannel;
3719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mMetadataChannel = NULL;
37233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangerr2:
37333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    deinitParameters();
3749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
39433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
3950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
396e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
400e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
406e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
413e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
4180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
422d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
423d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
426d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
4291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ALOGV("%s: newStream type = %d, stream format = %d",
4301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                __func__, newStream->stream_type, newStream->format);
4310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
4431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
4440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
4450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
4470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
4480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
4490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
4500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
4521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
4530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
4540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT) {
456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
458e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
4660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
4671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
4690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
4711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
4720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
4730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
4741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
4751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
4761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
4770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
48033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //mMetadataChannel->stop();
481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
488f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
489f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
490f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
491f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
492f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
493f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
494f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
495f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
496f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
497f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
498f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
499f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
500f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
507f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5088867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
509f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
510f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
511f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
512f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
513f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
514f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
515f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
516f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
517f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
518f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
519f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
520f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
521f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
522f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
523f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
524f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
525f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
526f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
527f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
528f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
529f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
530f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
531f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
532f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
533f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
534f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
535f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
536f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
537f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
5458867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
5461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
5471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
5481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
5491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
5501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
5511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
5521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
5531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
5541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
5551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
5561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
5571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
5581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
5591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
560a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
561e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
5620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
5630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
5651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
5661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
5671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
5681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
5701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
5710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
5721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
5731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
5741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
5751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
57633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
5779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
57833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
57933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
580e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
58133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
585e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
587e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
58880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
58980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
59080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
59180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
59280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
59380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
59480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
595e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
5969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
59780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
5989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
5999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
6009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
6019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
6039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
6049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
6059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
6099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
6109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
6119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
6129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
6169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
6179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
6219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        //TODO
6229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Not supporting input buffer yet", __func__);
6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
6279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
6289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
6299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
6309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
6319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
6329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
6339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
6379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
6389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
6429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
6439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
6479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
6489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
6499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
6509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
6539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
6549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
681e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
682e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
683e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
684e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
685e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
686e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
687e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
688e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
689e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
690e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
691e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
692e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
693e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
694e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
695e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
696e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
697e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
698e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
699e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
7000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
7011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
7021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
7031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
7040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
7051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
7061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
7071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
7081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
7090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
7100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
7110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
7120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
7141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
7150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
7170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
7180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
7190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (stream->stream_type != CAMERA3_STREAM_OUTPUT) {
721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: not yet support non output type stream", __func__);
722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
75174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
758e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
764e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
765662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = setFrameParameters(request->frame_number, request->settings);
7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
7679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
7699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
7709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
77274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    meta = request->settings;
77374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
77474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
77574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
776013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
77774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
77874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
77974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
78074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
78174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
782013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
78374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
78474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
78574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
78674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
787e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang    ALOGV("%s: %d, num_output_buffers = %d", __func__, __LINE__,
788e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                    request->num_output_buffers);
789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
79366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
79466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
79566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
79666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
79766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
7980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
79966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
80066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
80166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
80266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
80366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
810e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
8131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
8141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
8151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
8161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
81774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
81874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
8191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
8201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
8211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
8221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
8231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
8241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
8261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
8271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
8281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
8291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
831e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
8329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
8349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
8359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
8369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
83766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
8389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
8399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
8409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
8419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
8429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
84366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
84466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber, mJpegSettings);
84566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
846a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
847a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
84866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
84966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
8509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
8519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
8529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
8551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
8579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_lock(&mRequestLock);
8589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
8599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
8609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_wait(&mRequestCond, &mRequestLock);
8619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_unlock(&mRequestLock);
8639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
86580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
86680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
86780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
8689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
8709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
8729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
8739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
878b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
879b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
892e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
894e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
895e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
896e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
897e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
898e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
899e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
900b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
901e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
902e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
903e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
904e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
905e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
906e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
907e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
908e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
909e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
91433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
91533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
917e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
918e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
91933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
92033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
9219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
9229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
9239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
9241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
925e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
9269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
9271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_lock(&mRequestLock);
928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
93133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
93233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
93333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
93433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
9350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
9360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
9370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
9380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
9390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
9401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
941a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
9421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
9431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
9441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
945a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
946e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
9471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
9491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
950e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
9511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
9521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
953a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
9541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
9561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
957e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
958e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
959e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
960e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
961e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
962e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
963e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
964e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
965e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
9661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
9671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
9681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
969e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
9701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
971a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
972e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
9731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
9751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
9761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
97799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
97899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
979e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
98099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
98174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
98299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
9831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
984e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
98574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
9861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                // Return metadata buffer
9871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mMetadataChannel->bufDone(metadata_buf);
9881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
9901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
9911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
9921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
9931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
994e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
9951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
996e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
9971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
9981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
9991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
10031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
10041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
10051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
10061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
10071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
10091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1010e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
10111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
10121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
10131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
10141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
10151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
10161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
10181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1020a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1021d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
10221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
10231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
10241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1026a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1027d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
10291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
10311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
10321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
103333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
103433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
10381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1039e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
10401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!max_buffers_dequeued) {
10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
10521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
10531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
10541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
10551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        while (i != mPendingRequestsList.end() && i->frame_number != frame_number)
10561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
10571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
10591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1060e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
10611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
10621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
10631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
10641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
10671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
106833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
10691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
10701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1071a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1072e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
10731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1074e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
107533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
10761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1077e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
10781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
10791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
10801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
10811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
10821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
10831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
10841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1085a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1086e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
10871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
10881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1090e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
10919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
10929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
10931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pthread_mutex_unlock(&mRequestLock);
10949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
10959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
10969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
109797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
109897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
109997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
110097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
110197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
110297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
110397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
110497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
110597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
110697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
110797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
110897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
110997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
111074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
111174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
111297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
111397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
111497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
111597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
111774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
111897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
111997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
112097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
112197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
112297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
112397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
112497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
112597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
112697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
112797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
112897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
112997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
113097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
113197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
113297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
113397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
113497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
113597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
113659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
113797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
113897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
113997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
114097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
114197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
114299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
114399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
114499b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
114599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
114697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
114799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
114897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
114999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
115097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11518867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
11520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
115397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
115497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
115597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
115697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
115797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
115897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
115997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
116097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
116197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
116297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
116359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
116497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
116597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *ae_state =
11670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
116897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
116997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
11710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
117297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
117397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
117497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
117597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
117697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
117797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
117859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
117997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
118097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
118297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
118497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
118597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
118697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
118797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
11890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
119397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
119497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
119659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
11990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
12000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
12100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
121397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
121997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
122097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
12220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
122497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
12260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
122797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
122897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
122997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
123597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
123697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
123797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
123897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
124097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
124297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
124397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
124497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
124597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
124697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
124797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
124897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
12500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
12510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
125297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
125497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
125597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
125697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
12580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
125997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
126097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
126197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
126297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
126497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
126571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
12660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
12670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
12680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
126971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
127071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
127497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
127997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
12823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
128397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
12860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
12900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
129297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
12940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
129597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
129697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
12980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
129997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
130097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
130197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
130297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
130597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
130697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
130797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
130897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
131033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
131197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
131297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
131459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
131797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
131897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
132559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
132859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
132959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
133097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
133197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
133459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
133559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
133659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
133759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
133859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
133959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
134059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
134159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
134259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
134359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
134459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
134559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
134659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
134759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
134859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
134959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
135059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
135159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
135259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
135359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
135459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
135559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
135659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
135759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
135859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
135959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
136059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
136159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
136259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
136397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
136471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
136571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
136671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
136771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
136871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
136971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
137071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
137171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
137271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
137371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
137471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
137571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
137671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
137771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
137871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
137971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
138071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
138171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
138271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
138371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
138471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
138571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
138671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
138771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
138871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
138971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
139071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
139171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
139271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
139371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
139471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
139571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
139671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
139771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
139871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
139971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
140071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
140171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
140271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
140371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
140471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
140571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
140697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
140797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
140897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
140997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
141197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
141297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
141397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
141697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
141797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
141897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
141997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
142097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
142197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
142297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
142397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
142497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
142597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1452e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1453e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1454e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1455e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1456e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1496e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1497e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1505662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1506662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1507662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1508662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1509662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1510662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1511662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1512662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1513662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1514662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1515662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1516662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1517662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1519662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
154933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
155033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
155133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
155233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
155333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
155433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
155533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
155633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
155733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
155833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
155933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
156033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
156133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
156233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
156333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
156433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
156533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
156633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
156733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
156833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
156933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
15700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
15710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
15720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
15730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
15740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
15750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
15760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
15770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
15780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
15790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
15800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
15810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
15820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
15830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
15840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
15850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
15860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
15870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
15880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
15890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
15900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
15910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
15920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
15930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
1604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
160897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
1609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
16112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
16122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
16132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1614e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
1615e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
1616e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
1617e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
1618e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
1619e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
1620e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
16222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
1623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1627c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
1628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1629c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
1630c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
1631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
1634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
1635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
1638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
1639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1642c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
1644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
164580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
164680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
164780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
164880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
164947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
165080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
165180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
165280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
165380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
165580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map,
16560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            sizeof(gCamCapability[cameraId]->lens_shading_map)/ sizeof(float));
1657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
165847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
16590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
166080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
166180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
166280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
166380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
166480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
166580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
1666c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
166780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
166880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
166980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
167080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
167180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
167280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
167380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
167480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
167580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
167680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
167780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
167880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1679c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
168080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
168147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
168280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
168380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
168480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
168580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
168647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width,
168780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
168847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang
168980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
169080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      active_array_size, 2);
169180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
169280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
169380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
1694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
169580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
169680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
169780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
169880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
169980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
170080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
170180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
170280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
170380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1704c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1705c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1706c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*hardcode 0 for now*/
1707c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    int32_t max_face_count = 0;
170880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1709c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &max_face_count, 1);
171080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
171180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
171280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
171380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
171480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
171580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
171680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
171747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
171880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
171980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
172180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
172280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
172480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
172580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
172780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
172880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
172980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
173080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
173159907a1735a991f67d84bff196879de2611ac732Mansoor Aftab    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888};
173259907a1735a991f67d84bff196879de2611ac732Mansoor Aftab    int scalar_formats_count = 1;
1733662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1734662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
17358867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
1736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
173747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
1738662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1739662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1740662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
1741662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
1743c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
17440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
174547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
17460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
17470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
17480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
1749c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1750c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1751c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
175247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
1753c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
1754c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
1755c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1756c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
1757c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1758c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
175947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1760c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1761c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
1762c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1763b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
176447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float maxZoom = 10;
1765c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1766c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
1767c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
176847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
1769c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1770c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
1771c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
177247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
177347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1774c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1775c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
1776c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
1777c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
177847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
1780662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1781662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
1782662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
1783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
178447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
178580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
178680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
178780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
178880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
178980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1790662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
179180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
179280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
179447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2];
1795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1796662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_jpeg_sizes);
1798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_jpeg_sizes,
1800c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1801c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1802c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
180308ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
180408ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
1805662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
180647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
180797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
180897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
180997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
181097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
181197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
181297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
181397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
181497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
181597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
181697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
181797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
181897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
181947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
18200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
1821662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
18220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
1823b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
18240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
18250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
18270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1829662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1830662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1831662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
18320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
183447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1835e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
18362dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
1837662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
18380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
1839b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
18400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
18410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
1842e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
1843e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
18442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
18450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1846662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1847e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
18502dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
1851662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
185247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
1853e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
1854e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
1855e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1856e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_indexes);
1857e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
1858e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1859e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
1860e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
186147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
18620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1863662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
18640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
1865b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
1866b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
18670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
18690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
18710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
1872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
18750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
187747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
18780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1879662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
18800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
1881b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
18820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
18830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
18850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
18860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1889662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
18900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1891662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
189247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
18930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1894662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
18950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1896b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
18970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
18980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
18990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
19000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
1904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
19050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1906662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
190747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX];
19080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
19100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FLASH_MODES_MAP,
1911b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]),
19120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_flash_modes[i]);
19130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_flash_modes[size] = (uint8_t)val;
19150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1918e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t flashAvailable = 0;
1919e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (size > 1) {
1920e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        //flash is supported
1921e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        flashAvailable = 1;
1922e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_MODE,
1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_flash_modes,
19250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1927e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
1928e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
1929e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1930e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
1931e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
1932e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
1933e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
1934e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
1935e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1936e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
1937e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
1938e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
1939e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
1940e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
1943e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
19443fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    size = 0;
19453fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t avail_sensitivities[CAM_ISO_MODE_MAX];
19463fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_iso_modes_cnt; i++) {
19473fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        int32_t sensitivity = getSensorSensitivity(gCamCapability[cameraId]->supported_iso_modes[i]);
19483fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        if (sensitivity != -1) {
19493fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang            avail_sensitivities[size] = sensitivity;
19503fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang            size++;
19513fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
19523fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
19533fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_AVAILABLE_SENSITIVITIES,
19543fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang                      avail_sensitivities,
19553fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang                      size);
19562dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1957b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
1958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
1963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1968662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1969662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1970662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
1971662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
1972662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
1974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
1975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
19800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
19810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
19820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
19830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
19840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
19850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
19860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
19870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
19880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
19890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
1990c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
19910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
19920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
19930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
1994c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
1995c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
19960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
19970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
19980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
19992dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
20002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
20012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
20022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
20042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
20062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
20082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
20092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2010e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
2011e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t* supported_indexes)
20122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
20132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
20142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
20152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
2016e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    int j = 0, index = 0;
20172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j] = (int32_t)overridesTable[index].ae_mode;
2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j+1] = (int32_t)overridesTable[index].awb_mode;
2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        overridesList[j+2] = (int32_t)overridesTable[index].af_mode;
20222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
20232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
20242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
20252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2026662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2029662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2031662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2036662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2041662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2042662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2043662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2044662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2046662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2047662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2048662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2049662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2050662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2051662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2052662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2053662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2056662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
20633fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
20643fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20653fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
20663fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20673fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
20683fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20693fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
20703fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
20713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
20723fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
20733fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
20743fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
20753fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
20763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
20773fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
20783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
20793fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
20813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
20823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
20843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
20853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
20873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
20883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
20903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
20913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
20933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
20943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
20953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
20963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
20973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
20983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
20993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
21003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2134662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2135662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2140662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2141662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2142662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2143662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2144662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2145662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2146662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2147662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2148662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2149662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2171662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
21720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2173662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2174662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2175662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2176d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2177d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2178d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2179662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2180d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2181d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2182d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2183d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2184d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2185d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2186662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2187662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2188662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2189662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2190662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2193662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2194662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2195662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2196662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2197662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2198662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2199662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2200662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2201662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2202662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
22030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2204662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2205662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2206662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2207662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2208662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2209662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
22100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2211662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2212662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2213662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2240b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2264e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2265b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
228297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2284e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2285e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
229297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
23229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
23239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2343e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2344e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2345e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2346e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2347e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2348e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2349e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2350e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
23512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
23522dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
23532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
23542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
23552dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
236247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2365b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
236647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2367b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2368b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2369b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
23719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
23729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2376e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
238180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
238280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
238380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
238480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
238580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
238680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
238780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
238880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
238980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
239080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
239180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
239280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
2393662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id,
2394662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                  const camera_metadata_t *settings)
239580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
239680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
239780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
239833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (settings == NULL && mFirstRequest) {
239980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
240080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2401662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
240233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2403b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2404b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2405b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
240633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2407b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2408b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
240933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2410662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2411662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2412662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                sizeof(frame_id), &frame_id);
2413662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2414662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2415662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2416662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
24170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2418662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(settings != NULL){
24191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        rc = translateMetadataToParameters(settings);
242080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
242180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
242380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
242480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
242580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
242680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
242780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
242880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
242980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
243080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
243380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
243480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
243680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
243780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
243880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
243980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
244080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
244180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
244397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
2444662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    frame_settings = settings;
2445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
24460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
24470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
24480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
24490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
24500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
24510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
24520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
245397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
245453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
245553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        int32_t expCompensation = frame_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
245653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
245753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
245853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
245953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
24600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
24610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
24620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
24630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
24640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
246597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
24670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
24680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
24690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
24700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
24710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
24720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
24730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
24740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
247597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
24762b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
24772b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
24782b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
24792b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
24802b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
24812b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
24822b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
24832b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
24840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
24852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
24860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
24872b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
24882b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
24892b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
24902b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
24912b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
24922b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
24932b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
24942b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
24950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
24960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
24970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2498662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
24990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
25000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
25010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
25020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
25030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
25040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
25070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
25080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
25090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
25100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
25110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
25120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
25130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
25140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
25170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
25180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
25190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
25200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
25210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
25220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
25230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
25240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
25270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
25280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2529e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2530e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
2531e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2532e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2533e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2534e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2535e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2536e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2537e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2538e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2539e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2540e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2541e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2542e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2543e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          aeMode);
25440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
25450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2546e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2547e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2548e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2549e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
25500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_REQUEST_FRAME_COUNT)) {
25530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t metaFrameNumber =
25540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_REQUEST_FRAME_COUNT).data.i32[0];
25550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
25560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaFrameNumber), &metaFrameNumber);
25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
25600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
25610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
25620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
25630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
25640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
25650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2566e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
2567e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
2568e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
25692dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
25702dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
25712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
25732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
25742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
25771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25792dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
25802dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
25812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
25822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
25832dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
25852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
25862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
25870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
25882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
25890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
25940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
25950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
25990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
26000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
26010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
26020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
26050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
26060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
26070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
26080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
26110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
26130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2617e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
2618e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t flashMode =
2619e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
2620e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
2621e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                CAM_INTF_META_FLASH_MODE, sizeof(flashMode), &flashMode);
2622e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2623e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
26468867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
26480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
26500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
26510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
26540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
26550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
26560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
26570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
26580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
26610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
26620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
26630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
26640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
26650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
26680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
26700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
26710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
26760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
26770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
26780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
26790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
26800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
26830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
26840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
26858867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
26860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
26880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
26910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
26920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
26938867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
26940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
26950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
26960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
26990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
27000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
27018867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
27020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
27030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
27040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
270671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
270771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
27080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
27090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
27100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
27110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
27120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
27130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
27140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
271547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
271647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
27170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
27190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
272071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
27210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
27280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
27450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
27480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
27490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
27500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
27510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
27560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
27570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
27580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
27590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
27620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t facedetectMode =
27630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
27640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
27660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
27670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
27700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
27710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
27720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
27740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
27750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
27780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
27790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
27800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
27820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
27830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
27860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
27870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
27980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
280059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
280159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
280271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
280359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
280471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
280571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
280671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
280771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
280871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
280971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
281071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
281159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
281259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
281359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
281459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
281571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
281659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
281771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
281871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
281971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
282071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
282171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
282271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
282371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
282459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
282559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
282659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
282759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
282871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
282959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
283071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
283171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
283271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
283371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
283471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
283571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
283671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
283759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
2838662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2839662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2840662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2841662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
28420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
2843662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
28440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
2845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2846662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2847662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
2849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2851662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
2852662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
2853662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
2855662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
2856662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2857662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
28589a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
28599a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
28609a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
28619a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
28629a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
28639a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
28649a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
28659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
28669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
28679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
2868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
2869662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
2870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
287297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
2873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
2874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
28750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
28760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
28770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
28780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
28790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
28800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
28820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
28830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
28840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
28851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
28860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
28900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
28910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
289308ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
289408ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
28950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
28970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
28989a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
28999a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
29000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
29010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
29023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
29039a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
29049a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
29053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
29060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
29099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
29109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
29129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
29139a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
29179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
29189a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
29199a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
29209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
29219a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
29229a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
29239a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
29249a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
29259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
29269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
29270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29283fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
29323fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
29333fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29359a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
29360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
29380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
29390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
294053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
294153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
294253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
294353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
294453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
29450a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
294680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
294780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
294880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
294980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
2950e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
2951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
2953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
2956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
2957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
2958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
2960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
29611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
2962e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
2963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
2964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
2966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
2967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
2968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
2969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
2972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
2973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2974625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2975625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2976625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
2977625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2978625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
2979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2980625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2981625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2982625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2983625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
2984625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
2985625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2986625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2987625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
2988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
2989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2990d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
2991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
29981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
2999d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
30001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3020d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
30271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3028d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
30291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3030625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3032625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3045d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
30521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3053d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
30541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
30689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
30699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
30709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3073d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
308297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3084d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
30989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
30999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
31009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3102d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
310380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
310480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
310580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
310680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
31079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
310880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
31099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
31101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3111d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3126e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3127e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3128e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3130d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3131e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3132e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3133e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3134e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3135e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3136e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3137e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3138e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3139d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3140e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3154e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3155e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3157d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3160e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3165e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3166d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3172e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3175e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3176e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3177e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3179e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3180e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3181e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3182d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3183e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3185e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3186e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3187e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3189e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3190e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3191e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3192cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3193cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3194cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3195cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3196d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3199e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3201