QCamera3HWI.cpp revision e6ab32d89cf169705236988f0f74309f914c88b7
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"
43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang//using namespace android;
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
53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
54625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
55625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
57625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
58625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
59625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
60625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
61625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
62625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
63625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
64625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
65625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
66625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
67625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
68625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
69625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
70625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
71625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
72625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
73625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
74625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
75625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
76625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
77625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
78625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
79625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCallbackOps(NULL)
80625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
81625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
82e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
83e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mCameraDevice.common.close = close_camera_device;
84625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
85625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
86625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_init(&mRequestLock, NULL);
899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_cond_init(&mRequestCond, NULL);
909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 0;
91e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
92e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_init(&mMutex, NULL);
93625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
94625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
95625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
96625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
97625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
98625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera2HardwareInterface
99625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    closeCamera();
107e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
108e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mRequestLock);
109e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_cond_destroy(&mRequestCond);
110e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
111e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_destroy(&mMutex);
112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //int rc = NO_ERROR;
129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (rc == 0)
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    else
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : sendCaptureResult
195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: send completed capture result metadata buffer along with possibly
197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              completed output stream buffers to the framework
198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::sendCaptureResult(const struct camera3_callback_ops *,
204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                                 const camera3_capture_result_t *result)
205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //TODO - Implement
207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : notify
211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Asynchronous notification callback to framework
213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::notify(const struct camera3_callback_ops *,
222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                       const camera3_notify_msg_t *msg)
223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //TODO - Implement
225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
2429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    int rc;
243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
244e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
245e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
2469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Create metadata channel and initialize it
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
248e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    mCameraHandle->ops, captureResultCb,
249e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    &gCamCapability[mCameraId]->padding_info, this);
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mMetadataChannel == NULL) {
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
2529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        rc = -ENOMEM;
2539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err1;
2549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
2559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    rc = mMetadataChannel->initialize();
2569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
2579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: metadata channel initialization failed", __func__);
2589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err2;
2599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
2609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
2619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Initialize parameter heap and structure */
2629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mParamHeap = new QCamera3HeapMemory();
2639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (mParamHeap == NULL) {
2649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: creation of mParamHeap failed", __func__);
2659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err2;
266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
2689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
2699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: allocation of mParamHeap failed", __func__);
2709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err3;
2719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
2729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
2739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                CAM_MAPPING_BUF_TYPE_PARM_BUF,
2749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                mParamHeap->getFd(0), sizeof(parm_buffer_t));
2759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
2769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: map_buf failed for mParamHeap", __func__);
2779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        goto err4;
2789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
2799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mParameters = (parm_buffer_t *)DATA_PTR(mParamHeap, 0);
2809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
2819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mCallbackOps = callback_ops;
282e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
283e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return 0;
2859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
2869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr4:
2879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mParamHeap->deallocate();
2889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3:
2899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    delete mParamHeap;
2909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mParamHeap = NULL;
2919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr2:
2929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    delete mMetadataChannel;
2939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mMetadataChannel = NULL;
2949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1:
295e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
2969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return rc;
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
319e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
332e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT) {
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
342e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                pthread_mutex_unlock(&mMutex);
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* TODO: Clean up no longer used streams, and maintain others if this
351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang     * is not the 1st time configureStreams is called */
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
3539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mMetadataChannel->stop();
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_INPUT:
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_BIDIRECTIONAL:
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    GRALLOC_USAGE_HW_CAMERA_WRITE;
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_OUTPUT:
372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            default:
376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
386e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
387e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream);
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    if (channel == NULL) {
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        ALOGE("%s: allocation of channel failed", __func__);
390e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                        pthread_mutex_unlock(&mMutex);
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        return -ENOMEM;
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    }
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    newStream->priv = channel;
395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                case HAL_PIXEL_FORMAT_BLOB:
397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
398e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            mCameraHandle->ops, captureResultCb,
399e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                            &gCamCapability[mCameraId]->padding_info, this, newStream);
400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    if (channel == NULL) {
401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        ALOGE("%s: allocation of channel failed", __func__);
402e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                        pthread_mutex_unlock(&mMutex);
403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        return -ENOMEM;
404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    }
405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    newStream->priv = channel;
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                //TODO: Add support for app consumed format?
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                default:
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
4209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
4219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Cannot reuse settings across configure call
4229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    memset(mParameters, 0, sizeof(parm_buffer_t));
423e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return 0;
425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
428e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : validateCaptureRequest
429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
430e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service
43180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
43280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
43380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @request : request from framework to process
43480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
43580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     :
43680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
43780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
438e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest(
4399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
44080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
44180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = NO_ERROR;
4429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    ssize_t idx = 0;
4439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    const camera3_stream_buffer_t *b;
4449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    CameraMetadata meta;
4459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
4469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    /* Sanity check the request */
4479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request == NULL) {
4489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: NULL capture request", __func__);
4499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
4509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
4519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
4529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    uint32_t frameNumber = request->frame_number;
4539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL &&
4549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            request->input_buffer->stream != mInputStream) {
4559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: Input buffer not from input stream!",
4569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
4579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
4589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
4599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
4609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Request %d: No output buffers provided!",
4619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                __FUNCTION__, frameNumber);
4629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
4639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
4649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (request->input_buffer != NULL) {
4659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        //TODO
4669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: Not supporting input buffer yet", __func__);
4679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return BAD_VALUE;
4689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
4699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
4709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Validate all buffers
4719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    b = request->output_buffers;
4729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    do {
4739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel =
4749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                static_cast<QCamera3Channel*>(b->stream->priv);
4759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
4769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
4779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
4789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
4799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
4809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
4819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
4829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
4839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
4849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
4859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->release_fence != -1) {
4869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
4879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
4889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
4899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
4909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (b->buffer == NULL) {
4919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
4929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    __func__, frameNumber, idx);
4939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            return BAD_VALUE;
4949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
4959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        idx++;
4969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        b = request->output_buffers + idx;
4979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    } while (idx < (ssize_t)request->num_output_buffers);
4989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
499e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
500e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
501e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
502e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
503e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : registerStreamBuffers
504e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
505e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
506e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
507e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
508e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @stream_list : streams to be configured
509e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
510e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
511e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
512e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
513e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
514e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
515e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
516e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = 0;
517e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
518e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
519e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
520e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set == NULL) {
521e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
522e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
523e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
524e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
525e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->stream == NULL) {
526e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
527e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
528e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
529e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
530e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->num_buffers < 1) {
531e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
532e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
533e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
534e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
535e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (buffer_set->buffers == NULL) {
536e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
537e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
538e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
539e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
540e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
541e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_stream_t *stream = buffer_set->stream;
542e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
543e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
544e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (stream->stream_type != CAMERA3_STREAM_OUTPUT) {
545e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: not yet support non output type stream", __func__);
546e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
547e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -EINVAL;
548e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
549e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc < 0) {
551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
553e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return -ENODEV;
554e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
555e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
556e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
557e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return NO_ERROR;
558e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
560e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
561e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : processCaptureRequest
562e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
563e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service
564e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
565e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @request : request from framework to process
567e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
568e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
569e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
570e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
571e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest(
572e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                    camera3_capture_request_t *request)
573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int rc = NO_ERROR;
575e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    ssize_t idx = 0;
576e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    const camera3_stream_buffer_t *b;
577e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    CameraMetadata meta;
578e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
579e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
580e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
581e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    rc = validateCaptureRequest(request);
582e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (rc != NO_ERROR) {
583e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: incoming request is not valid", __func__);
584e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
585e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return rc;
586e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
587e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
588e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    uint32_t frameNumber = request->frame_number;
589e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
59080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    rc = setFrameParameters(request->settings);
5919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    if (rc < 0) {
5929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        ALOGE("%s: fail to set frame parameters", __func__);
593e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
5949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return rc;
5959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
5969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
597e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    // Acquire all request buffers first
598e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
599e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
600e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        sp<Fence> acquireFence = new Fence(output.acquire_fence);
601e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
602e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (rc != OK) {
603e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            ALOGE("%s: fence wait failed %d", __func__, rc);
604e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            pthread_mutex_unlock(&mMutex);
605e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            return rc;
606e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
607e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
608e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
6099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Notify metadata channel we receive a request
610e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    mMetadataChannel->request(NULL, frameNumber);
6119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    // Call request on other streams
6139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    for (size_t i = 0; i < request->num_output_buffers; i++) {
6149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        const camera3_stream_buffer_t& output = request->output_buffers[i];
6159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
6169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (channel == NULL) {
6179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: invalid channel pointer for stream", __func__);
6189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            continue;
6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        }
6209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
621e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        rc = channel->request(output.buffer, frameNumber);
6229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        if (rc < 0)
6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            ALOGE("%s: request failed", __func__);
6249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
6269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    //Block on conditional variable
6279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_lock(&mRequestLock);
6289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    mPendingRequest = 1;
6299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    while (mPendingRequest == 1) {
6309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_wait(&mRequestCond, &mRequestLock);
6319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
6329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    pthread_mutex_unlock(&mRequestLock);
6339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
63580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
63680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
63780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
6389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*===========================================================================
639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : getMetadataVendorTagOps
6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
6429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
6439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS :
644e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
645e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
646e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
648e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(vendor_tag_query_ops_t* ops)
649e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
650e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /* Enable locks when we eventually add Vendor Tags */
651e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
652e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
653e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
654e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : dump
661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(int fd)
670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*Enable lock when we implement this function*/
672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    /*
673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    */
677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
681e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
682e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
683e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Callback handler for all capture result (streams, as well as metadata)
684e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
685e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
686e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @metadata : metadata information
687e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *   @buffer   : actual gralloc buffer to be returned to frameworks. NULL if metadata.
6889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *
6899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN     : NONE
6909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/
691e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata,
692e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer, uint32_t frame_number)
6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{
694e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mCaptureResultLock);
695e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    camera3_capture_result_t result;
696e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
697e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
698e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (metadata) {
6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        // Signal to unblock processCaptureRequest
7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_mutex_lock(&mRequestLock);
7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        mPendingRequest = 0;
7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_cond_signal(&mRequestCond);
7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        pthread_mutex_unlock(&mRequestLock);
704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
705e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        //TODO: Add translation from metadata_buffer_t to CameraMetadata
706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        // for now, hardcode timestamp only.
707e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        CameraMetadata camMetadata;
708e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        uint32_t *frame_number = (uint32_t *)POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
709e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        nsecs_t captureTime = 1000000 * (*frame_number) * 33;
710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &captureTime, 1);
711e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
712e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.result = camMetadata.release();
713e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        if (!result.result) {
714e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            result.frame_number = *frame_number;
715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            result.num_output_buffers = 0;
716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            result.output_buffers = NULL;
717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            mCallbackOps->process_capture_result(mCallbackOps, &result);
718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            free_camera_metadata((camera_metadata_t*)result.result);
720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        }
721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    } else {
722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.result = NULL;
723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.frame_number = frame_number;
724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.num_output_buffers = 1;
725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        result.output_buffers = buffer;
726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        mCallbackOps->process_capture_result(mCallbackOps, &result);
7279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    }
7289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mCaptureResultLock);
7309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return;
7319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang}
7329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (capabilityHeap == NULL) {
761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: creation of capabilityHeap failed", __func__);
762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        goto heap_creation_failed;
763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete capabilityHeap;
804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed:
805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    android::CameraMetadata staticInfo;
827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1);
830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->focal_lengths,
836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->focal_lengths_count);
837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      (int*)gCamCapability[cameraId]->optical_stab_modes,
850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
85280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
85380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      gCamCapability[cameraId]->lens_position,
85480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
85580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
85680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
85780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
85880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
85980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      lens_shading_map_size,
86080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      sizeof(lens_shading_map_size)/sizeof(int32_t));
861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
86280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map,
86380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(gCamCapability[cameraId]->lens_shading_map_size)/ sizeof(cam_dimension_t));
864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
86580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
86680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                            gCamCapability[cameraId]->geo_correction_map_size.height};
86780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
86880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            geo_correction_map_size,
86980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(geo_correction_map_size)/sizeof(int32_t));
87080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
87180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
87280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       gCamCapability[cameraId]->geo_correction_map,
87380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(gCamCapability[cameraId]->geo_correction_map_size)/ sizeof(cam_dimension_t));
87480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
87580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
87680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->sensor_physical_size, 2);
87780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
87880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
87980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->exposure_time_range, 2);
88080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
88180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
88280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_frame_duration, 1);
88380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
88480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
88580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
88680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                     (int*)&gCamCapability[cameraId]->color_arrangement, 1);
88780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
88880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
88980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                               gCamCapability[cameraId]->pixel_array_size.height};
89080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
89180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      pixel_array_size, 2);
89280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
89380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width,
89480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->active_array_size.height};
89580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
89680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      active_array_size, 2);
89780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
89880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
89980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->white_level, 1);
900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
90180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
90280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            gCamCapability[cameraId]->black_level_pattern, 4);
90380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
90480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
90580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->flash_charge_duration, 1);
90680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
90780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
90880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
90980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
91080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
91180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);
91280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
91380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
91480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->histogram_size, 1);
91580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
91680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
91780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_histogram_count, 1);
91880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
91980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
92080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                gCamCapability[cameraId]->sharpness_map_size.height};
92180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
92280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
92380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
92480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
92580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
92680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
92780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
92880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
92980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
93080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                      &gCamCapability[cameraId]->raw_min_duration,
93180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                       1);
93280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
93380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
93480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                                        gCamCapability[cameraId]->exposure_compensation_max};
93580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
93680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            exposureCompensationRange,
93780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            sizeof(exposureCompensationRange)/sizeof(int32_t));
93880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
93980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    uint8_t lensFacing = (gCamCapability[cameraId]->position == CAM_POSITION_BACK) ?
94080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
94180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gStaticMetadata = staticInfo.release();
944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
947625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
948625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
950625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gStaticMetadata) {
974625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
975625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
976625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
977625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
978625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
980625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
981625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
982625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
983625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
984625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
985625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
986625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
987625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
997e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->static_camera_characteristics = gStaticMetadata;
999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
1001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
1005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
1007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
1009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
1012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
1013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera_metadata_t* QCamera3HardwareInterface::translateMetadata(int type)
1016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1017e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_lock(&mMutex);
1018e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
1020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        pthread_mutex_unlock(&mMutex);
1021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
1022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
1024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
1025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    android::CameraMetadata settings;
1026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
1027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
1028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
1029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1030625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
1031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1032625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
1033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
1034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
1035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
1036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
1038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
1039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
1041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
1042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
1044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
1045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
1047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
1048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
1050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
1051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
1052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
1054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
10559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
10569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
1057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
1059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
1060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
1062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
1063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
1065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
1066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
1068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
1069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
1071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
1072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1073625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
1074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
1075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
1077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
1078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
1079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
1082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_aperture = gCamCapability[mCameraId]->apertures[0];
1083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
1084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
1086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1);
1087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0];
1089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
1090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
1092e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1093e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    pthread_mutex_unlock(&mMutex);
1094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
1095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
109880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : setFrameParameters
109980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
110080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from
110180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              framework
110280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
110380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
110480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
110580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
110680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
110780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
110880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
110980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
111080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(const camera_metadata_t *settings)
111180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
111280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*translate from camera_metadata_t type to parm_type_t*/
111380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    int rc = 0;
111480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    android::CameraMetadata frame_settings;
111580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (settings == NULL && prevSettings == NULL) {
111680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*settings cannot be null for the first request*/
111780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        return BAD_VALUE;
111880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    } else if (settings == NULL) {
111980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        /*do nothing? we have already configured the settings previously*/
112080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    } else{
112180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        //reset the prevSettings
112280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        if (prevSettings != NULL) {
112380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            free(prevSettings);
112480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang            prevSettings = NULL;
112580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        }
112680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        rc = translateMetadataToParameters(settings);
112780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
112880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    /*set the parameters to backend*/
112980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return rc;
113080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
113180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
113280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
113380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION   : translateMetadataToParameters
113480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
113580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
113680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
113780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
113880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS :
113980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *   @settings  : frame settings information from framework
114080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
114180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *
114280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN     : success: NO_ERROR
114380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *              failure:
114480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/
114580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters
114680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang                                  (const camera_metadata_t *settings)
114780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{
114880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    return 0;
114980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang}
115080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang
115180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*===========================================================================
1152e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : captureResultCb
1153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
1155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
1158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
1159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
1160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
1162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata,
1164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                camera3_stream_buffer_t *buffer,
1165e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                uint32_t frame_number, void *userdata)
1166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
1168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
1169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
1170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
1171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->captureResultCb(metadata, buffer, frame_number);
1174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
1175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
1179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
1181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
1186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
1187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
1190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
1191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
1193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
1194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
1195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
1196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
1197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->initialize(callback_ops);
1200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
1204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
1206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
1211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
1212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
1213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
1216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
1217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
1218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
1220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
1221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
1222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
1223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
1224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->configureStreams(stream_list);
1226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
1230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
1232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
1236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
1238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
1239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
1240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
1242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
1243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
1244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
1245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
1246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->registerStreamBuffers(buffer_set);
1248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
1252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
1254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
1259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
1260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
12619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::
12629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    construct_default_request_settings(const struct camera3_device *device,
12639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                                        int type)
1264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
1267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
1268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
1269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
1270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
1271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
1272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
1273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    fwk_metadata = hw->translateMetadata(type);
1275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
1277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
1281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
1283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
1288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
12899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request(
12909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    const struct camera3_device *device,
12919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang                    camera3_capture_request_t *request)
1292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
129380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    QCamera3HardwareInterface *hw =
129480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
129580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    if (!hw) {
129680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang        ALOGE("%s: NULL camera device", __func__);
12979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang        return -EINVAL;
129880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang    }
12999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang
13009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang    return hw->processCaptureRequest(request);
1301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
1305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
1307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
1312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
1315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device,
1316e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                vendor_tag_query_ops_t* ops)
1317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1318e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
1319e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
1320e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
1321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
1322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
1323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->getMetadataVendorTagOps(ops);
1326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
1330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
1331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
1333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
1335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
1337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
1338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
1339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1340e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(
1341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang                const struct camera3_device *device, int fd)
1342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
1343e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
1344e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
1345e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
1346e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
1347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return;
1348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    hw->dump(fd);
1351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return;
1352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
1353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
1354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*===========================================================================
1355e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION   : close_camera_device
1356e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1357e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION:
1358e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1359e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS :
1360e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1361e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *
1362e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN     :
1363e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/
1364e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
1365e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{
1366e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    int ret = NO_ERROR;
1367e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    QCamera3HardwareInterface *hw =
1368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(
1369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang            reinterpret_cast<camera3_device_t *>(device)->priv);
1370e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    if (!hw) {
1371e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        ALOGE("NULL camera device");
1372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang        return BAD_VALUE;
1373e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    }
1374e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    delete hw;
1375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang    return ret;
1376e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang}
1377e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1378e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang
1379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
1380