QCamera3HWI.cpp revision 625515beb9c1347216a2d261930ceb0d85ba1c47
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>
38625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h>
39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h"
40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h"
41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h"
42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android;
44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang//using namespace android;
46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera {
47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t *gStaticMetadata;
50625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    initialize:                         QCamera3HardwareInterface::initialize,
54625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    configure_streams:                  QCamera3HardwareInterface::configure_streams,
55625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
57625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
58625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
59625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    dump:                               QCamera3HardwareInterface::dump,
60625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang};
61625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
62625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
63625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
64625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : QCamera3HardwareInterface
65625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
66625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface
67625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
68625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
69625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera ID
70625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
71625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
72625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
73625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
74625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    : mCameraId(cameraId),
75625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraHandle(NULL),
76625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCameraOpened(false),
77625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      mCallbackOps(NULL)
78625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
79625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
80625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_2_0;
81625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //mCameraDevice.common.close = close_camera_device;
82625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.ops = &mCameraOps;
83625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraDevice.priv = this;
84625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId]->version = CAM_HAL_V3;
85625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
86625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
87625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
88625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : ~QCamera3HardwareInterface
89625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
90625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera2HardwareInterface
91625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
92625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
93625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
94625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : none
95625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
96625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface()
97625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
98625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    closeCamera();
99625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @hw_device  : double ptr for camera device struct
108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //int rc = NO_ERROR;
116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraOpened) {
118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return PERMISSION_DENIED;
120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = openCamera();
123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (rc == 0)
124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = &mCameraDevice.common;
125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    else
126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        *hw_device = NULL;
127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : openCamera
132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera
134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera()
142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mCameraHandle) {
144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("Failure: Camera already opened");
145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return ALREADY_EXISTS;
146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = camera_open(mCameraId);
148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!mCameraHandle) {
149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("camera_open failed.");
150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return UNKNOWN_ERROR;
151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = true;
154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : closeCamera
160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera
162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none
164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera()
170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = NO_ERROR;
172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraHandle = NULL;
175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCameraOpened = false;
176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : sendCaptureResult
182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: send completed capture result metadata buffer along with possibly
184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              completed output stream buffers to the framework
185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::sendCaptureResult(const struct camera3_callback_ops *,
191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                                 const camera3_capture_result_t *result)
192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //TODO - Implement
194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : notify
198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Asynchronous notification callback to framework
200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::notify(const struct camera3_callback_ops *,
209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                       const camera3_notify_msg_t *msg)
210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //TODO - Implement
212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions
219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @callback_ops : callback function to frameworks
222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(
227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_callback_ops *callback_ops)
228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mCallbackOps = callback_ops;
230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //TODO:Create metadata channel and initialize it
232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        mCameraHandle->ops, channelCbRoutine);
234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mMetadataChannel == NULL) {
235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to allocate metadata channel", __func__);
236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENOMEM;
237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mMetadataChannel->initialize();
239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configureStreams
243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              and output streams.
246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams(
254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *streamList)
255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    // Sanity check stream_list
257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList == NULL) {
258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream configuration", __func__);
259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->streams == NULL) {
263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL stream list", __func__);
264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (streamList->num_streams < 1) {
268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Bad number of streams requested: %d", __func__,
269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                streamList->num_streams);
270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return BAD_VALUE;
271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera3_stream_t *inputStream = NULL;
274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->stream_type == CAMERA3_STREAM_INPUT) {
277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (inputStream != NULL) {
278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Multiple input streams requested!", __func__);
279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                return BAD_VALUE;
280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            inputStream = newStream;
282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mInputStream = inputStream;
285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* TODO: Clean up no longer used streams, and maintain others if this
287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang     * is not the 1st time configureStreams is called */
288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* TODO: Reconstruct/reset metadata stream/channel */
290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate channel objects for the requested streams */
292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < streamList->num_streams; i++) {
293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *newStream = streamList->streams[i];
294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (newStream->priv == NULL) {
295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //New stream, construct channel
296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            switch (newStream->stream_type) {
298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_INPUT:
299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_BIDIRECTIONAL:
303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    GRALLOC_USAGE_HW_CAMERA_WRITE;
305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            case CAMERA3_STREAM_OUTPUT:
308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            default:
312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                break;
314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                QCamera3Channel *channel;
319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                switch (newStream->format) {
320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            mCameraHandle->ops, channelCbRoutine, newStream);
323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    if (channel == NULL) {
324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        ALOGE("%s: allocation of channel failed", __func__);
325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        return -ENOMEM;
326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    }
327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    newStream->priv = channel;
329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                case HAL_PIXEL_FORMAT_BLOB:
331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            mCameraHandle->ops, channelCbRoutine, newStream);
333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    if (channel == NULL) {
334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        ALOGE("%s: allocation of channel failed", __func__);
335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                        return -ENOMEM;
336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    }
337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    newStream->priv = channel;
339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                //TODO: Add support for app consumed format?
342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                default:
343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    break;
345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                }
346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            }
347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        } else {
348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Channel already exists for this stream
349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            // Do nothing for now
350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return 0;
353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : registerStreamBuffers
357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device.
359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @stream_list : streams to be configured
362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers(
367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (buffer_set == NULL) {
371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid buffer_set parameter.", __func__);
372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -EINVAL;
373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (buffer_set->stream == NULL) {
375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid stream parameter.", __func__);
376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -EINVAL;
377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (buffer_set->num_buffers < 1) {
379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -EINVAL;
381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (buffer_set->buffers == NULL) {
383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid buffers parameter.", __func__);
384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -EINVAL;
385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    for (size_t i = 0; i < buffer_set->num_buffers; i++) {
388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_t *stream = buffer_set->stream;
389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (stream->stream_type != CAMERA3_STREAM_OUTPUT) {
392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            ALOGE("%s: not yet support non output type stream", __func__);
393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return -EINVAL;
394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return -ENODEV;
399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return NO_ERROR;
402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initCapabilities
407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct
409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId)
418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mm_camera_vtbl_t *cameraHandle = NULL;
421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *capabilityHeap = NULL;
422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = camera_open(cameraId);
424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!cameraHandle) {
425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: camera_open failed", __func__);
426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto open_failed;
428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Allocate memory for capability buffer */
431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap = new QCamera3HeapMemory();
432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != OK) {
434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for cappability", __func__);
435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto allocate_failed;
436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Map memory for capability buffer */
439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                capabilityHeap->getFd(0),
443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(cam_capability_t));
444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto map_failed;
447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* Query Capability */
450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query capability",__func__);
453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!gCamCapability[cameraId]) {
457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        goto query_failed;
459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                        sizeof(cam_capability_t));
462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = 0;
463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed:
465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed:
468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    capabilityHeap->deallocate();
469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    delete capabilityHeap;
470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed:
471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    cameraHandle = NULL;
473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed:
474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initStaticMetadata
479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata
481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              0  -- success
487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              non-zero failure code
488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId)
490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    android::CameraMetadata staticInfo;
493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->min_focus_distance, 1);
496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->focal_lengths,
502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->focal_lengths_count);
503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures,
507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->apertures_count);
508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities,
511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->filter_densities_count);
512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      (int*)gCamCapability[cameraId]->optical_stab_modes,
516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->optical_stab_modes_count);
517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang   /* staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      gCamCapability[cameraId]->lens_shading_map_size,
521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                      sizeof(cam_dimension_t)/sizeof(int32_t)); */
522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    staticInfo.update(ANDROID_LENS_POSITION,
524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                gCamCapability[cameraId]->lens_position,
525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    gStaticMetadata = staticInfo.release();
529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getCapabilities
534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities
536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera capabilities
540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId,
546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                    struct camera_info *info)
547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gCamCapability[cameraId]) {
551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initCapabilities(cameraId);
552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            //pthread_mutex_unlock(&g_camlock);
554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (NULL == gStaticMetadata) {
559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = initStaticMetadata(cameraId);
560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        if (rc < 0) {
561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            return rc;
562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        }
563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch(gCamCapability[cameraId]->position) {
566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_BACK:
567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_BACK;
568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    case CAM_POSITION_FRONT:
571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        info->facing = CAMERA_FACING_FRONT;
572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    default:
575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        rc = -1;
577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    info->static_camera_characteristics = gStaticMetadata;
584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#if 0
588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : getMetadata
590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera metadata
592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @cameraId  : camera Id
595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @info      : camera info struct to be filled in with camera metadata
596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : int32_t type of status
598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              NO_ERROR  -- success
599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              none-zero failure code
600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getMetadata(int type)
602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HeapMemory *metadataHeap = NULL;
604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    int rc = 0;
605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    metadataHeap = new QCamera3HeapMemory();
607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = metadataHeap->allocate(1, sizeof(metadata_type_t));
608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc != 0) {
609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: No memory for metadata", __func__);
610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                metadataHeap->getFd(0),
615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                sizeof(metadata_type_t));
616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to map capability buffer", __func__);
618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        metadataHeap->deallocate();
619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        delete metadataHeap;
620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang       /* Query Metadata */
623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //rc = cameraHandle->ops->query_metadata(cameraHandle->camera_handle, type);
624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    rc = mCameraHandle->ops->query_capability(mCameraHandle->camera_handle);
625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if(rc < 0) {
627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: failed to query metadata",__func__);
628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                     CAM_MAPPING_BUF_TYPE_CAPABILITY);
630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*delete the old metadata saved in the HAL*/
632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (curr_metadata != NULL) {
633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        free(curr_metadata);
634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        curr_metadata = NULL;
635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    curr_metadata = (metadata_type_t *)malloc(sizeof(metadata_type_t));
637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!curr_metadata) {
638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: out of memory", __func__);
639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                     CAM_MAPPING_BUF_TYPE_CAPABILITY);
641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    memcpy(curr_metadata, DATA_PTR(metadataHeap,0),
643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang            sizeof(metadata_type_t));
644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //metadata now saved in the HAL - still need to copy over to correct
646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //format and send to fwk
647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return rc;
648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#endif
650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : translateMetadata
652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t
654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request
656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : success: camera_metadata_t*
659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              failure: NULL
660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera_metadata_t* QCamera3HardwareInterface::translateMetadata(int type)
663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (mDefaultMetadata[type] != NULL) {
665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return mDefaultMetadata[type];
666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //first time we are handling this request
668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //fill up the metadata structure using the wrapper class
669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    android::CameraMetadata settings;
670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //translate from cam_capability_t to camera_metadata_tag_t
671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*control*/
675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    uint8_t controlIntent = 0;
677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    switch (type) {
678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_PREVIEW:
679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_STILL_CAPTURE:
682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_RECORD:
685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang      default:
694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        break;
696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &gCamCapability[mCameraId]->exposure_compensation_default, 1);
700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*flash*/
720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* lens */
725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_aperture = gCamCapability[mCameraId]->apertures[0];
726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1);
730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0];
732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /* scalar */
736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //settings.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, &gCamCapability[mCameraId]->min_duration, 1);
737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //settings.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, &gCamCapability[mCameraId]->raw_min_duration, 1);
738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    mDefaultMetadata[type] = settings.release();
742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return mDefaultMetadata[type];
743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : channelCbRoutine
747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @frame  : frame information from mm-camera-interface
752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *   @userdata: userdata
754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : NONE
756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::channelCbRoutine(mm_camera_buf_def_t *frame,
758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                camera3_stream_buffer_t *buffer, void *userdata)
759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (hw == NULL) {
762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: Invalid hw %p", __func__, hw);
763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return;
764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    //TODO: Gives frame and buffer to buffer aggregator.
767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return;
769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : initialize
773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL
775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success : 0
780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -ENODEV
781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device,
784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                  const camera3_callback_ops_t *callback_ops)
785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->initialize(callback_ops);
794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : configure_streams
798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: 0
805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: -EINVAL (if stream configuration is invalid)
806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *                       -ENODEV (fatal error)
807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams(
810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        camera3_stream_configuration_t *stream_list)
812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->configureStreams(stream_list);
820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : register_stream_buffers
824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device
826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers(
832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const struct camera3_device *device,
833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        const camera3_stream_buffer_set_t *buffer_set)
834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return -ENODEV;
840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return hw->registerStreamBuffers(buffer_set);
842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : construct_default_request_settings
846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case
848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     : Success: Return valid metadata
853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *              Failure: Return NULL
854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::construct_default_request_settings
856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang(const struct camera3_device *device, int type)
857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    camera_metadata_t* fwk_metadata = NULL;
860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    QCamera3HardwareInterface *hw =
861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    if (!hw) {
863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        ALOGE("%s: NULL camera device", __func__);
864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang        return NULL;
865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    }
866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    fwk_metadata = hw->translateMetadata(type);
868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return fwk_metadata;
870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : process_capture_request
874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::process_capture_request(const struct camera3_device *,
883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                                       camera3_capture_request_t *request)
884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*TODO - Implement*/
886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    return 0;
887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : get_metadata_vendor_tag_ops
891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(const struct camera3_device *,
901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang                                                           vendor_tag_query_ops_t* ops)
902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*TODO - Implement*/
904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*===========================================================================
907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION   : dump
908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION:
910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS :
912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *
914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN     :
915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/
916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::dump(const struct camera3_device *, int fd)
918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{
919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang    /*TODO - Implement*/
920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}
921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang
922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera
923