QCamera3HWI.cpp revision 7ee407aa1024789089aad411c372c79423699976
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without
4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are
5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met:
6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions of source code must retain the above copyright
7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       notice, this list of conditions and the following disclaimer.
8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Redistributions in binary form must reproduce the above
9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       copyright notice, this list of conditions and the following
10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       disclaimer in the documentation and/or other materials provided
11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       with the distribution.
12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*     * Neither the name of The Linux Foundation nor the names of its
13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       contributors may be used to endorse or promote products derived
14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*       from this software without specific prior written permission.
15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*
28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/
29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI"
31625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h>
33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h>
34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h>
35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h>
36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h>
37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h>
38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h>
39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h>
40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h"
41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h"
42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h"
4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h"
44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera {
48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
5080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings;
51b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
53cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
54cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    PTHREAD_MUTEX_INITIALIZER;
55cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
56cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
9697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
100b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
115e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
117e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
118e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
1256356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE },
1266356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH }
127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
12908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
13008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                                             320, 240, 176, 144, 0, 0};
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
157cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang      mCameraInitialized(false),
15897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
15933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
16033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
1617ee407aa1024789089aad411c372c79423699976Ajay Dudani      mPictureChannel(NULL),
16233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
16333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
16433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
16599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      mJpegSettings(NULL),
1668bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani      mIsZslMode(false),
16799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan      m_pPowerModule(NULL)
168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1757ee407aa1024789089aad411c372c79423699976Ajay Dudani    // TODO: hardcode for now until mctl add support for min_num_pp_bufs
1767ee407aa1024789089aad411c372c79423699976Ajay Dudani    //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3
1777ee407aa1024789089aad411c372c79423699976Ajay Dudani    gCamCapability[cameraId]->min_num_pp_bufs = 3;
1789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
18174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    mCurrentRequestId = -1;
182e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
18333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
18433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
18533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
18699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
18799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
18899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
18999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
19099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
19199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
19766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
205d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
206d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* We need to stop all streams before deleting any stream */
2071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
2081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        it != mStreamInfo.end(); it++) {
2091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
210dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
2117ee407aa1024789089aad411c372c79423699976Ajay Dudani           channel->stop();
212d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    }
213d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
214d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        it != mStreamInfo.end(); it++) {
215d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
216dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        if (channel)
217dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang            delete channel;
2181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        free (*it);
2191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
2201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
2217ee407aa1024789089aad411c372c79423699976Ajay Dudani    mPictureChannel = NULL;
2227ee407aa1024789089aad411c372c79423699976Ajay Dudani
22397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
22497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
22597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
22697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
227dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
228dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    /* Clean up all channels */
229dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    if (mCameraInitialized) {
230d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        mMetadataChannel->stop();
231d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        delete mMetadataChannel;
232d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        mMetadataChannel = NULL;
233dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang        deinitParameters();
234dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang    }
235dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang
236cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraOpened)
237cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        closeCamera();
238e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
23933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
24033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
24133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
24233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
243e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
244e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
245e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
246d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
264cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
265cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (mCameraSessionActive) {
266cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
267cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        pthread_mutex_unlock(&mCameraSessionLock);
268cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        return INVALID_OPERATION;
269cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    }
270cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
277cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    if (rc == 0) {
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
279cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang        mCameraSessionActive = 1;
280cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    } else
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
282cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
28399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
28499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == 0) {
28599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
28699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
28799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
28899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=1");
28999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
29099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
29199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
29299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
293cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
34499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS
34599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    if (rc == NO_ERROR) {
34699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        if (m_pPowerModule) {
34799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            if (m_pPowerModule->powerHint) {
34899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
34999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan                        (void *)"state=0");
35099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan            }
35199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan        }
35299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan    }
35399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif
35499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
374e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
37633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
37733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
37833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
37933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
38033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
381d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    //Create metadata channel and initialize it
382d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
383d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani                    mCameraHandle->ops, captureResultCb,
384d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani                    &gCamCapability[mCameraId]->padding_info, this);
385d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    if (mMetadataChannel == NULL) {
386d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        ALOGE("%s: failed to allocate metadata channel", __func__);
387d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        rc = -ENOMEM;
388d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        goto err2;
389d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    }
390d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    rc = mMetadataChannel->initialize();
391d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    if (rc < 0) {
392d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        ALOGE("%s: metadata channel initialization failed", __func__);
393d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani        goto err3;
394d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    }
395d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani
3969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
397e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
398e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
399cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraInitialized = true;
4009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
4019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
402d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr3:
403d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    delete mMetadataChannel;
404d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    mMetadataChannel = NULL;
405d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr2:
406d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    deinitParameters();
4079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
408e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
4099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
42733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
4280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    pthread_mutex_lock(&mMutex);
429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
432e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
438e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
445e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
450c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    camera3_stream_t *jpegStream = NULL;
4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /* first invalidate all the steams in the mStreamList
4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole     * if they appear again, they will be validated */
4531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
455d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
456d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        channel->stop();
4570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (*it)->status = INVALID;
4580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
459d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
462c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d",
463c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                __func__, newStream->stream_type, newStream->format,
464c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                 newStream->width, newStream->height);
4650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        //if the stream is in the mStreamList validate it
4660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        bool stream_exists = false;
4671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
4681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                it != mStreamInfo.end(); it++) {
4690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            if ((*it)->stream == newStream) {
4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                QCamera3Channel *channel =
4711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    (QCamera3Channel*)(*it)->stream->priv;
4720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                stream_exists = true;
4730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                (*it)->status = RECONFIGURE;
4741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                /*delete the channel object associated with the stream because
4751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                  we need to reconfigure*/
4761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete channel;
4771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->stream->priv = NULL;
4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
4790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
4800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (!stream_exists) {
4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            //new stream
4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info_t* stream_info;
4830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
4840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->stream = newStream;
4850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            stream_info->status = VALID;
4861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            stream_info->registered = 0;
4870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            mStreamInfo.push_back(stream_info);
4880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
489c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT
490c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
493e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
498c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
499c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            jpegStream = newStream;
500c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    /*clean up invalid streams*/
5051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
5061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end();) {
5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if(((*it)->status) == INVALID){
5081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
5091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            delete channel;
5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            free(*it);
5121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it = mStreamInfo.erase(it);
5131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
5141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it++;
5150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
5160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
518d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani    //mMetadataChannel->stop();
519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
526f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_INPUT:
527f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
528f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
529f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_BIDIRECTIONAL:
530f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
531f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    GRALLOC_USAGE_HW_CAMERA_WRITE;
532f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
533f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            case CAMERA3_STREAM_OUTPUT:
534f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
535f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
536f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab            default:
537f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
538f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                break;
539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
5421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
545f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
5468867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                case HAL_PIXEL_FORMAT_YCbCr_420_888:
547f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
548c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
549c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        jpegStream) {
550c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t width = jpegStream->width;
551c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        uint32_t height = jpegStream->height;
5528bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani                        mIsZslMode = true;
553c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
554c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
555c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream,
556c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            width, height);
557c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    } else
558c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
559f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
560f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
561f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    if (channel == NULL) {
562f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
563f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
564f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
565f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->priv = channel;
568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                case HAL_PIXEL_FORMAT_BLOB:
570f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
5717ee407aa1024789089aad411c372c79423699976Ajay Dudani                    mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle,
572f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            mCameraHandle->ops, captureResultCb,
573f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                            &gCamCapability[mCameraId]->padding_info, this, newStream);
5747ee407aa1024789089aad411c372c79423699976Ajay Dudani                    if (mPictureChannel == NULL) {
575f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        ALOGE("%s: allocation of channel failed", __func__);
576f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        pthread_mutex_unlock(&mMutex);
577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                        return -ENOMEM;
578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    }
5797ee407aa1024789089aad411c372c79423699976Ajay Dudani                    newStream->priv = (QCamera3Channel*)mPictureChannel;
580f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
581f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab
582f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                //TODO: Add support for app consumed format?
583f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                default:
584f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
585f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab                    break;
586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
5938867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    /*For the streams to be reconfigured we need to register the buffers
5941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole      since the framework wont*/
5951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
5961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
5971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->status == RECONFIGURE) {
5981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
5991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            /*only register buffers for streams that have already been
6001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole              registered*/
6011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->registered) {
6021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
6031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        (*it)->buffer_set.buffers);
6041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (rc != NO_ERROR) {
6051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Failed to register the buffers of old stream,\
6061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            rc = %d", __func__, rc);
6071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
608a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: channel %p has %d buffers",
609e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        __func__, channel, (*it)->buffer_set.num_buffers);
6100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
6110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
6121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
6141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (index == NAME_NOT_FOUND) {
6151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.add((*it)->stream, 0);
6161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        } else {
6171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueAt(index) = 0;
6181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
6190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
6201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
6211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
6221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.clear();
6231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
62433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
62633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
62733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
628e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
62933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
63680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
63780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
63880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
63980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
64080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
64180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
64280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
643e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
64580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
6479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
6489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
6499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
6539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
6579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
6589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
6599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
6609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
6649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
6659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
6669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
6679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
669c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        b = request->input_buffer;
670c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel *channel =
671c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            static_cast<QCamera3Channel*>(b->stream->priv);
672c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (channel == NULL) {
673c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
674c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
675c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
676c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
677c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
678c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
679c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
680c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
681c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
682c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->release_fence != -1) {
683c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
684c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
685c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
686c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
687c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        if (b->buffer == NULL) {
688c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
689c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    __func__, frameNumber, idx);
690c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            return BAD_VALUE;
691c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
7179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
7189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
7199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
7209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
7219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
7229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
758e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
764e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
765e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
7680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    //set the buffer_set in the mStreamInfo array
7691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
7701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            it != mStreamInfo.end(); it++) {
7711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if ((*it)->stream == stream) {
7720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            uint32_t numBuffers = buffer_set->num_buffers;
7731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.stream = buffer_set->stream;
7741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.num_buffers = numBuffers;
7751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
7761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if ((*it)->buffer_set.buffers == NULL) {
7770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
7780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                pthread_mutex_unlock(&mMutex);
7790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                return -ENOMEM;
7800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            for (size_t j = 0; j < numBuffers; j++){
7821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
7830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            }
7841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            (*it)->registered = 1;
7850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
7860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
787e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
800e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
810e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
81374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    int32_t request_id;
814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
820e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
822e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
825e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = setFrameParameters(request->frame_number, request->settings);
8279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
8319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
83374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    meta = request->settings;
83474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    if (meta.exists(ANDROID_REQUEST_ID)) {
83574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
83674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        mCurrentRequestId = request_id;
837013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Received request with id: %d",__func__, request_id);
83874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else if (mFirstRequest || mCurrentRequestId == -1){
83974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        ALOGE("%s: Unable to find request id field, \
84074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                & no previous id available", __func__);
84174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        return NAME_NOT_FOUND;
84274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    } else {
843013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        ALOGV("%s: Re-using old request id", __func__);
84474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab        request_id = mCurrentRequestId;
84574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    }
84674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
847c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
848c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    __func__, __LINE__,
849c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->num_output_buffers,
850c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    request->input_buffer,
851c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                    frameNumber);
852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
8537ee407aa1024789089aad411c372c79423699976Ajay Dudani    int blob_request = 0;
854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
85766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
85866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
85966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
8607ee407aa1024789089aad411c372c79423699976Ajay Dudani            blob_request = 1;
86166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
86266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
8630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                ALOGE("%s: failed to get jpeg parameters", __func__);
86466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
86566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
86666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
86766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
86866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
8771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    /* Update pending request list and pending buffers map */
8781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    PendingRequestInfo pendingRequest;
8791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.frame_number = frameNumber;
8801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    pendingRequest.num_buffers = request->num_output_buffers;
88174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    pendingRequest.request_id = request_id;
8827ee407aa1024789089aad411c372c79423699976Ajay Dudani    pendingRequest.blob_request = blob_request;
88374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab
8841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    for (size_t i = 0; i < request->num_output_buffers; i++) {
8851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        RequestedBufferInfo requestedBuf;
8861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.stream = request->output_buffers[i].stream;
8871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        requestedBuf.buffer = NULL;
8881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        pendingRequest.buffers.push_back(requestedBuf);
8891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
8911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    }
8921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mPendingRequestsList.push_back(pendingRequest);
8931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
8949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
895e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
8969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
8979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
8989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
8999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
9009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
901c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        mm_camera_buf_def_t *pInputBuffer = NULL;
90266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
9039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
9049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
9059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
9069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
9079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
90866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
909c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            QCamera3RegularChannel* inputChannel = NULL;
910c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            if(request->input_buffer != NULL){
911c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
912c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                //Try to get the internal format
913c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                inputChannel = (QCamera3RegularChannel*)
914c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    request->input_buffer->stream->priv;
915c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                if(inputChannel == NULL ){
916c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGE("%s: failed to get input channel handle", __func__);
917c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                } else {
918c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    pInputBuffer =
919c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                        inputChannel->getInternalFormatBuffer(
920c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                                request->input_buffer->buffer);
921c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("%s: Input buffer dump",__func__);
922c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
923c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
924c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                    ALOGD("frame len:%d", pInputBuffer->frame_len);
925c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                }
926c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            }
927c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
928c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang                            pInputBuffer,(QCamera3Channel*)inputChannel);
92966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
930a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
931a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                __LINE__, output.buffer, frameNumber);
93266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
93366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
9349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
9359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
9369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
9379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
9381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    mFirstRequest = false;
9391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
9409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
9419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
9429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
9435b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang        pthread_cond_wait(&mRequestCond, &mMutex);
9449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
9459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
94780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
94880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
94980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
9509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
9529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
9549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
9559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
959e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
960b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(
961b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                    vendor_tag_query_ops_t* /*ops*/)
962e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
967e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
968e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
973e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
977e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
982b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/)
983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
992e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
9937ee407aa1024789089aad411c372c79423699976Ajay Dudani
994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
995e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
996e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
99733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
99833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
100233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
100333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
10049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
10059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
10069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
10071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1008e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
10099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
10105b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_lock(&mMutex);
1011e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
10121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    if (metadata_buf) {
10131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
101433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
101533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
1016152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        uint32_t pending_requests = *(uint32_t *)POINTER_OF(
1017152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang            CAM_INTF_META_PENDING_REQUESTS, metadata);
101833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
101933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
10200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        const struct timeval *tv = (const struct timeval *)
10210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
10220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
10230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            tv->tv_usec * NSEC_PER_USEC;
10240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (!frame_number_valid) {
1026a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mMetadataChannel->bufDone(metadata_buf);
10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            goto done_metadata;
10291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1030a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1031e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                frame_number, capture_time);
10321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Go through the pending requests info and send shutter/results to frameworks
10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1035e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_notify_msg_t notify_msg;
1038a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
10391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Flush out all entries with less or equal frame numbers.
10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
1042e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1043e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //Right now it's the same as metadata timestamp
1044e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
1045e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //TODO: When there is metadata drop, how do we derive the timestamp of
1046e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //dropped frames? For now, we fake the dropped timestamp by substracting
1047e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            //from the reported timestamp
1048e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            nsecs_t current_capture_time = capture_time -
1049e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1050e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang
10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send shutter notify to frameworks
10521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.type = CAMERA3_MSG_SHUTTER;
10531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            notify_msg.message.shutter.frame_number = i->frame_number;
1054e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            notify_msg.message.shutter.timestamp = current_capture_time;
10551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mCallbackOps->notify(mCallbackOps, &notify_msg);
1056a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1057e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    i->frame_number, capture_time);
10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Send empty metadata with already filled buffers for dropped metadata
10601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // and send valid metadata with already filled buffers for current metadata
10611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (i->frame_number < frame_number) {
106299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                CameraMetadata dummyMetadata;
106399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1064e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        &current_capture_time, 1);
106599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                dummyMetadata.update(ANDROID_REQUEST_ID,
106674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        &(i->request_id), 1);
106799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang                result.result = dummyMetadata.release();
10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
1069e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                result.result = translateCbMetadataToResultMetadata(metadata,
107074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                        current_capture_time, i->request_id);
10717ee407aa1024789089aad411c372c79423699976Ajay Dudani                if (i->blob_request) {
10727ee407aa1024789089aad411c372c79423699976Ajay Dudani                   //If it is a blob request then send the metadata to the picture channel
10737ee407aa1024789089aad411c372c79423699976Ajay Dudani                   mPictureChannel->queueMetadata(metadata_buf);
10747ee407aa1024789089aad411c372c79423699976Ajay Dudani
10757ee407aa1024789089aad411c372c79423699976Ajay Dudani                } else {
10767ee407aa1024789089aad411c372c79423699976Ajay Dudani                   // Return metadata buffer
10777ee407aa1024789089aad411c372c79423699976Ajay Dudani                   mMetadataChannel->bufDone(metadata_buf);
10787ee407aa1024789089aad411c372c79423699976Ajay Dudani                   free(metadata_buf);
10797ee407aa1024789089aad411c372c79423699976Ajay Dudani                }
10801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (!result.result) {
10821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                ALOGE("%s: metadata is NULL", __func__);
10831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.frame_number = i->frame_number;
10851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 0;
1086e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            result.output_buffers = NULL;
10871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1088e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
10891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->buffer) {
10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    result.num_output_buffers++;
10911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
10921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
10931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
10941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (result.num_output_buffers > 0) {
10951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                camera3_stream_buffer_t *result_buffers =
10961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    new camera3_stream_buffer_t[result.num_output_buffers];
10971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (!result_buffers) {
10981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Fatal error: out of memory", __func__);
10991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                size_t result_buffers_idx = 0;
11011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1102e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                        j != i->buffers.end(); j++) {
11031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer) {
11041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        result_buffers[result_buffers_idx++] = *(j->buffer);
11051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        free(j->buffer);
110613dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang                        j->buffer = NULL;
11071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        mPendingBuffersMap.editValueFor(j->stream)--;
11081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
11091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                result.output_buffers = result_buffers;
11111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole
11121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1113a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1114d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
11151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
11161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                delete[] result_buffers;
11171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            } else {
11181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                mCallbackOps->process_capture_result(mCallbackOps, &result);
1119a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1120d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang                        __func__, result.frame_number, current_capture_time);
11211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                free_camera_metadata((camera_metadata_t *)result.result);
11221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // erase the element from the list
11241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i = mPendingRequestsList.erase(i);
11251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
112633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
112733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
11281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata:
11291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        bool max_buffers_dequeued = false;
11301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
11311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1132e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
11331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            if (queued_buffers == stream->max_buffers) {
11341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                max_buffers_dequeued = true;
11351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                break;
11361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
1138152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang        if (!max_buffers_dequeued && !pending_requests) {
11391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Unblock process_capture_request
11401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingRequest = 0;
11411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            pthread_cond_signal(&mRequestCond);
11421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        }
11431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    } else {
11441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // If the frame number doesn't exist in the pending request list,
11451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // directly send the buffer to the frameworks, and update pending buffers map
11461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        // Otherwise, book-keep the buffer.
11471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1148c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
11491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            i++;
1150c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        }
11511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        if (i == mPendingRequestsList.end()) {
11521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            // Verify all pending requests frame_numbers are greater
11531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1154e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != mPendingRequestsList.end(); j++) {
11551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->frame_number < frame_number) {
11561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
11571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                            __func__, j->frame_number, frame_number);
11581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
11601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            camera3_capture_result_t result;
11611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.result = NULL;
116233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
11631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.num_output_buffers = 1;
11641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            result.output_buffers = buffer;
1165a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab            ALOGV("%s: result frame_number = %d, buffer = %p",
1166e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    __func__, frame_number, buffer);
11671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            mPendingBuffersMap.editValueFor(buffer->stream)--;
1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
116933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
11701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1171e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                    j != i->buffers.end(); j++) {
11721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                if (j->stream == buffer->stream) {
11731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    if (j->buffer != NULL) {
11741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        ALOGE("%s: Error: buffer is already set", __func__);
11751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    } else {
11761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        j->buffer = (camera3_stream_buffer_t *)malloc(
11771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(camera3_stream_buffer_t));
11781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                        *(j->buffer) = *buffer;
1179a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab                        ALOGV("%s: cache buffer %p at result frame_number %d",
1180e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang                                __func__, buffer, frame_number);
11811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                    }
11821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                }
11831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole            }
1184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
11859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
11865b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang    pthread_mutex_unlock(&mMutex);
11879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
11889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
11899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
119397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
119497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
119997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
120374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                (metadata_buffer_t *metadata, nsecs_t timestamp,
120474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab                                 int32_t request_id)
120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
121074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
121397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
121997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
122097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
122197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
122297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
122497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
122597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
122697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
122797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
122897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
122959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
123599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    if (numFaces > 0) {
123699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
123799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
123899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
124099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
124299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang    }
124397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12448867984d33ed870071109a4500402dddbc85c048Shuzhen Wang    uint8_t  *color_correct_mode =
12450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
124697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
124797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
124897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
124997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
125097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
125197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
125297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
125497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
125597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
125659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
12588bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani   if(mIsZslMode) {
12598bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
12608bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
12618bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani    } else {
12628bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        uint8_t *ae_state =
12638bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
12648bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani        camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
12658bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani   }
12660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *focusMode =
12670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
126897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
126997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
127297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
127459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
127997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
128397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalance =
12850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
128697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
128997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
129097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
129259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
129397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
129497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *whiteBalanceState =
12960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
129797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
129897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
12990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
130097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
130197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashPower =
13060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
130797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
130897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
131097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
131197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
131297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
131397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
131497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *flashState =
13180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *hotPixelMode =
13220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
132897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
132997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
133097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
133197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
133597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
133697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
133797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
133897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
133997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
134097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
134197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
134297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
134397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
134497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *opticalStab =
13460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
13470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
134897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
134997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
135097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
135197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
135297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *noiseRedMode =
13540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
135597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
135697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
135797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
135897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
136097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
136171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t scalerCropRegion[4];
13620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[0] = hScalerCropRegion->left;
13630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[1] = hScalerCropRegion->top;
13640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    scalerCropRegion[2] = hScalerCropRegion->width;
136571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    scalerCropRegion[3] = hScalerCropRegion->height;
136671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
136797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
136897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
136997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
137097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
137197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
137297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
137397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
137497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
137597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
137697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
137797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
13783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    mMetadataResponse.iso_speed = *sensorSensitivity;
137997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
138097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *shadingMode =
13820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
138397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
138497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *faceDetectMode =
13860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
138797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
138897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *histogramMode =
13900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
139197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
139297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
13930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    uint8_t  *sharpnessMapMode =
13940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
139597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
139697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
139797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
139897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
139997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
140097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
140197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
140297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
140397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
140497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
140597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
140633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
140797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
140897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
140997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
141059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertToRegions
141197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
141397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
141497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
141597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
141697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
141797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
141897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
141997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
142097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
142159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
142297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
142397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
142459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[2] = rect.left + rect.width;
142559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    region[3] = rect.top + rect.height;
142697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
142797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
142897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
142997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
143059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
143159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*===========================================================================
143259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION   : convertFromRegions
143359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
143459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t
143559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
143659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS :
143759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @rect   : cam_rect_t struct to convert
143859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @region : int32_t destination array
143959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *   @weight : if we are converting from cam_area_t, weight is valid
144059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *             else weight = -1
144159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *
144259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/
144359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
144459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   const camera_metadata_t *settings,
144559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang                                                   uint32_t tag){
144659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    CameraMetadata frame_settings;
144759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    frame_settings = settings;
144859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_min = frame_settings.find(tag).data.i32[0];
144959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_min = frame_settings.find(tag).data.i32[1];
145059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t x_max = frame_settings.find(tag).data.i32[2];
145159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    int32_t y_max = frame_settings.find(tag).data.i32[3];
145259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->weight = frame_settings.find(tag).data.i32[4];
145359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.left = x_min;
145459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.top = y_min;
145559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.width = x_max - x_min;
145659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    roi->rect.height = y_max - y_min;
145759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang}
145859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
145997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
146071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION   : resetIfNeededROI
146171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
146271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler
146371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *              crop region
146471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
146571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS :
146671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @roi       : cam_area_t struct to resize
146771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *   @scalerCropRegion : cam_crop_region_t region to compare against
146871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
146971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *
147071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/
147171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
147271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                                                 const cam_crop_region_t* scalerCropRegion)
147371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{
147471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_x_max = roi->rect.width + roi->rect.left;
147571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t roi_y_max = roi->rect.height + roi->rect.top;
147671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
147771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
147871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if ((roi_x_max < scalerCropRegion->left) ||
147971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi_y_max < scalerCropRegion->top)  ||
148071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.left > crop_x_max) ||
148171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        (roi->rect.top > crop_y_max)){
148271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        return false;
148371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
148471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.left < scalerCropRegion->left) {
148571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.left = scalerCropRegion->left;
148671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
148771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi->rect.top < scalerCropRegion->top) {
148871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi->rect.top = scalerCropRegion->top;
148971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
149071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_x_max > crop_x_max) {
149171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_x_max = crop_x_max;
149271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
149371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    if (roi_y_max > crop_y_max) {
149471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        roi_y_max = crop_y_max;
149571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    }
149671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.width = roi_x_max - roi->rect.left;
149771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    roi->rect.height = roi_y_max - roi->rect.top;
149871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    return true;
149971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang}
150071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang
150171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*===========================================================================
150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
150597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
150697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
151297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
151697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
151797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
151897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
151997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
152097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
152197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1548e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1549e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1592e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1593e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
164533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
164633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
164733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
164833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
164933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
165033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
165133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
165233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
165333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
165433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
165533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
165633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
165733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
165833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
165933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
166033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
166133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
166233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
166333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
166433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
166533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
16660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION   : calcMaxJpegSize
16670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
16690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS :
16710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *
16720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN     : max_jpeg_size
16730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/
16740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize()
16750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{
16760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int32_t max_jpeg_size = 0;
16770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    int temp_width, temp_height;
16780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
16790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
16800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
16810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        if (temp_width * temp_height > max_jpeg_size ) {
16820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab            max_jpeg_size = temp_width * temp_height;
16830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab        }
16840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    }
16850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
16860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    return max_jpeg_size;
16870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab}
16880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab
16890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*===========================================================================
1690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
1700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
170497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
1705c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
1706c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    /* android.info: hardware level */
1707c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
1708c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
1709c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        &supportedHardwareLevel, 1);
1710c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang
1711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1712662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
17132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
17142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1); */
17152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
1716e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    /*hard coded for now but this should come from sensor*/
1717e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    float min_focus_distance;
1718e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if(facingBack){
1719e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 10;
1720e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
1721e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        min_focus_distance = 0;
1722e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
1723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
17242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                    &min_focus_distance, 1);
1725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1729c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*should be using focal lengths but sensor doesn't provide that info now*/
1730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1731c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &gCamCapability[cameraId]->focal_length,
1732c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      1);
1733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
1736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
1737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
1740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
1741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1744c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
1746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
174780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
174880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
174980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
175080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
175147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
175280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
175380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
175480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
175580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
175747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
17580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
175980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
176080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
176180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
176280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
176480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
1765c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
176680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
176780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
176880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
176980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
177080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
177180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
177280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
177380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
177480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
177580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
177680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
177780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1778c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
177980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
178047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
178180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
178280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
178380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
178480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
178522817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t active_array_size[] = {0, 0,
178622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                gCamCapability[cameraId]->active_array_size.width,
178780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
178880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
178922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                      active_array_size, 4);
179080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
179180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
179280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
1793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
179480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
179580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
179680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
179780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
179880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
179980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
180080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
180180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
180280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1803c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1804c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1805c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*hardcode 0 for now*/
1806c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    int32_t max_face_count = 0;
180780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1808c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &max_face_count, 1);
180980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
181180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
181280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
181480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
181580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
181780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
181880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
181980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
182080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
182180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
182280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
182380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
182480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
182580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
182680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
182780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
182880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
182980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
183022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
183122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala                                                HAL_PIXEL_FORMAT_BLOB};
183222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
1833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1834662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
18358867984d33ed870071109a4500402dddbc85c048Shuzhen Wang                      scalar_formats_count);
1836662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
183747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
1838662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1839662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1840662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
1841662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1842662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
1843c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
1844e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
1845e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->min_duration[0],
1846e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->supported_sizes_tbl_cnt);
18470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
184847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
18490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
18500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
18510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                 available_fps_ranges);
1852c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1853c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1854c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
185547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    camera_metadata_rational exposureCompensationStep = {
1856c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.numerator,
1857c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            gCamCapability[cameraId]->exp_compensation_step.denominator};
1858c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1859c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      &exposureCompensationStep, 1);
1860c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1861c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    /*TO DO*/
186247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1863c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1864c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableVstabModes, sizeof(availableVstabModes));
1865c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1866b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    /*HAL 1 and HAL 3 common*/
18679443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    float maxZoom = 4;
1868c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1869c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &maxZoom, 1);
1870c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
187147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max3aRegions = 1;
1872c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1873c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang            &max3aRegions, 1);
1874c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
187547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t availableFaceDetectModes[] = {
187647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1877c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1878c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      availableFaceDetectModes,
1879c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                      sizeof(availableFaceDetectModes));
1880c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
188147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
1883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
1885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
1886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
188747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
188880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
188980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
189080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
189180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
189280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1893662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
189480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
189580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
189747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2];
1898662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1899662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1900662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_jpeg_sizes);
1901662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_jpeg_sizes,
1903c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1904c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang
1905c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
190608ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      available_thumbnail_sizes,
190708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
190947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    int32_t max_jpeg_size = 0;
191097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
191197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
191297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
191397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
191497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
191597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
191697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
191797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
191897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
191997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
192097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
192197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
192247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
19230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int32_t size = 0;
1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
19250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(EFFECT_MODES_MAP,
1926b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
19270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                   gCamCapability[cameraId]->supported_effects[i]);
19280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_effects[size] = (uint8_t)val;
19300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
19350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
193747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1938e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
19392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    int32_t supported_scene_modes_cnt = 0;
1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
19410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(SCENE_MODES_MAP,
1942b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
19430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_scene_modes[i]);
19440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
1945e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
1946e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            supported_indexes[supported_scene_modes_cnt] = i;
19472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            supported_scene_modes_cnt++;
19480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1950e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
19532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                      supported_scene_modes_cnt);
1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
195547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
1956e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
1957e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt,
1958e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
19599443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      supported_indexes,
19609443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                      cameraId);
1961e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
1962e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      scene_mode_overrides,
1963e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      supported_scene_modes_cnt*3);
1964e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
196547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
19660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
19680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
1969b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
1970b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                 gCamCapability[cameraId]->supported_antibandings[i]);
19710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_antibanding_modes[size] = (uint8_t)val;
19730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
19750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
19790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
198147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
19820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
19840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FOCUS_MODES_MAP,
1985b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
19860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_focus_modes[i]);
19870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
19880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_af_modes[size] = (uint8_t)val;
19890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
19900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
1991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
19940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
1995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
199647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
19970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
1998662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
19990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
2000b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
20010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                    gCamCapability[cameraId]->supported_white_balances[i]);
20020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
20030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_awb_modes[size] = (uint8_t)val;
20040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
20050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
2008662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
20090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2010662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
201147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX];
20120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    size = 0;
2013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
20140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int val = lookupFwkName(FLASH_MODES_MAP,
2015b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                                sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]),
20160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                                gCamCapability[cameraId]->supported_flash_modes[i]);
20170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        if (val != NAME_NOT_FOUND) {
20180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            avail_flash_modes[size] = (uint8_t)val;
20190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            size++;
20200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
2021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t flashAvailable = 0;
2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (size > 1) {
2024e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        //flash is supported
2025e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        flashAvailable = 1;
2026e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_MODE,
2028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_flash_modes,
20290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                      size);
2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2031e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2032e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            &flashAvailable, 1);
2033e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
2034e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    uint8_t avail_ae_modes[5];
2035e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    size = 0;
2036e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2037e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2038e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        size++;
2039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2040e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (flashAvailable) {
2041e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2042e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2043e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2044e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2046662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
2047e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                      size);
2048ea44a483c0e98200c058a85ea339457616516847Zhijun He
2049e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    int32_t sensitivity_range[2];
2050e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2051e936796df0426c326d043c2359c149024526f4bcShuzhen Wang    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2052ea44a483c0e98200c058a85ea339457616516847Zhijun He    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2053ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sensitivity_range,
2054ea44a483c0e98200c058a85ea339457616516847Zhijun He                      sizeof(sensitivity_range) / sizeof(int32_t));
20552dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
205673c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
205773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      &gCamCapability[cameraId]->max_analog_sensitivity,
205873c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy                      sizeof(int32_t) );
205973c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2060e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2061e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
206273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy
2063b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    gStaticMetadata[cameraId] = staticInfo.release();
2064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2070662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
2071662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2072662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2073662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2075662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2076662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2077662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
2078662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2079662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
2080662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
2082662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
20860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
20870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*===========================================================================
20880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : makeFPSTable
20890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges
20910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS :
20930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *
20940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/
20950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2096c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang                                          int32_t* fpsRangesTable)
20970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{
20980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    int j = 0;
20990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    for (int i = 0; i < size; i++) {
2100c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2101c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
21020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        j+=2;
21030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
21040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole}
21052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
21062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*===========================================================================
21072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION   : makeOverridesList
21082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides
21102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS :
21122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *
21142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/
21152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                                  uint8_t size, uint8_t* overridesList,
21179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  uint8_t* supported_indexes,
21189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                  int camera_id)
21192dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{
21202dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*daemon will give a list of overrides for all scene modes.
21212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      However we should send the fwk only the overrides for the scene modes
21222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang      supported by the framework*/
21239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    int j = 0, index = 0, supt = 0;
21249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab    uint8_t focus_override;
21252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    for (int i = 0; i < size; i++) {
21269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        supt = 0;
2127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        index = supported_indexes[i];
21289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j] = (uint8_t)overridesTable[index].ae_mode;
21299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
21309443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
21319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                                    overridesTable[index].awb_mode);
21329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        focus_override = (uint8_t)overridesTable[index].af_mode;
21339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
21349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
21359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              supt = 1;
21369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab              break;
21379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           }
21389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
21399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (supt) {
21409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
21419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
21429443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                              focus_override);
21439443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        } else {
21449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
21459443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
21462dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        j+=3;
21472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    }
21482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang}
21492dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
2165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
2166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
2169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2171662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2172662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2173662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2174662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
2175662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2176662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2177662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
2178662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
2179662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
2180662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
2184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2185662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2186662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
21873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION   : getSensorSensitivity
21883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value
21903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor
21923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN    : sensitivity supported by sensor
21943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *
21953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/
21963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
21973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{
21983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    int32_t sensitivity;
21993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
22003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    switch (iso_mode) {
22013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_100:
22023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 100;
22033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_200:
22053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 200;
22063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_400:
22083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 400;
22093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_800:
22113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 800;
22123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    case CAM_ISO_MODE_1600:
22143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = 1600;
22153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    default:
22173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        sensitivity = -1;
22183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        break;
22193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    }
22203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    return sensitivity;
22213fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang}
22223fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
22233fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
22243fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*===========================================================================
2225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
2226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
2231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
2232662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
2233662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
2234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2236662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
2237662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2238662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2239662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2240662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
2241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
2242662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
2243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
2245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
2251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
2252662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
2253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
2254662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
2255662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
2256662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
2257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
2258662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
2259662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
2260662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
2262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2263662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
2264662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
2265662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
2266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
2267662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
2270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
2274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
2275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
2279662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2280662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2282662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
2283662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2284662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2289662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2290662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
2291662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2292662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
2298662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2300d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    for (int i = 0; i < len; i++) {
2301d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang        if (arr[i].hal_name == hal_name)
2302d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang            return arr[i].fwk_name;
2303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2304d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang
2305d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    /* Not able to find matching framework type is not necessarily
2306d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * an error case. This happens when mm-camera supports more attributes
2307d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang     * than the frameworks do */
2308d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGD("%s: Cannot find matching framework type", __func__);
2309d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    return NAME_NOT_FOUND;
2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2311662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2318662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
2326662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
23270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2328662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
2332662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
2333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
23340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    ALOGE("%s: Cannot find matching hal type", __func__);
2335662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
2336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2337662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2338662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
2340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
2342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
2345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
2346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
2348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
2349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
2350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
2352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
2353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
2355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
2357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
2358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2364b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    if (NULL == gStaticMetadata[cameraId]) {
2365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
2366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
2367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
2368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
2369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
2372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
2373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
2374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
2378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
2381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2388e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2389b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang    info->static_camera_characteristics = gStaticMetadata[cameraId];
2390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
2392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
2396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
2400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
2404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
240697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2408e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
2409e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
2411e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
2412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
2413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
2415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
241697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
2417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
2418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
2422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
2424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
2425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
2426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
2443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
24469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
24479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2467e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    static uint8_t focusMode;
2468e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2469e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to auto", __func__);
2470e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2471e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    } else {
2472e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        ALOGE("%s: Setting focus mode to off", __func__);
2473e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2474e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
24752dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
24762dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
24772dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
24782dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
24792dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang
2480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
248647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2489b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    if (gCamCapability[mCameraId]->filter_densities_count) {
249047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2491b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2492b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                        gCamCapability[mCameraId]->filter_densities_count);
2493b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    }
2494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
24959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    float default_focal_length = gCamCapability[mCameraId]->focal_length;
24969a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2499e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2500e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
250580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
250680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
250780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
250880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
250980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
251080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
251180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
251280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
251380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
251480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
251580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
251680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
2517662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id,
2518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                  const camera_metadata_t *settings)
251980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
252080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
252180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
252233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (settings == NULL && mFirstRequest) {
252380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
252480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
252633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2527b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    int32_t hal_version = CAM_HAL_V3;
2528b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang
2529b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
253033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2531b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2532b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang                sizeof(hal_version), &hal_version);
253333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                sizeof(frame_id), &frame_id);
2537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
25410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(settings != NULL){
25431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        rc = translateMetadataToParameters(settings);
254480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
254580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
254780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
254880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
254980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
255080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
255180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
255280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
255480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
255780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
255880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
255980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
256080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
256180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
256280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
256380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
256480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
256580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
256797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    frame_settings = settings;
2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t antibandingMode =
25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(antibandingMode), &antibandingMode);
25760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
257797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
257853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
2579e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        int32_t expCompensation = frame_settings.find(
2580e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
2581e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (expCompensation < gCamCapability[mCameraId]->exposure_time_range[0])
2582e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_time_range[0];
2583e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (expCompensation > gCamCapability[mCameraId]->exposure_time_range[1])
2584e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            expCompensation = gCamCapability[mCameraId]->exposure_time_range[1];
258553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
258653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab          sizeof(expCompensation), &expCompensation);
258753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
258853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab
25890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
25900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeLock), &aeLock);
25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
25940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
25950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        cam_fps_range_t fps_range;
25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.min_fps =
25970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        fps_range.max_fps =
25999443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
26000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
26010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(fps_range), &fps_range);
26020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
260397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
26042b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    float focalDistance = -1.0;
26052b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
26062b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
26072b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
26082b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                CAM_INTF_META_LENS_FOCUS_DISTANCE,
26092b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                sizeof(focalDistance), &focalDistance);
26102b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang    }
26112b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang
26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
26132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        uint8_t fwk_focusMode =
26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
26152b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        uint8_t focusMode;
26162b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
26172b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang            focusMode = CAM_FOCUS_MODE_INFINITY;
26182b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        } else{
26192b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang         focusMode = lookupHalName(FOCUS_MODES_MAP,
26202b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   sizeof(FOCUS_MODES_MAP),
26212b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang                                   fwk_focusMode);
26222b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang        }
26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focusMode), &focusMode);
26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t awbLock =
26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(awbLock), &awbLock);
26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_whiteLevel =
26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(WHITE_BALANCE_MODES_MAP),
26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_whiteLevel);
26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(whiteLevel), &whiteLevel);
26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_effectMode =
26460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
26480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(EFFECT_MODES_MAP),
26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                fwk_effectMode);
26500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
26510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(effectMode), &effectMode);
26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
26550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t fwk_aeMode =
26560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2657e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        uint8_t aeMode;
2658e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t redeye;
26596356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2660e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2661e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_OFF;
2662e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2663e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            aeMode = CAM_AE_MODE_ON;
2664e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
2665e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2666e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 1;
2667e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        } else {
2668e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang            redeye = 0;
2669e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        }
26706356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani
2671e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2672e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                                          sizeof(AE_FLASH_MODE_MAP),
2673f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang                                          fwk_aeMode);
26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(aeMode), &aeMode);
2676e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2677e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(flashMode), &flashMode);
2678e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2679e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang                sizeof(redeye), &redeye);
26800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
26820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
26830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t colorCorrectMode =
26840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc =
26860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                    sizeof(colorCorrectMode), &colorCorrectMode);
26880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2689e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    cam_trigger_t aecTrigger;
2690e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
2691e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    aecTrigger.trigger_id = -1;
26922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
26932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
26942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger =
26950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
26962dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        aecTrigger.trigger_id =
26972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
26991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
27001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole                                sizeof(aecTrigger), &aecTrigger);
27010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    /*af_trigger must come with a trigger id*/
27032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
27042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
27052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        cam_trigger_t af_trigger;
27062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger =
27070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
27082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang        af_trigger.trigger_id =
27092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
27100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
27120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
27150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
27160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
27170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(metaMode), &metaMode);
27189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
27199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
27209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
27219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
27229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                                             fwk_sceneMode);
27239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2724827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
2725827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
2726827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2727827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2728827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab                sizeof(sceneMode), &sceneMode);
2729827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
2730827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2731827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
27329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab                sizeof(sceneMode), &sceneMode);
27339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab        }
27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t demosaic =
27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(demosaic), &demosaic);
27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
27450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
27460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(edgeMode), &edgeMode);
27470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
27500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t edgeStrength =
27510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
2756e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
27576356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        int32_t respectFlashMode = 1;
27586356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
27596356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t fwk_aeMode =
27606356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
27616356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
27626356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                respectFlashMode = 0;
27636356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
27646356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                    __func__);
27656356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            }
27666356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
27676356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        if (respectFlashMode) {
27686356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            uint8_t flashMode =
27696356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
27706356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
27716356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          sizeof(FLASH_MODES_MAP),
27726356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                                          flashMode);
27736356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
27746356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            // To check: CAM_INTF_META_FLASH_MODE usage
27756356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
27766356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani                          sizeof(flashMode), &flashMode);
27776356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani        }
2778e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang    }
2779e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang
27800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
27810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t flashPower =
27820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
27830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
27840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(flashPower), &flashPower);
27850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t flashFiringTime =
27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t geometricMode =
27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
27980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricMode), &geometricMode);
27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
28028867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        uint8_t geometricStrength =
28030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
28040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_GEOMETRIC_STRENGTH,
28060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(geometricStrength), &geometricStrength);
28070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
28100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t hotPixelMode =
28110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
28120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
28130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(hotPixelMode), &hotPixelMode);
28140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
28170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float lensAperture =
28180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
28190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
28200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(lensAperture), &lensAperture);
28210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
28240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float filterDensity =
28250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
28260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
28270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(filterDensity), &filterDensity);
28280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
28310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        float focalLength =
28320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
28330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_FOCAL_LENGTH,
28350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(focalLength), &focalLength);
28360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
28390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t optStabMode =
28400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
28418867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_LENS_OPT_STAB_MODE,
28430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(optStabMode), &optStabMode);
28440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
28470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedMode =
28480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
28498867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_MODE,
28510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedMode), &noiseRedMode);
28520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
28550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t noiseRedStrength =
28560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
28578867984d33ed870071109a4500402dddbc85c048Shuzhen Wang        rc = AddSetParmEntryToBatch(mParameters,
28580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
28590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(noiseRedStrength), &noiseRedStrength);
28600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
286271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    cam_crop_region_t scalerCropRegion;
286371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang    bool scalerCropSet = false;
28640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
28650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.left =
28660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
28670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.top =
28680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
28690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        scalerCropRegion.width =
28700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
287147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang        scalerCropRegion.height =
287247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
28730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SCALER_CROP_REGION,
28750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(scalerCropRegion), &scalerCropRegion);
287671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        scalerCropSet = true;
28770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
28800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorExpTime =
28810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
28820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
28840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorExpTime), &sensorExpTime);
28850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int64_t sensorFrameDuration =
28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
2890e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
2891e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_FRAME_DURATION,
28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorFrameDuration), &sensorFrameDuration);
28950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
28960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
28970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
28980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t sensorSensitivity =
28990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
2900e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity <
2901e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
2902e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
2903e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
2904e936796df0426c326d043c2359c149024526f4bcShuzhen Wang        if (sensorSensitivity >
2905e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
2906e936796df0426c326d043c2359c149024526f4bcShuzhen Wang            sensorSensitivity =
2907e936796df0426c326d043c2359c149024526f4bcShuzhen Wang                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_SENSOR_SENSITIVITY,
29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sensorSensitivity), &sensorSensitivity);
29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        int32_t shadingMode =
29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingMode), &shadingMode);
29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
29210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t shadingStrength =
29220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
29230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
29240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(shadingStrength), &shadingStrength);
29250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
29280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t facedetectMode =
29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_FACEDETECT_MODE,
29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(facedetectMode), &facedetectMode);
29330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
29360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t histogramMode =
29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
29380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_HISTOGRAM_MODE,
29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(histogramMode), &histogramMode);
29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
29440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t sharpnessMapMode =
29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(sharpnessMapMode), &sharpnessMapMode);
29490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t tonemapMode =
29530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters,
29550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                CAM_INTF_META_TONEMAP_MODE,
29560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(tonemapMode), &tonemapMode);
29570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
29580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
29590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
29600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        uint8_t captureIntent =
29610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
29620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                sizeof(captureIntent), &captureIntent);
29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
2965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
296659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
296759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
296871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
296959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
297071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
297171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
297271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
297371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
297471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
297571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
297671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
297759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
297859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
297959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
298059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
298171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
298259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
298371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
298471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
298571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
298671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
298771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
298871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
298971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
299059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
299159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang
299259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
299359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        cam_area_t roi;
299471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        bool reset = true;
299559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
299671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (scalerCropSet) {
299771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            reset = resetIfNeededROI(&roi, &scalerCropRegion);
299871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
299971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        if (reset) {
300071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
300171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang                    sizeof(roi), &roi);
300271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang        }
300359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang    }
3004662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
3005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
3006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
3007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
30080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION   : getJpegSettings
3009662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
30100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL
3011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
3014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
3015662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3016662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
3017662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
3018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
3019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
3020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
3021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
3022662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
3023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
30249a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_timestamp) {
30259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            free(mJpegSettings->gps_timestamp);
30269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_timestamp = NULL;
30279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_coordinates) {
30299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            for (int i = 0; i < 3; i++) {
30309a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                free(mJpegSettings->gps_coordinates[i]);
30319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                mJpegSettings->gps_coordinates[i] = NULL;
30329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            }
30339a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
3034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
3035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
3036662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
3037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
303897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
3039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
3040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
30410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
30420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation =
30430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
30440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
30450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_orientation = 0;
30460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
30480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->jpeg_quality =
30490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
30500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
30511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole        mJpegSettings->jpeg_quality = 85;
30520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
30540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.width =
30550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
30560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->thumbnail_size.height =
30570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
30580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    } else {
305908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.width = 0;
306008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab        mJpegSettings->thumbnail_size.height = 0;
30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
30630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        for (int i = 0; i < 3; i++) {
30649a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
30659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            *(mJpegSettings->gps_coordinates[i]) =
30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
30670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        }
30683fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else{
30699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang       for (int i = 0; i < 3; i++) {
30709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_coordinates[i] = NULL;
30713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        }
30720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
30740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
30759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
30769a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        *(mJpegSettings->gps_timestamp) =
30770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
30789a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
30799a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_timestamp = NULL;
30800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole
30820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
30839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
30849a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        for (int i = 0; i < len; i++) {
30859a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[i] =
30869a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
30879a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
30899a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang            mJpegSettings->gps_processing_method[len] = '\0';
30909a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        }
30919a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang    } else {
30929a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang        mJpegSettings->gps_processing_method[0] = '\0';
30930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
30943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang
30950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
30960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->sensor_sensitivity =
30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
30983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang    } else {
30993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang        mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
31000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
31019a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang
31020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
31030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole        mJpegSettings->lens_focal_length =
31040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
31050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole    }
310653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
310753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab        mJpegSettings->exposure_compensation =
310853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
310953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    }
311053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
31110a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
31127ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->is_jpeg_format = true;
31137ee407aa1024789089aad411c372c79423699976Ajay Dudani    mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask;
311480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
311580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
311680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
311780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
3118e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
3126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
3128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
31291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3130e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
3131e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
3135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
3136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
3137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3139e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
3140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
31437ee407aa1024789089aad411c372c79423699976Ajay Dudani
3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
3148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
3158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3159d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
31671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->initialize(callback_ops);
3168d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
3174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
3181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
3182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
3183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
3186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
3188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3189d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
31961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->configureStreams(stream_list);
3197d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
31981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
3203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
3205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
3211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
3212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
3213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3214d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
3220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
32211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->registerStreamBuffers(buffer_set);
3222d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
32231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
3228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
3230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
3235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
3236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
32379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
32389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
32399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
3240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3242d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
3244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
3245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
3247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
3249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
3250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
325197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
3252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3253d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
3255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
3259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
32679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
32689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
32699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
3270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3271d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
327280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
327380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
327480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
327580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
32769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
327780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
32789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
32791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    int rc = hw->processCaptureRequest(request);
3280d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
32811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole    return rc;
3282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
3286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3295e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3296e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
3297e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
3298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3299d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3301e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3302e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3303e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3304e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3305e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3306e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3307e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
3308d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
3313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
3314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
3316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
3318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
3320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
3321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
3322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
3324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
3325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
3326d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3328e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3329e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3330e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
3331e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
3332e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3333e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
3334e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
3335d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3336e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
3337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
3338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3339e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
3340e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
3341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3342e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
3343e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3344e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
3345e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3346e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
3347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
3348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
3349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
3351d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: E", __func__);
3352e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
3353e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
3354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
3355e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
3356e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
3357e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
3358e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
3359e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
3360e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
3361cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang
3362cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_lock(&mCameraSessionLock);
3363cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    mCameraSessionActive = 0;
3364cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang    pthread_mutex_unlock(&mCameraSessionLock);
3365d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang    ALOGV("%s: X", __func__);
3366e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
3367e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
3368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
33697ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
33707ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : getWaveletDenoiseProcessPlate
33717ee407aa1024789089aad411c372c79423699976Ajay Dudani *
33727ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate
33737ee407aa1024789089aad411c372c79423699976Ajay Dudani *
33747ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None
33757ee407aa1024789089aad411c372c79423699976Ajay Dudani *
33767ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : WNR prcocess plate vlaue
33777ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
33787ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate()
33797ee407aa1024789089aad411c372c79423699976Ajay Dudani{
33807ee407aa1024789089aad411c372c79423699976Ajay Dudani    char prop[PROPERTY_VALUE_MAX];
33817ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(prop, 0, sizeof(prop));
33827ee407aa1024789089aad411c372c79423699976Ajay Dudani    property_get("persist.denoise.process.plates", prop, "0");
33837ee407aa1024789089aad411c372c79423699976Ajay Dudani    int processPlate = atoi(prop);
33847ee407aa1024789089aad411c372c79423699976Ajay Dudani    switch(processPlate) {
33857ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 0:
33867ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
33877ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 1:
33887ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_CBCR_ONLY;
33897ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 2:
33907ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
33917ee407aa1024789089aad411c372c79423699976Ajay Dudani    case 3:
33927ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
33937ee407aa1024789089aad411c372c79423699976Ajay Dudani    default:
33947ee407aa1024789089aad411c372c79423699976Ajay Dudani        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
33957ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
33967ee407aa1024789089aad411c372c79423699976Ajay Dudani}
33977ee407aa1024789089aad411c372c79423699976Ajay Dudani
33987ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
33997ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : needRotationReprocess
34007ee407aa1024789089aad411c372c79423699976Ajay Dudani *
34017ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp
34027ee407aa1024789089aad411c372c79423699976Ajay Dudani *
34037ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none
34047ee407aa1024789089aad411c372c79423699976Ajay Dudani *
34057ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : true: needed
34067ee407aa1024789089aad411c372c79423699976Ajay Dudani *              false: no need
34077ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
34087ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess()
34097ee407aa1024789089aad411c372c79423699976Ajay Dudani{
34107ee407aa1024789089aad411c372c79423699976Ajay Dudani    // TODO: hack here to return false to avoid reprocess
34117ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Need to be enabled after PP is enabled
34127ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
34137ee407aa1024789089aad411c372c79423699976Ajay Dudani
34147ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (!mJpegSettings->is_jpeg_format) {
34157ee407aa1024789089aad411c372c79423699976Ajay Dudani        // RAW image, no need to reprocess
34167ee407aa1024789089aad411c372c79423699976Ajay Dudani        return false;
34177ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34187ee407aa1024789089aad411c372c79423699976Ajay Dudani
34197ee407aa1024789089aad411c372c79423699976Ajay Dudani    if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
34207ee407aa1024789089aad411c372c79423699976Ajay Dudani        mJpegSettings->jpeg_orientation > 0) {
34217ee407aa1024789089aad411c372c79423699976Ajay Dudani        // current rotation is not zero, and pp has the capability to process rotation
34227ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGD("%s: need do reprocess for rotation", __func__);
34237ee407aa1024789089aad411c372c79423699976Ajay Dudani        return true;
34247ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34257ee407aa1024789089aad411c372c79423699976Ajay Dudani
34267ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
34277ee407aa1024789089aad411c372c79423699976Ajay Dudani}
34287ee407aa1024789089aad411c372c79423699976Ajay Dudani
34297ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
34307ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : addOnlineReprocChannel
34317ee407aa1024789089aad411c372c79423699976Ajay Dudani *
34327ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
34337ee407aa1024789089aad411c372c79423699976Ajay Dudani *              coming from input channel
34347ee407aa1024789089aad411c372c79423699976Ajay Dudani *
34357ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS :
34367ee407aa1024789089aad411c372c79423699976Ajay Dudani *   @pInputChannel : ptr to input channel whose frames will be post-processed
34377ee407aa1024789089aad411c372c79423699976Ajay Dudani *
34387ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : Ptr to the newly created channel obj. NULL if failed.
34397ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
34407ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel(
34417ee407aa1024789089aad411c372c79423699976Ajay Dudani                                                      QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle)
34427ee407aa1024789089aad411c372c79423699976Ajay Dudani{
34437ee407aa1024789089aad411c372c79423699976Ajay Dudani    int32_t rc = NO_ERROR;
34447ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCamera3ReprocessChannel *pChannel = NULL;
34457ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (pInputChannel == NULL) {
34467ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: input channel obj is NULL", __func__);
34477ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
34487ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34497ee407aa1024789089aad411c372c79423699976Ajay Dudani
34507ee407aa1024789089aad411c372c79423699976Ajay Dudani    pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
34517ee407aa1024789089aad411c372c79423699976Ajay Dudani            mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle);
34527ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (NULL == pChannel) {
34537ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: no mem for reprocess channel", __func__);
34547ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
34557ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34567ee407aa1024789089aad411c372c79423699976Ajay Dudani
34577ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Capture channel, only need snapshot and postview streams start together
34587ee407aa1024789089aad411c372c79423699976Ajay Dudani    mm_camera_channel_attr_t attr;
34597ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
34607ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
34617ee407aa1024789089aad411c372c79423699976Ajay Dudani    attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue();
34627ee407aa1024789089aad411c372c79423699976Ajay Dudani    rc = pChannel->initialize();
34637ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
34647ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
34657ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
34667ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
34677ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34687ee407aa1024789089aad411c372c79423699976Ajay Dudani
34697ee407aa1024789089aad411c372c79423699976Ajay Dudani    // pp feature config
34707ee407aa1024789089aad411c372c79423699976Ajay Dudani    cam_pp_feature_config_t pp_config;
34717ee407aa1024789089aad411c372c79423699976Ajay Dudani    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
34727ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
34737ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
34747ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.sharpness = 10;
34757ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34767ee407aa1024789089aad411c372c79423699976Ajay Dudani
34777ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (isWNREnabled()) {
34787ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
34797ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.denoise_enable = 1;
34807ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate();
34817ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34827ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (needRotationReprocess()) {
34837ee407aa1024789089aad411c372c79423699976Ajay Dudani        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
34847ee407aa1024789089aad411c372c79423699976Ajay Dudani        int rotation = mJpegSettings->jpeg_orientation;
34857ee407aa1024789089aad411c372c79423699976Ajay Dudani        if (rotation == 0) {
34867ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_0;
34877ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 90) {
34887ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_90;
34897ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 180) {
34907ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_180;
34917ee407aa1024789089aad411c372c79423699976Ajay Dudani        } else if (rotation == 270) {
34927ee407aa1024789089aad411c372c79423699976Ajay Dudani            pp_config.rotation = ROTATE_270;
34937ee407aa1024789089aad411c372c79423699976Ajay Dudani        }
34947ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
34957ee407aa1024789089aad411c372c79423699976Ajay Dudani
34967ee407aa1024789089aad411c372c79423699976Ajay Dudani   rc = pChannel->addReprocStreamsFromSource(pp_config,
34977ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             pInputChannel,
34987ee407aa1024789089aad411c372c79423699976Ajay Dudani                                             mMetadataChannel);
34997ee407aa1024789089aad411c372c79423699976Ajay Dudani
35007ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (rc != NO_ERROR) {
35017ee407aa1024789089aad411c372c79423699976Ajay Dudani        delete pChannel;
35027ee407aa1024789089aad411c372c79423699976Ajay Dudani        return NULL;
35037ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
35047ee407aa1024789089aad411c372c79423699976Ajay Dudani    return pChannel;
35057ee407aa1024789089aad411c372c79423699976Ajay Dudani}
35067ee407aa1024789089aad411c372c79423699976Ajay Dudani
35077ee407aa1024789089aad411c372c79423699976Ajay Dudani/*===========================================================================
35087ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION   : needReprocess
35097ee407aa1024789089aad411c372c79423699976Ajay Dudani *
35107ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if reprocess is needed
35117ee407aa1024789089aad411c372c79423699976Ajay Dudani *
35127ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none
35137ee407aa1024789089aad411c372c79423699976Ajay Dudani *
35147ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN     : true: needed
35157ee407aa1024789089aad411c372c79423699976Ajay Dudani *              false: no need
35167ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/
35177ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needReprocess()
35187ee407aa1024789089aad411c372c79423699976Ajay Dudani{
35197ee407aa1024789089aad411c372c79423699976Ajay Dudani    // TODO: hack here to return false to avoid reprocess
35207ee407aa1024789089aad411c372c79423699976Ajay Dudani    // Need to be enabled after PP is enabled
35217ee407aa1024789089aad411c372c79423699976Ajay Dudani    return false;
35227ee407aa1024789089aad411c372c79423699976Ajay Dudani
35237ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (!mJpegSettings->is_jpeg_format) {
35247ee407aa1024789089aad411c372c79423699976Ajay Dudani        // RAW image, no need to reprocess
35257ee407aa1024789089aad411c372c79423699976Ajay Dudani        return false;
35267ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
35277ee407aa1024789089aad411c372c79423699976Ajay Dudani
35287ee407aa1024789089aad411c372c79423699976Ajay Dudani    if (((gCamCapability[mCameraId]->min_required_pp_mask > 0) ||
35297ee407aa1024789089aad411c372c79423699976Ajay Dudani         isWNREnabled())) {
35307ee407aa1024789089aad411c372c79423699976Ajay Dudani        // TODO: add for ZSL HDR later
35317ee407aa1024789089aad411c372c79423699976Ajay Dudani        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
35327ee407aa1024789089aad411c372c79423699976Ajay Dudani        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
35337ee407aa1024789089aad411c372c79423699976Ajay Dudani        return true;
35347ee407aa1024789089aad411c372c79423699976Ajay Dudani    }
35357ee407aa1024789089aad411c372c79423699976Ajay Dudani
35367ee407aa1024789089aad411c372c79423699976Ajay Dudani    return needRotationReprocess();
35377ee407aa1024789089aad411c372c79423699976Ajay Dudani}
35387ee407aa1024789089aad411c372c79423699976Ajay Dudani
35397ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue()
35407ee407aa1024789089aad411c372c79423699976Ajay Dudani{
35417ee407aa1024789089aad411c372c79423699976Ajay Dudani    return gCamCapability[mCameraId]->min_num_pp_bufs;
35427ee407aa1024789089aad411c372c79423699976Ajay Dudani}
35437ee407aa1024789089aad411c372c79423699976Ajay Dudani
3544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
3545