QCamera3HWI.cpp revision 33cb7276f6c4d2eda72253d11cd9242e1f82bf7d
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;
51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t *gStaticMetadata;
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
53662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
54662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
55662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
56662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
6697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_OFF,            CAM_WB_MODE_OFF },
67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED,    CAM_SCENE_MODE_OFF },
79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
9397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
9797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_AF_MODE_OFF,               CAM_FOCUS_MODE_OFF },
98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AUTO_EXPOSURE_MAP[] = {
11397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    { ANDROID_CONTROL_AE_MODE_OFF,    CAM_AEC_MODE_OFF           },
114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_CONTROL_AE_MODE_ON,     CAM_AEC_MODE_FRAME_AVERAGE },
115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON   },
120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH}
121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole};
122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
14997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mCallbackOps(NULL),
15033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mInputStream(NULL),
15133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mMetadataChannel(NULL),
15233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mFirstRequest(false),
15333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParamHeap(NULL),
15433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang      mParameters(NULL),
15597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      mJpegSettings(NULL)
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
1639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
1649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_init(&mRequestLock, NULL);
1659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
1669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
16933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_init(&mCaptureResultLock, NULL);
17033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
17133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mDefaultMetadata[i] = NULL;
173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
17866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface
179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
18697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (mJpegSettings != NULL) {
18797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        free(mJpegSettings);
18897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        mJpegSettings = NULL;
18997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
19033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    deinitParameters();
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    closeCamera();
192e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
19333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
19433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (mDefaultMetadata[i])
19533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            free_camera_metadata(mDefaultMetadata[i]);
19633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mRequestLock);
198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
199e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
200e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
20133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    pthread_mutex_destroy(&mCaptureResultLock);
202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //int rc = NO_ERROR;
219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (rc == 0)
227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    else
229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
299e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
30133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    rc = initParameters();
30233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (rc < 0) {
30333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: initParamters failed %d", __func__, rc);
30433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang       goto err1;
30533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    }
3069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Create metadata channel and initialize it
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
308e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    mCameraHandle->ops, captureResultCb,
309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    &gCamCapability[mCameraId]->padding_info, this);
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mMetadataChannel == NULL) {
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
3129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        rc = -ENOMEM;
31333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        goto err2;
3149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    rc = mMetadataChannel->initialize();
3169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
3179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: metadata channel initialization failed", __func__);
3189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err3;
3199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
3209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
3259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
3269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3:
3279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    delete mMetadataChannel;
3289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mMetadataChannel = NULL;
32933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangerr2:
33033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    deinitParameters();
3319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
332e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
3339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
35233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    int rc = 0;
353e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
357e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
363e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
370e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT) {
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
380e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* TODO: Clean up no longer used streams, and maintain others if this
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang     * is not the 1st time configureStreams is called */
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
39133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //mMetadataChannel->stop();
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_INPUT:
401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_BIDIRECTIONAL:
405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    GRALLOC_USAGE_HW_CAMERA_WRITE;
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_OUTPUT:
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            default:
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
424e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
425e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream);
426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    if (channel == NULL) {
427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        ALOGE("%s: allocation of channel failed", __func__);
428e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                        pthread_mutex_unlock(&mMutex);
429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        return -ENOMEM;
430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    }
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    newStream->priv = channel;
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                case HAL_PIXEL_FORMAT_BLOB:
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
436e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
437e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream);
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    if (channel == NULL) {
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        ALOGE("%s: allocation of channel failed", __func__);
440e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                        pthread_mutex_unlock(&mMutex);
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        return -ENOMEM;
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    }
44366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                    //Register Jpeg callback with mm-camera-interface
44466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                    rc = channel->initialize();
44566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                    if (rc < 0) {
44666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                        ALOGE("%s: snapshot channel initialization failed", __func__);
44766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                       delete channel;
44866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                       channel = NULL;
44966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                       goto end;
45066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                    }
451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    newStream->priv = channel;
453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                //TODO: Add support for app consumed format?
456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                default:
457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
4669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
46733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    //settings/parameters don't carry over for new configureStreams
4689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
46933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = true;
47033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
47166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruend:
472e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
47333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return rc;
474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
477e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
479e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
48080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
48180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
48280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
48380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
48480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
48580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
48680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
487e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
4889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
48980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
49080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = NO_ERROR;
4919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
4929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
4939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
4949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
4959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
4969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
4979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
4989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
4999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
5019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
5029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
5039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
5049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
5059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
5069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
5079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
5099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
5109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
5119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
5129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
5149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        //TODO
5159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Not supporting input buffer yet", __func__);
5169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
5179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
5199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
5209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
5219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
5229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
5239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
5249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
5259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
5269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
5279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
5289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
5299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
5309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
5319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
5329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
5339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
5349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
5359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
5369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
5379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
5389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
5399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
5409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
5419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
5429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
5439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
5449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
5459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
5469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
5479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
548e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
549e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
553e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
554e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
555e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
556e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
557e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
558e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
560e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
561e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
562e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
563e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
564e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
565e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
567e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
568e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
569e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
570e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
571e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
572e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
575e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
576e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
577e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
578e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
579e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
580e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
581e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
582e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
583e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
584e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
585e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
586e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
587e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
588e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
589e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
590e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
591e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
592e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
593e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (stream->stream_type != CAMERA3_STREAM_OUTPUT) {
594e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: not yet support non output type stream", __func__);
595e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
596e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
597e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
598e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
599e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
600e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
601e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
602e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
603e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
604e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
605e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
606e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
607e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
608e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
609e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
610e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
611e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
612e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
613e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
614e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
615e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
616e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
617e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
618e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
619e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
620e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
621e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
622e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
623e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
624e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    ssize_t idx = 0;
625e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    const camera3_stream_buffer_t *b;
626e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
627e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
628e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
629e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
630e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
631e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
632e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
636e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
638e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = setFrameParameters(request->frame_number, request->settings);
6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
6419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
642e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
6439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
64533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mFirstRequest = false;
6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
648e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
649e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
650e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
65166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        int format = output.stream->format;
65266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
65366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
65466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        //Call function to store local copy of jpeg data for encode params.
65566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = getJpegSettings(request->settings);
65666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            if (rc < 0) {
65766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                ALOGE("%s: failed to get jpeg parameters");
65866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                pthread_mutex_unlock(&mMutex);
65966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                return rc;
66066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            }
66166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
66266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
6719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
6739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
6759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
6769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
6779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
67866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        int format = output.stream->format;
67966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
68066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
6819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
6829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
6839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
6849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
68666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
68766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber, mJpegSettings);
68866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        } else {
68966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru            rc = channel->request(output.buffer, frameNumber);
69066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru        }
6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_lock(&mRequestLock);
6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_wait(&mRequestCond, &mRequestLock);
7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_unlock(&mRequestLock);
7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
703e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
70480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
70580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
70680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
708e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
713e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
714e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(vendor_tag_query_ops_t* ops)
718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(int fd)
739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
75233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result
75333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *              (streams, as well as metadata)
754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
75733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks.
75833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *               NULL if metadata.
7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata,
763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
765e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mCaptureResultLock);
766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_capture_result_t result;
767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (metadata) {
7699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        // Signal to unblock processCaptureRequest
7709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_mutex_lock(&mRequestLock);
7719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        mPendingRequest = 0;
7729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_signal(&mRequestCond);
7739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_mutex_unlock(&mRequestLock);
774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
77533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        int32_t frame_number_valid = *(int32_t *)
77633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
77733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: frame_number_valid = %d", __func__, frame_number_valid);
77833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (!frame_number_valid) {
77933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            ALOGI("%s: Not a valid frame number, used as SOF only", __func__);
78033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            goto done;
78133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        }
782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
78333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        uint32_t frame_number = *(uint32_t *)
78433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
78533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang#if 1
78633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        nsecs_t capture_time = 1000000 * frame_number * 33;
78733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang#else
78833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        nsecs_t capture_time = *(int64_t *)
78933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
79033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang#endif
79133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: notify frame_number = %d, capture_time = %lld", __func__,
79233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang                frame_number, capture_time);
79333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
79433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        /* Send shutter notify */
79533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        camera3_notify_msg_t notify_msg;
79633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        notify_msg.type = CAMERA3_MSG_SHUTTER;
79733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        notify_msg.message.shutter.frame_number = frame_number;
79833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        notify_msg.message.shutter.timestamp = capture_time;
79933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        mCallbackOps->notify(mCallbackOps, &notify_msg);
80033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
80133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        /* send capture result with metadata only */
80297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        result.result = translateCbMetadataToResultMetadata(metadata);
80333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        if (result.result) {
80433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            result.frame_number = frame_number;
805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            result.num_output_buffers = 0;
806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            result.output_buffers = NULL;
807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
80933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            ALOGE("%s: metadata frame_number = %d, capture_time = %ld",
81033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang                    __func__, frame_number, capture_time);
811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            free_camera_metadata((camera_metadata_t*)result.result);
81233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        } else {
81333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            ALOGE("%s: metadata is NULL", __func__);
814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    } else {
816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.result = NULL;
817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.frame_number = frame_number;
818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.num_output_buffers = 1;
819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.output_buffers = buffer;
82033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        ALOGE("%s: result frame_number = %d", __func__, frame_number);
821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        mCallbackOps->process_capture_result(mCallbackOps, &result);
8229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
8239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
82433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangdone:
825e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mCaptureResultLock);
8269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
8279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
82997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
83097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : translateCbMetadataToResultMetadata
83197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
83297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION:
83397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
83497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
83597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @metadata : metadata information from callback
83697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
83797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN     : camera_metadata_t*
83897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *              metadata in a format specified by fwk
83997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
84097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t*
84197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata
84297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                                (metadata_buffer_t *metadata)
84397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
84497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata camMetadata;
84597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camera_metadata_t* resultMetadata;
84697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
84733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang#if 1
84833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    uint32_t frame_number = *(uint32_t *)
84933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
85033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    nsecs_t captureTime = 1000000 * frame_number * 33;
85197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &captureTime, 1);
85233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang#else
85333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    nsecs_t *captureTime = (nsecs_t *)POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
85433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, captureTime, 1);
85533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang#endif
85633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
85797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
85897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_HISTOGRAM - TODO*/
85997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_hist_stats_t  *histogram =
86097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
86197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      metadata);*/
86297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
86397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*face detection*/
86497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
86597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
86697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
86797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceIds[numFaces];
86897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    uint8_t faceScores[numFaces];
86997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceRectangles[numFaces * 4];
87097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t faceLandmarks[numFaces * 6];
87197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int j = 0, k = 0;
87297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < numFaces; i++) {
87397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceIds[i] = faceDetectionInfo->faces[i].face_id;
87497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        faceScores[i] = faceDetectionInfo->faces[i].score;
87597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertRegions(faceDetectionInfo->faces[i].face_boundary,
87697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                faceRectangles+j, -1);
87797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
87897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        j+= 4;
87997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        k+= 6;
88097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
88197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
88297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
88397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
88497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceRectangles, numFaces*4);
88597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
88697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            faceLandmarks, numFaces*6);
88797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
88897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
88997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*autofocus - TODO*/
89097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*cam_auto_focus_data_t  *afData =(cam_auto_focus_data_t *)
89197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      POINTER_OF(CAM_INTF_META_AUTOFOCUS_DATA,metadata);*/
89297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
89397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *color_correct_mode =
89497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
89597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
89697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
89797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_precapture_id =
89897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
89997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
90097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
90197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*aec regions*/
90297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAeRegions =
90397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
90497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeRegions[5];
90597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    convertRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
90697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
90797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
90897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *ae_state =
90997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
91097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
91197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
91297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *focusMode =
91397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
91497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
91597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
91697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*af regions*/
91797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAfRegions =
91897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
91997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afRegions[5];
92097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    convertRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
92197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
92297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
92397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afState = (int32_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
92497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
92597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
92697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *afTriggerId =
92797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
92897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
92997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
93097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *whiteBalance =
93197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
93297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
93397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
93497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*awb regions*/
93597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_area_t  *hAwbRegions =
93697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
93797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbRegions[5];
93897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    convertRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
93997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
94097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
94197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *whiteBalanceState =
94297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
94397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
94497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
94597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *mode = (int32_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
94697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
94797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
94897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *edgeMode = (int32_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
94997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
95097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
95197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *flashPower =
95297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
95397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
95497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
95597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *flashFiringTime =
95697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
95797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
95897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
95997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *ledMode =
96097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
96197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
96297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
96397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *flashState =
96497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
96597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
96697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
96797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *hotPixelMode =
96897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
96997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
97097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
97197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *lensAperture =
97297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
97397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
97497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
97597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *filterDensity =
97697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
97797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
97897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
97997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focalLength =
98097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
98197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
98297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
98397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusDistance =
98497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
98597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
98697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
98797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float  *focusRange =
98897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
98997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
99097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
99197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *opticalStab =
99297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
99397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, opticalStab, 1);
99497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
99597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t  *focusState =
99697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
99797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
99897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
99997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *noiseRedMode =
100097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
100197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
100297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
100397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
100497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
100597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_crop_region_t  *scalerCropRegion = (cam_crop_region_t *)
100697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
100797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SCALER_CROP_REGION,
100897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)scalerCropRegion,
100997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(scalerCropRegion)/sizeof(cam_crop_region_t));
101097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
101197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorExpTime =
101297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
101397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
101497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
101597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorFameDuration =
101697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
101797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
101897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
101997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sensorSensitivity =
102097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
102197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
102297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
102397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t  *sensorTimestamp =
102497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
102597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, sensorTimestamp, 1);
102697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
102797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *shadingMode =
102897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
102997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
103097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
103197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *faceDetectMode =
103297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
103397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
103497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
103597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *histogramMode =
103697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
103797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
103897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
103997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t  *sharpnessMapMode =
104097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        (int32_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
104197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
104297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sharpnessMapMode, 1);
104397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
104497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
104597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
104697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
104797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
104897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            (int32_t*)sharpnessMap->sharpness,
104997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
105097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
105197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    resultMetadata = camMetadata.release();
105233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    return resultMetadata;
105397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
105497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
105597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
105697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertRegions
105797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
105897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
105997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
106097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
106197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @rect   : cam_rect_t struct to convert
106297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @region : int32_t destination array
106397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @weight : if we are converting from cam_area_t, weight is valid
106497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *             else weight = -1
106597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
106697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
106797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertRegions(cam_rect_t rect, int32_t* region, int weight){
106897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[0] = rect.left;
106997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[1] = rect.top;
107097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[2] = rect.width;
107197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    region[3] = rect.height;
107297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    if (weight > -1) {
107397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        region[4] = weight;
107497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
107597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
107697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*===========================================================================
107797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION   : convertLandmarks
107897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
107997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info
108097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
108197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS :
108297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @face   : cam_rect_t struct to convert
108397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *   @landmarks : int32_t destination array
108497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
108597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *
108697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/
108797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
108897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{
108997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[0] = face.left_eye_center.x;
109097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[1] = face.left_eye_center.y;
109197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[2] = face.right_eye_center.y;
109297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[3] = face.right_eye_center.y;
109397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[4] = face.mouth_center.x;
109497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    landmarks[5] = face.mouth_center.y;
109597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole}
109697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
1100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
1102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
1111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
1114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
1115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
1117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
1118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
1119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
1121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1123e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
1124e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
1125e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
1126e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
1127e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
1129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
1131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
1132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
1133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
1136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
1140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
1141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
1143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
1144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
1147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
1149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
1150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
1154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
1155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
1156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
1159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
1160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
1162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
1165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
1166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
1169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
1171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
1172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1176662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : initParameters
1177662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1178662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters
1179662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1180662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1185662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1186662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters()
1187662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1188662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
1189662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1190662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Allocate Set Param Buffer
1191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParamHeap = new QCamera3HeapMemory();
1192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1193662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc != OK) {
1194662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = NO_MEMORY;
1195662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("Failed to allocate SETPARM Heap memory");
1196662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1197662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1198662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1199662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1200662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1201662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    //Map memory for parameters buffer
1202662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1203662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1204662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            mParamHeap->getFd(0),
1205662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            sizeof(parm_buffer_t));
1206662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(rc < 0) {
1207662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:failed to map SETPARM buffer",__func__);
1208662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        rc = FAILED_TRANSACTION;
1209662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap->deallocate();
1210662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        delete mParamHeap;
1211662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mParamHeap = NULL;
1212662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return rc;
1213662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1215662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1216662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
1217662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1219662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
122033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION   : deinitParameters
122133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
122233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters
122333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
122433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS :
122533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *
122633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN     : NONE
122733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/
122833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters()
122933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{
123033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
123133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang            CAM_MAPPING_BUF_TYPE_PARM_BUF);
123233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
123333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap->deallocate();
123433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    delete mParamHeap;
123533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParamHeap = NULL;
123633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
123733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters = NULL;
123833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang}
123933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
124033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*===========================================================================
1241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
1242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
1244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
1250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
1251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
125597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata staticInfo;
1256662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*HAL 3 only*/
1258662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    #ifdef HAL_3_CAPABILITIES
1259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
1260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1);
1261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->focal_lengths,
1267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->focal_lengths_count);
1268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
1272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
1273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
1276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
1277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      (int*)gCamCapability[cameraId]->optical_stab_modes,
1281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
1282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
128380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
128480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
128580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
128680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
128780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
128880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
128980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
129080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
129180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
129380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map,
129480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(gCamCapability[cameraId]->lens_shading_map_size)/ sizeof(cam_dimension_t));
1295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
129680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
129780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                            gCamCapability[cameraId]->geo_correction_map_size.height};
129880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
129980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
130080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
130180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
130280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
130380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
130480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(gCamCapability[cameraId]->geo_correction_map_size)/ sizeof(cam_dimension_t));
130580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
130680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
130780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
130880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
130980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
131080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
131180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
131280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
131380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
131480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
131580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
131680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
131780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                     (int*)&gCamCapability[cameraId]->color_arrangement, 1);
131880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
131980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
132080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
132180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
132280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
132380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
132480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width,
132580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
132680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
132780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      active_array_size, 2);
132880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
132980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
133080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
1331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
133280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
133380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
133480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
133580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
133680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
133780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
133880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
133980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
134080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
134180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
134280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);
134380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
134480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
134580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
134680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
134780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
134880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
134980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
135080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
135180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
135280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
135380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
135480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
135580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
135680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
135780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
135880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
135980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
136080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
136180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
136280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
136380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1364662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t scalar_formats[CAM_FORMAT_MAX];
1365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scalar_format_cnt; i++) {
1366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        scalar_formats[i] = getScalarFormat(gCamCapability[cameraId]->supported_scalar_fmts[i]);
1367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      scalar_formats,
1370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(scalar_formats)/sizeof(int32_t));
1371662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1372662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t available_processed_sizes[CAM_FORMAT_MAX];
1373662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1374662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1375662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_processed_sizes);
1376662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1377662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_processed_sizes,
1378662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                sizeof(available_processed_sizes)/sizeof(int32_t));
1379662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    #else
1380662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const float minFocusDistance = 0;
1381662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
1382662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                    &minFocusDistance, 1);
1383662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1384662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const float hyperFocusDistance = 0;
1385662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1386662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                     &hyperFocusDistance, 1);
1387662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1388662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const float focalLength = 3.30f;
1389662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1390662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &focalLength,
1391662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      1);
1392662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1393662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const float aperture = 2.8f;
1394662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1395662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &aperture,
1396662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      1);
1397662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1398662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const float filterDensity = 0;
1399662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1400662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &filterDensity, 1);
1401662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1402662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t availableOpticalStabilization =
1403662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
1404662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1405662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &availableOpticalStabilization, 1);
1406662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1407662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    float lensPosition[3];
1408662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (facingBack) {
1409662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        // Back-facing camera is center-top on device
1410662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        lensPosition[0] = 0;
1411662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        lensPosition[1] = 20;
1412662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        lensPosition[2] = -5;
1413662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
1414662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        // Front-facing camera is center-right on device
1415662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        lensPosition[0] = 20;
1416662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        lensPosition[1] = 20;
1417662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        lensPosition[2] = 0;
1418662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_POSITION,
1420662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      lensPosition,
1421662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(lensPosition)/ sizeof(float));
1422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t lensShadingMapSize[] = {1, 1};
1424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
1425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      lensShadingMapSize,
1426662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(lensShadingMapSize)/sizeof(int32_t));
1427662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const float lensShadingMap[3 * 1 * 1 ] =
1429662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            { 1.f, 1.f, 1.f };
1430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP,
1431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      lensShadingMap,
1432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(lensShadingMap)/ sizeof(float));
1433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t geometricCorrectionMapSize[] = {2, 2};
1435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
1436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      geometricCorrectionMapSize,
1437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(geometricCorrectionMapSize)/sizeof(int32_t));
1438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const float geometricCorrectionMap[2 * 3 * 2 * 2] = {
1440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            0.f, 0.f,  0.f, 0.f,  0.f, 0.f,
1441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            1.f, 0.f,  1.f, 0.f,  1.f, 0.f,
1442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            0.f, 1.f,  0.f, 1.f,  0.f, 1.f,
1443662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            1.f, 1.f,  1.f, 1.f,  1.f, 1.f};
1444662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
1445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      geometricCorrectionMap,
1446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(geometricCorrectionMap)/ sizeof(float));
1447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const float sensorPhysicalSize[2] = {3.20f, 2.40f};
1449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
1450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sensorPhysicalSize, 2);
1451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const int64_t exposureTimeRange[2] = {1000L, 30000000000L} ; // 1 us - 30 sec
1453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
1454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      exposureTimeRange, 2);
1455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const int64_t frameDurationRange[2] = {33331760L, 30000000000L};
1457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
1458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      frameDurationRange, 1);
1459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const uint8_t colorFilterArrangement =
1461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                         ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB;
1462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &colorFilterArrangement, 1);
1464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1465662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const int resolution[2]  = {640, 480};
1466662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
1467662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      resolution, 2);
1468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
1470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      resolution, 2);
1471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const uint32_t whiteLevel = 4000;
1473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
1474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      (int32_t*)&whiteLevel, 1);
1475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t blackLevelPattern[4] = {
1477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            1000, 1000,
1478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            1000, 1000 };
1479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
1480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      blackLevelPattern, 4);
1481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1482662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int64_t flashChargeDuration = 0;
1483662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
1484662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &flashChargeDuration, 1);
1485662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1486662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t tonemapCurvePoints = 128;
1487662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
1488662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &tonemapCurvePoints, 1);
1489662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1490662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t maxFaceCount = 8;
1491662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1492662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &maxFaceCount, 1);
1493662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1494662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t histogramSize = 64;
1495662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
1496662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &histogramSize, 1);
1497662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1498662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t maxHistogramCount = 1000;
1499662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
1500662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &maxHistogramCount, 1);
1501662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1502662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t sharpnessMapSize[2] = {64, 64};
1503662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
1504662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
1505662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1506662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t maxSharpnessMapValue = 1000;
1507662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
1508662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      &maxSharpnessMapValue, 1);
1509662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1510662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1511662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1512662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      availableVstabModes, sizeof(availableVstabModes));
1513662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1514662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const uint64_t availableRawMinDurations[1] = {33331760L};
1515662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
1516662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      (int64_t*)&availableRawMinDurations,
1517662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                       1);
1518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1519662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const uint32_t availableFormats[4] = {
1520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        HAL_PIXEL_FORMAT_RAW_SENSOR,
1521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        HAL_PIXEL_FORMAT_BLOB,
1522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        HAL_PIXEL_FORMAT_RGBA_8888,
1523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        HAL_PIXEL_FORMAT_YCrCb_420_SP
1524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    };
1525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      (int32_t*)availableFormats,
1527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      4);
1528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    const uint32_t availableProcessedSizes[4] = {640, 480, 320, 240};
1530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      (int32_t*)availableProcessedSizes,
1532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(availableProcessedSizes)/sizeof(int32_t));
1533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      resolution,
1536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                     sizeof(resolution)/sizeof(int));
1537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t availableFaceDetectModes[] = {
1539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      availableFaceDetectModes,
1543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(availableFaceDetectModes));
1544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t availableSceneModes[] = {
1546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED };
1547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            availableSceneModes, sizeof(availableSceneModes));
1550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t availableFpsRanges[] = {15, 30};
1552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            availableFpsRanges, sizeof(availableFpsRanges)/sizeof(int32_t));
1554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t availableEffectsModes[] = {
1556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            ANDROID_CONTROL_EFFECT_MODE_OFF };
1557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            availableEffectsModes, sizeof(availableEffectsModes));
1559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t availableAntibandingModes[] = {
1561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF };
1562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            availableAntibandingModes, sizeof(availableAntibandingModes));
1564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t flashAvailable = 0;
1566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
1567662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            &flashAvailable, sizeof(flashAvailable));
1568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t max3aRegions = 0;
1570662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1571662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            &max3aRegions, 1);
1572662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1573662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const camera_metadata_rational exposureCompensationStep = {
1574662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            1, 3
1575662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    };
1576662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1577662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            &exposureCompensationStep, 1);
1578662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1579662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t jpegThumbnailSizes[] = {
1580662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            0, 0,
1581662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            160, 120,
1582662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            320, 240
1583662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole     };
1584662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
1585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
1586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const int32_t maxZoom = 10;
1588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            &maxZoom, 1);
1590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int64_t jpegMinDuration[] = {33331760L, 30000000000L};
1592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
1593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      jpegMinDuration,
1594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(jpegMinDuration)/sizeof(uint64_t));
1595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    #endif
1596662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole     /*HAL 1 and HAL 3 common*/
1597662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole     static const int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                       gCamCapability[cameraId]->raw_dim.height};
1599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1600662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      raw_size,
1601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(raw_size)/sizeof(uint32_t));
1602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
160380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
160480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
160580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
160680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
160780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
160880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
1609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    uint8_t lensFacing = (facingBack) ?
161080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
161180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t available_jpeg_sizes[MAX_SIZES_CNT];
1614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole              available_jpeg_sizes);
1617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                available_jpeg_sizes,
1619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                sizeof(available_jpeg_sizes)/sizeof(int32_t));
1620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
162197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    static int32_t max_jpeg_size = 0;
162297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int temp_width, temp_height;
162397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
162497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
162597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
162697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        if (temp_width * temp_height > max_jpeg_size ) {
162797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            max_jpeg_size = temp_width * temp_height;
162897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        }
162997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    }
163097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
163197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
163297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole                      &max_jpeg_size, 1);
163397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
1634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t avail_effects[CAM_EFFECT_MODE_MAX];
1635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
1636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        avail_effects[i] = lookupFwkName(EFFECT_MODES_MAP,
1637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         sizeof(EFFECT_MODES_MAP)/sizeof(int),
1638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         gCamCapability[cameraId]->supported_effects[i]);
1639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_effects,
1642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(avail_effects)/sizeof(int32_t));
1643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1645662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
1646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        avail_scene_modes[i] = lookupFwkName(SCENE_MODES_MAP,
1647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         sizeof(SCENE_MODES_MAP)/sizeof(int),
1648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         gCamCapability[cameraId]->supported_scene_modes[i]);
1649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_scene_modes,
1652662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(avail_scene_modes)/sizeof(int32_t));
1653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
1655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
1656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        avail_antibanding_modes[i] = lookupFwkName(ANTIBANDING_MODES_MAP,
1657662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         sizeof(ANTIBANDING_MODES_MAP)/sizeof(int),
1658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         gCamCapability[cameraId]->supported_antibandings[i]);
1659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_antibanding_modes,
1662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(avail_antibanding_modes)/sizeof(int32_t));
1663662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1664662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
1665662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
1666662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        avail_af_modes[i] = lookupFwkName(FOCUS_MODES_MAP,
1667662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         sizeof(FOCUS_MODES_MAP)/sizeof(int),
1668662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         gCamCapability[cameraId]->supported_focus_modes[i]);
1669662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1670662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1671662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_af_modes,
1672662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(avail_af_modes));
1673662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1674662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t avail_awb_modes[CAM_WB_MODE_MAX];
1675662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
1676662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        avail_awb_modes[i] = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1677662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(int),
1678662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         gCamCapability[cameraId]->supported_white_balances[i]);
1679662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1680662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
1681662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_awb_modes,
1682662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(avail_awb_modes)/sizeof(int32_t));
1683662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1684662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static int32_t avail_flash_modes[CAM_FLASH_MODE_MAX];
1685662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
1686662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        avail_flash_modes[i] = lookupFwkName(FLASH_MODES_MAP,
1687662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         sizeof(FLASH_MODES_MAP)/sizeof(int),
1688662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                         gCamCapability[cameraId]->supported_flash_modes[i]);
1689662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1690662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_FLASH_MODE,
1691662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_flash_modes,
1692662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(avail_flash_modes)/sizeof(int32_t));
1693662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1694662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*so far fwk seems to support only 2 aec modes on and off*/
1695662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    static const uint8_t avail_ae_modes[] = {
1696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            ANDROID_CONTROL_AE_MODE_OFF,
1697662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            ANDROID_CONTROL_AE_MODE_ON
1698662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    };
1699662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
1700662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      avail_ae_modes,
1701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                      sizeof(avail_ae_modes));
1702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gStaticMetadata = staticInfo.release();
1704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : makeTable
1709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1710662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes
1711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1712662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1713662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1714662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1715662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1716662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1717662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1718662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
1721662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                          int32_t* sizeTable)
1722662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1723662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int j = 0;
1724662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < size; i++) {
1725662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j] = dimTable[i].width;
1726662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        sizeTable[j+1] = dimTable[i].height;
1727662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        j+=2;
1728662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1729662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1730662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
1731662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : getPreviewHalPixelFormat
1732662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1733662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework
1734662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1735662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend
1736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1737662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN    : format recognized by framework
1738662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1739662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1740662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
1741662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int32_t halPixelFormat;
1743662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1744662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    switch (format) {
1745662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV12:
1746662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
1747662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1748662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21:
1749662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1751662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_NV21_ADRENO:
1752662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
1753662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1754662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_420_YV12:
1755662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
1756662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1757662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV16:
1758662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    case CAM_FORMAT_YUV_422_NV61:
1759662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    default:
1760662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1761662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        break;
1762662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1763662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return halPixelFormat;
1764662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1765662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1766662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
1767662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : AddSetParmEntryToBatch
1768662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1769662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch
1770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1771662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
1772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @p_table     : ptr to parameter buffer
1773662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramType   : parameter type
1774662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramLength : length of parameter value
1775662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @paramValue  : ptr to parameter value
1776662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1777662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1778662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              NO_ERROR  -- success
1779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1780662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1781662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
1782662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          cam_intf_parm_type_t paramType,
1783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          uint32_t paramLength,
1784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                          void *paramValue)
1785662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1786662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int position = paramType;
1787662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int current, next;
1788662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1789662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
1790662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                 Code to take care of linking next flags                *
1791662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
1792662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    current = GET_FIRST_PARAM_ID(p_table);
1793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (position == current){
1794662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        //DO NOTHING
1795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else if (position < current){
1796662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_NEXT_PARAM_ID(position, p_table, current);
1797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        SET_FIRST_PARAM_ID(p_table, position);
1798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    } else {
1799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /* Search for the position in the linked list where we need to slot in*/
1800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        while (position > GET_NEXT_PARAM_ID(current, p_table))
1801662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            current = GET_NEXT_PARAM_ID(current, p_table);
1802662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1803662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        /*If node already exists no need to alter linking*/
1804662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
1805662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            next = GET_NEXT_PARAM_ID(current, p_table);
1806662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(current, p_table, position);
1807662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            SET_NEXT_PARAM_ID(position, p_table, next);
1808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        }
1809662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1810662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1811662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*************************************************************************
1812662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *                   Copy contents into entry                             *
1813662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    *************************************************************************/
1814662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1815662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (paramLength > sizeof(parm_type_t)) {
1816662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s:Size of input larger than max entry size",__func__);
1817662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
1818662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1819662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
1820662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NO_ERROR;
1821662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1822662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupFwkName
1825662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
1827662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
1828662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1829662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
1830662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
1831662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
1832662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @hal_name : name of the hal_parm to map
1833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1834662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int type of status
1835662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              fwk_name  -- success
1836662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1837662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1838662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
1839662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int hal_name)
1840662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1841662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1842662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole   for (int i = 0; i < len; i++) {
1843662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].hal_name == hal_name)
1844662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].fwk_name;
1845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1846662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
1847662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
1850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : lookupHalName
1851662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1852662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend
1853662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              make sure the parameter is correctly propogated
1854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1855662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS  :
1856662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @arr      : map between the two enums
1857662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @len      : len of the map
1858662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @fwk_name : name of the hal_parm to map
1859662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
1860662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : int32_t type of status
1861662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              hal_name  -- success
1862662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              none-zero failure code
1863662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
1864662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
1865662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                             int len, int fwk_name)
1866662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
1867662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < len; i++) {
1868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole       if (arr[i].fwk_name == fwk_name)
1869662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole           return arr[i].hal_name;
1870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
1871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return NAME_NOT_FOUND;
1872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
1873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
1874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
1875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
1893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
1894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gStaticMetadata) {
1901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
1902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
1903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
1904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
1905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
1908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
1909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
1910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
1913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
1914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
1917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
1918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
1919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
1924e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
1925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->static_camera_characteristics = gStaticMetadata;
1926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1928625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1929625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
1932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
1934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
1936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
1939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
1940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
194297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
1943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1945e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
1947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
1948625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
1949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1950625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
1951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
195297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata settings;
1953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
1954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
1955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
1956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
1958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
1960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
1961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
1962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
1963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
1965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
1966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
1968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
1969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
1971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
1972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
1974625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
1975625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1976625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
1977625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
1978625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1980625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
1981625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
19829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
19839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
1984625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1985625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
1986625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
1987625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
1989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
1990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
1992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
1993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
1995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
1996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
1998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
1999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
2004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
2009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_aperture = gCamCapability[mCameraId]->apertures[0];
2010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1);
2014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0];
2016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
2019e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
2022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
202580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
202680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
202780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
202880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
202980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
203080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
203180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
203280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
203380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
203480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
203580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
203680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
2037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id,
2038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                                  const camera_metadata_t *settings)
203980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
204080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
204180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
204233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    if (settings == NULL && mFirstRequest) {
204380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
204480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
204633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
204733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
204833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang
2049662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    /*we need to update the frame number in the parameters*/
2050662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2051662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                sizeof(frame_id), &frame_id);
2052662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (rc < 0) {
2053662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        return BAD_VALUE;
2055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2056662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if(settings != NULL){
205733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang        //rc = translateMetadataToParameters(settings);
205880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
205980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
206033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang    ALOGE("%s: %d", __func__, __LINE__);
2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
206280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
206380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
206480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
206580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
206680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
206780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
206880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
206980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
207080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
207180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
207280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
207380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
207480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
207580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
207680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
207780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
207880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
207980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
208080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int rc = 0;
208297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata frame_settings;
2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    frame_settings = settings;
2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
208597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t antibandingMode =
208697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
208797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
208897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(antibandingMode), &antibandingMode);
208997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
209097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    /*int32_t expCompensation = frame_settings.find().data.i32[0];
209197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      rc = AddSetParmEntryToBatch(mParameters,
209297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      CAM_INTF_PARM_EXPOSURE_COMPENSATION,
209397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole      sizeof(expCompensation), &expCompensation);*/
209497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
209597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.i32[0];
209697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
209797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(aeLock), &aeLock);
209897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
209997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t focusMode =
210097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_AF_MODE).data.i32[0];
210197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
210297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(focusMode), &focusMode);
210397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
210497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t awbLock = frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.i32[0];
210597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
210697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(awbLock), &awbLock);
210797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
210897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t fwk_whiteLevel =
210997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.i32[0];
2110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
211197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(WHITE_BALANCE_MODES_MAP)/ sizeof(int32_t),
211297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            fwk_whiteLevel);
2113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
211497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(whiteLevel), &whiteLevel);
211597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
211697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t fwk_effectMode =
211797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.i32[0];
2118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int effectMode = lookupHalName(EFFECT_MODES_MAP,
211997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(EFFECT_MODES_MAP)/ sizeof(int32_t),
212097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            fwk_effectMode);
2121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
212297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(effectMode), &effectMode);
212397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t fwk_aeMode =
212497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_AE_MODE).data.i32[0];
2125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    int aeMode = lookupHalName(AUTO_EXPOSURE_MAP,
212697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(AUTO_EXPOSURE_MAP)/ sizeof(int32_t),
212797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            fwk_aeMode);
2128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
212997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(aeMode), &aeMode);
2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
213197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t metaFrameNumber =
213297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_REQUEST_FRAME_COUNT).data.i32[0];
213397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
213497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(metaFrameNumber), &metaFrameNumber);
213597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
213697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t colorCorrectMode =
213797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.i32[0];
213897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
213997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(colorCorrectMode), &colorCorrectMode);
2140662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
214197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t aecTrigger =
214297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.i32[0];
214397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters,
214497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
214597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(aecTrigger), &aecTrigger);
214697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
214797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t afTrigger =
214897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.i32[0];
214997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_TRIGGER,
215097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(afTrigger), &afTrigger);
215197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
215297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
215397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.i32[0];
215497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
215597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(metaMode), &metaMode);
215697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
215797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
215897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t demosaic = frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
215997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
216097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(demosaic), &demosaic);
216197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
216297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
216397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
216497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(edgeMode), &edgeMode);
216597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
216697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
216797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t edgeStrength =
216897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
216997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHARPNESS_STRENGTH,
217097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(edgeStrength), &edgeStrength);
217197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
217297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t flashPower =
217397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
217497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
217597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(flashPower), &flashPower);
217697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
217797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t flashFiringTime =
217897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
217997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_FIRING_TIME,
218097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(flashFiringTime), &flashFiringTime);
218197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
218297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t geometricMode =
218397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
218497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
218597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(geometricMode), &geometricMode);
218697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
218797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t geometricStrength =
218897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
218997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_STRENGTH,
219097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(geometricStrength), &geometricStrength);
219197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
219297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t hotPixelMode =
219397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
219497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
219597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(hotPixelMode), &hotPixelMode);
219697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
219797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
219897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float lensAperture =
219997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
220097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
220197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(lensAperture), &lensAperture);
220297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
220397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
220497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float filterDensity =
220597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
220697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
220797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(filterDensity), &filterDensity);
220897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
220997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
221097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float focalLength =
221197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
221297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FOCAL_LENGTH,
221397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(focalLength), &focalLength);
221497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
221597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    float focalDistance =
221697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
221797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FOCUS_DISTANCE,
221897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(focalDistance), &focalDistance);
221997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
222097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t optStabMode =
222197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
222297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_OPT_STAB_MODE,
222397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(optStabMode), &optStabMode);
222497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
222597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t noiseRedMode =
222697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
222797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_NOISE_REDUCTION_MODE,
222897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(noiseRedMode), &noiseRedMode);
222997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
223097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t noiseRedStrength =
223197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
223297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters,
223397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
223497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(noiseRedStrength), &noiseRedStrength);
223597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
223697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    cam_crop_region_t scalerCropRegion;
223797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    scalerCropRegion.left =
223897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
223997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    scalerCropRegion.top =
224097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
224197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    scalerCropRegion.width =
224297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
224397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SCALER_CROP_REGION,
224497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(scalerCropRegion), &scalerCropRegion);
224597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
224697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t sensorExpTime =
224797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
224897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SENSOR_EXPOSURE_TIME,
224997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(sensorExpTime), &sensorExpTime);
225097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
225197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int64_t sensorFrameDuration =
225297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
225397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters,
225497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_INTF_META_SENSOR_FRAME_DURATION,
225597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(sensorFrameDuration), &sensorFrameDuration);
225697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
225797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t sensorSensitivity =
225897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
225997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SENSOR_SENSITIVITY,
226097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(sensorSensitivity), &sensorSensitivity);
226197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
226297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t shadingMode = frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
226397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
226497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(shadingMode), &shadingMode);
226597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
226697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t shadingStrength =
226797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
226897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
226997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(shadingStrength), &shadingStrength);
227097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
227197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t facedetectMode =
227297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
227397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters,
227497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_INTF_META_STATS_FACEDETECT_MODE,
227597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(facedetectMode), &facedetectMode);
227697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
227797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t histogramMode =
227897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
227997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STATS_HISTOGRAM_MODE,
228097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(histogramMode), &histogramMode);
228197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
228297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t sharpnessMapMode =
228397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
228497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters,
228597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
228697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(sharpnessMapMode), &sharpnessMapMode);
228797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
228897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t tonemapMode = frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
228997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_TONEMAP_MODE,
229097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(tonemapMode), &tonemapMode);
229197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole
229297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    int32_t captureIntent =
229397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole        frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.i32[0];
2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
229597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole            sizeof(captureIntent), &captureIntent);
2296662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    return rc;
2298662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}
2299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*===========================================================================
2301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION   : translateMetadataToParameters
2302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
2304662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2305662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2306662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS :
2307662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *   @settings  : frame settings information from framework
2308662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *
2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN     : success: NO_ERROR
2311662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *              failure:
2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/
2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings
2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole                                  (const camera_metadata_t *settings)
2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{
2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    if (mJpegSettings) {
2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        free(mJpegSettings);
2318662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings = NULL;
2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
232197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    CameraMetadata jpeg_settings;
2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    jpeg_settings = settings;
2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole
2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->jpeg_orientation =
2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
2326662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->jpeg_quality =
2327662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
2328662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->thumbnail_size.height =
2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->thumbnail_size.height =
2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
2332662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    for (int i = 0; i < 3; i++) {
2333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        mJpegSettings->gps_coordinates[i] =
2334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.d[i];
2335662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    }
2336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->gps_timestamp =
2337662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
2338662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->gps_processing_method =
2339662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[0];
2340662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->sensor_sensitivity =
2341662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
2342662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole    mJpegSettings->lens_focal_length =
2343662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole        jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
234480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
234580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
234680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
234780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
2348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
2349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
2351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
2354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
2355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
2356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
2358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2359e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata,
2360e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
2361e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
2364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
2365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
2366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
2367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
2370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
2371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
2375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
2386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
2387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->initialize(callback_ops);
2396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
2400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
2407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
2408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
2409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
2412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
2413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
2414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->configureStreams(stream_list);
2422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
2426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
2428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
2442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->registerStreamBuffers(buffer_set);
2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
2455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
2456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
24579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
24589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
24599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
2460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
2463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
2464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
2466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
2468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
2469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
247097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole    fwk_metadata = hw->translateCapabilityToMetadata(type);
2471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
2473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
2477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
24859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
24869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
24879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
2488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
248980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
249080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
249180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
249280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
24939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
249480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
24959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
24969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return hw->processCaptureRequest(request);
2497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
2501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2510e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
2511e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
2512e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
2513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2514e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
2515e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2516e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
2517e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2518e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
2519e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
2520e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2521e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
2522e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
2523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
2526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
2527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
2529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
2531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
2533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
2534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
2535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2536e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
2537e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
2538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2539e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
2540e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2541e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
2542e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
2543e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
2544e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
2545e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2546e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
2547e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
2548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
2549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
2550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
2551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
2552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2553e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
2554e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2555e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
2556e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2557e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
2558e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
2559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
2560e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
2561e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
2562e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
2563e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
2564e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
2565e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
2566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
2567e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
2568e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
2569e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
2570e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
2571e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
2572e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
2573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
2575