xref: /aosp_15_r20/hardware/libhardware/modules/camera/3_0/Camera.cpp (revision e01b6f769022e40d0923dee176e8dc7cd1d52984)
1*e01b6f76SAndroid Build Coastguard Worker /*
2*e01b6f76SAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*e01b6f76SAndroid Build Coastguard Worker  *
4*e01b6f76SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e01b6f76SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e01b6f76SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e01b6f76SAndroid Build Coastguard Worker  *
8*e01b6f76SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e01b6f76SAndroid Build Coastguard Worker  *
10*e01b6f76SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e01b6f76SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e01b6f76SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e01b6f76SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e01b6f76SAndroid Build Coastguard Worker  * limitations under the License.
15*e01b6f76SAndroid Build Coastguard Worker  */
16*e01b6f76SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
17*e01b6f76SAndroid Build Coastguard Worker #define LOG_TAG "Camera"
18*e01b6f76SAndroid Build Coastguard Worker 
19*e01b6f76SAndroid Build Coastguard Worker #include <errno.h>
20*e01b6f76SAndroid Build Coastguard Worker #include <stdint.h>
21*e01b6f76SAndroid Build Coastguard Worker #include <stdio.h>
22*e01b6f76SAndroid Build Coastguard Worker #include <string.h>
23*e01b6f76SAndroid Build Coastguard Worker 
24*e01b6f76SAndroid Build Coastguard Worker #include <cstdlib>
25*e01b6f76SAndroid Build Coastguard Worker 
26*e01b6f76SAndroid Build Coastguard Worker #include <log/log.h>
27*e01b6f76SAndroid Build Coastguard Worker #include <utils/Mutex.h>
28*e01b6f76SAndroid Build Coastguard Worker 
29*e01b6f76SAndroid Build Coastguard Worker #define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
30*e01b6f76SAndroid Build Coastguard Worker #include <utils/Trace.h>
31*e01b6f76SAndroid Build Coastguard Worker 
32*e01b6f76SAndroid Build Coastguard Worker #include <hardware/camera3.h>
33*e01b6f76SAndroid Build Coastguard Worker #include <sync/sync.h>
34*e01b6f76SAndroid Build Coastguard Worker #include <system/camera_metadata.h>
35*e01b6f76SAndroid Build Coastguard Worker #include <system/graphics.h>
36*e01b6f76SAndroid Build Coastguard Worker #include "CameraHAL.h"
37*e01b6f76SAndroid Build Coastguard Worker #include "Metadata.h"
38*e01b6f76SAndroid Build Coastguard Worker #include "Stream.h"
39*e01b6f76SAndroid Build Coastguard Worker 
40*e01b6f76SAndroid Build Coastguard Worker #include "Camera.h"
41*e01b6f76SAndroid Build Coastguard Worker 
42*e01b6f76SAndroid Build Coastguard Worker #define CAMERA_SYNC_TIMEOUT 5000 // in msecs
43*e01b6f76SAndroid Build Coastguard Worker 
44*e01b6f76SAndroid Build Coastguard Worker namespace default_camera_hal {
45*e01b6f76SAndroid Build Coastguard Worker 
46*e01b6f76SAndroid Build Coastguard Worker extern "C" {
47*e01b6f76SAndroid Build Coastguard Worker // Shim passed to the framework to close an opened device.
close_device(hw_device_t * dev)48*e01b6f76SAndroid Build Coastguard Worker static int close_device(hw_device_t* dev)
49*e01b6f76SAndroid Build Coastguard Worker {
50*e01b6f76SAndroid Build Coastguard Worker     camera3_device_t* cam_dev = reinterpret_cast<camera3_device_t*>(dev);
51*e01b6f76SAndroid Build Coastguard Worker     Camera* cam = static_cast<Camera*>(cam_dev->priv);
52*e01b6f76SAndroid Build Coastguard Worker     return cam->close();
53*e01b6f76SAndroid Build Coastguard Worker }
54*e01b6f76SAndroid Build Coastguard Worker } // extern "C"
55*e01b6f76SAndroid Build Coastguard Worker 
Camera(int id)56*e01b6f76SAndroid Build Coastguard Worker Camera::Camera(int id)
57*e01b6f76SAndroid Build Coastguard Worker   : mId(id),
58*e01b6f76SAndroid Build Coastguard Worker     mStaticInfo(NULL),
59*e01b6f76SAndroid Build Coastguard Worker     mBusy(false),
60*e01b6f76SAndroid Build Coastguard Worker     mCallbackOps(NULL),
61*e01b6f76SAndroid Build Coastguard Worker     mStreams(NULL),
62*e01b6f76SAndroid Build Coastguard Worker     mNumStreams(0),
63*e01b6f76SAndroid Build Coastguard Worker     mSettings(NULL)
64*e01b6f76SAndroid Build Coastguard Worker {
65*e01b6f76SAndroid Build Coastguard Worker     memset(&mTemplates, 0, sizeof(mTemplates));
66*e01b6f76SAndroid Build Coastguard Worker     memset(&mDevice, 0, sizeof(mDevice));
67*e01b6f76SAndroid Build Coastguard Worker     mDevice.common.tag    = HARDWARE_DEVICE_TAG;
68*e01b6f76SAndroid Build Coastguard Worker     mDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
69*e01b6f76SAndroid Build Coastguard Worker     mDevice.common.close  = close_device;
70*e01b6f76SAndroid Build Coastguard Worker     mDevice.ops           = const_cast<camera3_device_ops_t*>(&sOps);
71*e01b6f76SAndroid Build Coastguard Worker     mDevice.priv          = this;
72*e01b6f76SAndroid Build Coastguard Worker }
73*e01b6f76SAndroid Build Coastguard Worker 
~Camera()74*e01b6f76SAndroid Build Coastguard Worker Camera::~Camera()
75*e01b6f76SAndroid Build Coastguard Worker {
76*e01b6f76SAndroid Build Coastguard Worker     if (mStaticInfo != NULL) {
77*e01b6f76SAndroid Build Coastguard Worker         free_camera_metadata(mStaticInfo);
78*e01b6f76SAndroid Build Coastguard Worker     }
79*e01b6f76SAndroid Build Coastguard Worker }
80*e01b6f76SAndroid Build Coastguard Worker 
open(const hw_module_t * module,hw_device_t ** device)81*e01b6f76SAndroid Build Coastguard Worker int Camera::open(const hw_module_t *module, hw_device_t **device)
82*e01b6f76SAndroid Build Coastguard Worker {
83*e01b6f76SAndroid Build Coastguard Worker     ALOGI("%s:%d: Opening camera device", __func__, mId);
84*e01b6f76SAndroid Build Coastguard Worker     ATRACE_CALL();
85*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mDeviceLock);
86*e01b6f76SAndroid Build Coastguard Worker 
87*e01b6f76SAndroid Build Coastguard Worker     if (mBusy) {
88*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Error! Camera device already opened", __func__, mId);
89*e01b6f76SAndroid Build Coastguard Worker         return -EBUSY;
90*e01b6f76SAndroid Build Coastguard Worker     }
91*e01b6f76SAndroid Build Coastguard Worker 
92*e01b6f76SAndroid Build Coastguard Worker     // TODO: open camera dev nodes, etc
93*e01b6f76SAndroid Build Coastguard Worker     mBusy = true;
94*e01b6f76SAndroid Build Coastguard Worker     mDevice.common.module = const_cast<hw_module_t*>(module);
95*e01b6f76SAndroid Build Coastguard Worker     *device = &mDevice.common;
96*e01b6f76SAndroid Build Coastguard Worker     return 0;
97*e01b6f76SAndroid Build Coastguard Worker }
98*e01b6f76SAndroid Build Coastguard Worker 
getInfo(struct camera_info * info)99*e01b6f76SAndroid Build Coastguard Worker int Camera::getInfo(struct camera_info *info)
100*e01b6f76SAndroid Build Coastguard Worker {
101*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mStaticInfoLock);
102*e01b6f76SAndroid Build Coastguard Worker 
103*e01b6f76SAndroid Build Coastguard Worker     info->facing = CAMERA_FACING_FRONT;
104*e01b6f76SAndroid Build Coastguard Worker     info->orientation = 0;
105*e01b6f76SAndroid Build Coastguard Worker     info->device_version = mDevice.common.version;
106*e01b6f76SAndroid Build Coastguard Worker     if (mStaticInfo == NULL) {
107*e01b6f76SAndroid Build Coastguard Worker         mStaticInfo = initStaticInfo();
108*e01b6f76SAndroid Build Coastguard Worker     }
109*e01b6f76SAndroid Build Coastguard Worker     info->static_camera_characteristics = mStaticInfo;
110*e01b6f76SAndroid Build Coastguard Worker     return 0;
111*e01b6f76SAndroid Build Coastguard Worker }
112*e01b6f76SAndroid Build Coastguard Worker 
close()113*e01b6f76SAndroid Build Coastguard Worker int Camera::close()
114*e01b6f76SAndroid Build Coastguard Worker {
115*e01b6f76SAndroid Build Coastguard Worker     ALOGI("%s:%d: Closing camera device", __func__, mId);
116*e01b6f76SAndroid Build Coastguard Worker     ATRACE_CALL();
117*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mDeviceLock);
118*e01b6f76SAndroid Build Coastguard Worker 
119*e01b6f76SAndroid Build Coastguard Worker     if (!mBusy) {
120*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Error! Camera device not open", __func__, mId);
121*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
122*e01b6f76SAndroid Build Coastguard Worker     }
123*e01b6f76SAndroid Build Coastguard Worker 
124*e01b6f76SAndroid Build Coastguard Worker     // TODO: close camera dev nodes, etc
125*e01b6f76SAndroid Build Coastguard Worker     mBusy = false;
126*e01b6f76SAndroid Build Coastguard Worker     return 0;
127*e01b6f76SAndroid Build Coastguard Worker }
128*e01b6f76SAndroid Build Coastguard Worker 
initialize(const camera3_callback_ops_t * callback_ops)129*e01b6f76SAndroid Build Coastguard Worker int Camera::initialize(const camera3_callback_ops_t *callback_ops)
130*e01b6f76SAndroid Build Coastguard Worker {
131*e01b6f76SAndroid Build Coastguard Worker     int res;
132*e01b6f76SAndroid Build Coastguard Worker 
133*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: callback_ops=%p", __func__, mId, callback_ops);
134*e01b6f76SAndroid Build Coastguard Worker     mCallbackOps = callback_ops;
135*e01b6f76SAndroid Build Coastguard Worker     // per-device specific initialization
136*e01b6f76SAndroid Build Coastguard Worker     res = initDevice();
137*e01b6f76SAndroid Build Coastguard Worker     if (res != 0) {
138*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Failed to initialize device!", __func__, mId);
139*e01b6f76SAndroid Build Coastguard Worker         return res;
140*e01b6f76SAndroid Build Coastguard Worker     }
141*e01b6f76SAndroid Build Coastguard Worker     return 0;
142*e01b6f76SAndroid Build Coastguard Worker }
143*e01b6f76SAndroid Build Coastguard Worker 
configureStreams(camera3_stream_configuration_t * stream_config)144*e01b6f76SAndroid Build Coastguard Worker int Camera::configureStreams(camera3_stream_configuration_t *stream_config)
145*e01b6f76SAndroid Build Coastguard Worker {
146*e01b6f76SAndroid Build Coastguard Worker     camera3_stream_t *astream;
147*e01b6f76SAndroid Build Coastguard Worker     Stream **newStreams = NULL;
148*e01b6f76SAndroid Build Coastguard Worker 
149*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: stream_config=%p", __func__, mId, stream_config);
150*e01b6f76SAndroid Build Coastguard Worker     ATRACE_CALL();
151*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mDeviceLock);
152*e01b6f76SAndroid Build Coastguard Worker 
153*e01b6f76SAndroid Build Coastguard Worker     if (stream_config == NULL) {
154*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: NULL stream configuration array", __func__, mId);
155*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
156*e01b6f76SAndroid Build Coastguard Worker     }
157*e01b6f76SAndroid Build Coastguard Worker     if (stream_config->num_streams == 0) {
158*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Empty stream configuration array", __func__, mId);
159*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
160*e01b6f76SAndroid Build Coastguard Worker     }
161*e01b6f76SAndroid Build Coastguard Worker 
162*e01b6f76SAndroid Build Coastguard Worker     // Create new stream array
163*e01b6f76SAndroid Build Coastguard Worker     newStreams = new Stream*[stream_config->num_streams];
164*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: Number of Streams: %d", __func__, mId,
165*e01b6f76SAndroid Build Coastguard Worker             stream_config->num_streams);
166*e01b6f76SAndroid Build Coastguard Worker 
167*e01b6f76SAndroid Build Coastguard Worker     // Mark all current streams unused for now
168*e01b6f76SAndroid Build Coastguard Worker     for (int i = 0; i < mNumStreams; i++)
169*e01b6f76SAndroid Build Coastguard Worker         mStreams[i]->mReuse = false;
170*e01b6f76SAndroid Build Coastguard Worker     // Fill new stream array with reused streams and new streams
171*e01b6f76SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < stream_config->num_streams; i++) {
172*e01b6f76SAndroid Build Coastguard Worker         astream = stream_config->streams[i];
173*e01b6f76SAndroid Build Coastguard Worker         if (astream->max_buffers > 0) {
174*e01b6f76SAndroid Build Coastguard Worker             ALOGV("%s:%d: Reusing stream %d", __func__, mId, i);
175*e01b6f76SAndroid Build Coastguard Worker             newStreams[i] = reuseStream(astream);
176*e01b6f76SAndroid Build Coastguard Worker         } else {
177*e01b6f76SAndroid Build Coastguard Worker             ALOGV("%s:%d: Creating new stream %d", __func__, mId, i);
178*e01b6f76SAndroid Build Coastguard Worker             newStreams[i] = new Stream(mId, astream);
179*e01b6f76SAndroid Build Coastguard Worker         }
180*e01b6f76SAndroid Build Coastguard Worker 
181*e01b6f76SAndroid Build Coastguard Worker         if (newStreams[i] == NULL) {
182*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: Error processing stream %d", __func__, mId, i);
183*e01b6f76SAndroid Build Coastguard Worker             goto err_out;
184*e01b6f76SAndroid Build Coastguard Worker         }
185*e01b6f76SAndroid Build Coastguard Worker         astream->priv = newStreams[i];
186*e01b6f76SAndroid Build Coastguard Worker     }
187*e01b6f76SAndroid Build Coastguard Worker 
188*e01b6f76SAndroid Build Coastguard Worker     // Verify the set of streams in aggregate
189*e01b6f76SAndroid Build Coastguard Worker     if (!isValidStreamSet(newStreams, stream_config->num_streams)) {
190*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid stream set", __func__, mId);
191*e01b6f76SAndroid Build Coastguard Worker         goto err_out;
192*e01b6f76SAndroid Build Coastguard Worker     }
193*e01b6f76SAndroid Build Coastguard Worker 
194*e01b6f76SAndroid Build Coastguard Worker     // Set up all streams (calculate usage/max_buffers for each)
195*e01b6f76SAndroid Build Coastguard Worker     setupStreams(newStreams, stream_config->num_streams);
196*e01b6f76SAndroid Build Coastguard Worker 
197*e01b6f76SAndroid Build Coastguard Worker     // Destroy all old streams and replace stream array with new one
198*e01b6f76SAndroid Build Coastguard Worker     destroyStreams(mStreams, mNumStreams);
199*e01b6f76SAndroid Build Coastguard Worker     mStreams = newStreams;
200*e01b6f76SAndroid Build Coastguard Worker     mNumStreams = stream_config->num_streams;
201*e01b6f76SAndroid Build Coastguard Worker 
202*e01b6f76SAndroid Build Coastguard Worker     // Clear out last seen settings metadata
203*e01b6f76SAndroid Build Coastguard Worker     setSettings(NULL);
204*e01b6f76SAndroid Build Coastguard Worker     return 0;
205*e01b6f76SAndroid Build Coastguard Worker 
206*e01b6f76SAndroid Build Coastguard Worker err_out:
207*e01b6f76SAndroid Build Coastguard Worker     // Clean up temporary streams, preserve existing mStreams/mNumStreams
208*e01b6f76SAndroid Build Coastguard Worker     destroyStreams(newStreams, stream_config->num_streams);
209*e01b6f76SAndroid Build Coastguard Worker     return -EINVAL;
210*e01b6f76SAndroid Build Coastguard Worker }
211*e01b6f76SAndroid Build Coastguard Worker 
destroyStreams(Stream ** streams,int count)212*e01b6f76SAndroid Build Coastguard Worker void Camera::destroyStreams(Stream **streams, int count)
213*e01b6f76SAndroid Build Coastguard Worker {
214*e01b6f76SAndroid Build Coastguard Worker     if (streams == NULL)
215*e01b6f76SAndroid Build Coastguard Worker         return;
216*e01b6f76SAndroid Build Coastguard Worker     for (int i = 0; i < count; i++) {
217*e01b6f76SAndroid Build Coastguard Worker         // Only destroy streams that weren't reused
218*e01b6f76SAndroid Build Coastguard Worker         if (streams[i] != NULL && !streams[i]->mReuse)
219*e01b6f76SAndroid Build Coastguard Worker             delete streams[i];
220*e01b6f76SAndroid Build Coastguard Worker     }
221*e01b6f76SAndroid Build Coastguard Worker     delete [] streams;
222*e01b6f76SAndroid Build Coastguard Worker }
223*e01b6f76SAndroid Build Coastguard Worker 
reuseStream(camera3_stream_t * astream)224*e01b6f76SAndroid Build Coastguard Worker Stream *Camera::reuseStream(camera3_stream_t *astream)
225*e01b6f76SAndroid Build Coastguard Worker {
226*e01b6f76SAndroid Build Coastguard Worker     Stream *priv = reinterpret_cast<Stream*>(astream->priv);
227*e01b6f76SAndroid Build Coastguard Worker     // Verify the re-used stream's parameters match
228*e01b6f76SAndroid Build Coastguard Worker     if (!priv->isValidReuseStream(mId, astream)) {
229*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Mismatched parameter in reused stream", __func__, mId);
230*e01b6f76SAndroid Build Coastguard Worker         return NULL;
231*e01b6f76SAndroid Build Coastguard Worker     }
232*e01b6f76SAndroid Build Coastguard Worker     // Mark stream to be reused
233*e01b6f76SAndroid Build Coastguard Worker     priv->mReuse = true;
234*e01b6f76SAndroid Build Coastguard Worker     return priv;
235*e01b6f76SAndroid Build Coastguard Worker }
236*e01b6f76SAndroid Build Coastguard Worker 
isValidStreamSet(Stream ** streams,int count)237*e01b6f76SAndroid Build Coastguard Worker bool Camera::isValidStreamSet(Stream **streams, int count)
238*e01b6f76SAndroid Build Coastguard Worker {
239*e01b6f76SAndroid Build Coastguard Worker     int inputs = 0;
240*e01b6f76SAndroid Build Coastguard Worker     int outputs = 0;
241*e01b6f76SAndroid Build Coastguard Worker 
242*e01b6f76SAndroid Build Coastguard Worker     if (streams == NULL) {
243*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: NULL stream configuration streams", __func__, mId);
244*e01b6f76SAndroid Build Coastguard Worker         return false;
245*e01b6f76SAndroid Build Coastguard Worker     }
246*e01b6f76SAndroid Build Coastguard Worker     if (count == 0) {
247*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Zero count stream configuration streams", __func__, mId);
248*e01b6f76SAndroid Build Coastguard Worker         return false;
249*e01b6f76SAndroid Build Coastguard Worker     }
250*e01b6f76SAndroid Build Coastguard Worker     // Validate there is at most one input stream and at least one output stream
251*e01b6f76SAndroid Build Coastguard Worker     for (int i = 0; i < count; i++) {
252*e01b6f76SAndroid Build Coastguard Worker         // A stream may be both input and output (bidirectional)
253*e01b6f76SAndroid Build Coastguard Worker         if (streams[i]->isInputType())
254*e01b6f76SAndroid Build Coastguard Worker             inputs++;
255*e01b6f76SAndroid Build Coastguard Worker         if (streams[i]->isOutputType())
256*e01b6f76SAndroid Build Coastguard Worker             outputs++;
257*e01b6f76SAndroid Build Coastguard Worker     }
258*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: Configuring %d output streams and %d input streams",
259*e01b6f76SAndroid Build Coastguard Worker             __func__, mId, outputs, inputs);
260*e01b6f76SAndroid Build Coastguard Worker     if (outputs < 1) {
261*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Stream config must have >= 1 output", __func__, mId);
262*e01b6f76SAndroid Build Coastguard Worker         return false;
263*e01b6f76SAndroid Build Coastguard Worker     }
264*e01b6f76SAndroid Build Coastguard Worker     if (inputs > 1) {
265*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Stream config must have <= 1 input", __func__, mId);
266*e01b6f76SAndroid Build Coastguard Worker         return false;
267*e01b6f76SAndroid Build Coastguard Worker     }
268*e01b6f76SAndroid Build Coastguard Worker     // TODO: check for correct number of Bayer/YUV/JPEG/Encoder streams
269*e01b6f76SAndroid Build Coastguard Worker     return true;
270*e01b6f76SAndroid Build Coastguard Worker }
271*e01b6f76SAndroid Build Coastguard Worker 
setupStreams(Stream ** streams,int count)272*e01b6f76SAndroid Build Coastguard Worker void Camera::setupStreams(Stream **streams, int count)
273*e01b6f76SAndroid Build Coastguard Worker {
274*e01b6f76SAndroid Build Coastguard Worker     /*
275*e01b6f76SAndroid Build Coastguard Worker      * This is where the HAL has to decide internally how to handle all of the
276*e01b6f76SAndroid Build Coastguard Worker      * streams, and then produce usage and max_buffer values for each stream.
277*e01b6f76SAndroid Build Coastguard Worker      * Note, the stream array has been checked before this point for ALL invalid
278*e01b6f76SAndroid Build Coastguard Worker      * conditions, so it must find a successful configuration for this stream
279*e01b6f76SAndroid Build Coastguard Worker      * array.  The HAL may not return an error from this point.
280*e01b6f76SAndroid Build Coastguard Worker      *
281*e01b6f76SAndroid Build Coastguard Worker      * In this demo HAL, we just set all streams to be the same dummy values;
282*e01b6f76SAndroid Build Coastguard Worker      * real implementations will want to avoid USAGE_SW_{READ|WRITE}_OFTEN.
283*e01b6f76SAndroid Build Coastguard Worker      */
284*e01b6f76SAndroid Build Coastguard Worker     for (int i = 0; i < count; i++) {
285*e01b6f76SAndroid Build Coastguard Worker         uint32_t usage = 0;
286*e01b6f76SAndroid Build Coastguard Worker 
287*e01b6f76SAndroid Build Coastguard Worker         if (streams[i]->isOutputType())
288*e01b6f76SAndroid Build Coastguard Worker             usage |= GRALLOC_USAGE_SW_WRITE_OFTEN |
289*e01b6f76SAndroid Build Coastguard Worker                      GRALLOC_USAGE_HW_CAMERA_WRITE;
290*e01b6f76SAndroid Build Coastguard Worker         if (streams[i]->isInputType())
291*e01b6f76SAndroid Build Coastguard Worker             usage |= GRALLOC_USAGE_SW_READ_OFTEN |
292*e01b6f76SAndroid Build Coastguard Worker                      GRALLOC_USAGE_HW_CAMERA_READ;
293*e01b6f76SAndroid Build Coastguard Worker 
294*e01b6f76SAndroid Build Coastguard Worker         streams[i]->setUsage(usage);
295*e01b6f76SAndroid Build Coastguard Worker         streams[i]->setMaxBuffers(1);
296*e01b6f76SAndroid Build Coastguard Worker     }
297*e01b6f76SAndroid Build Coastguard Worker }
298*e01b6f76SAndroid Build Coastguard Worker 
registerStreamBuffers(const camera3_stream_buffer_set_t * buf_set)299*e01b6f76SAndroid Build Coastguard Worker int Camera::registerStreamBuffers(const camera3_stream_buffer_set_t *buf_set)
300*e01b6f76SAndroid Build Coastguard Worker {
301*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: buffer_set=%p", __func__, mId, buf_set);
302*e01b6f76SAndroid Build Coastguard Worker     if (buf_set == NULL) {
303*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: NULL buffer set", __func__, mId);
304*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
305*e01b6f76SAndroid Build Coastguard Worker     }
306*e01b6f76SAndroid Build Coastguard Worker     if (buf_set->stream == NULL) {
307*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: NULL stream handle", __func__, mId);
308*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
309*e01b6f76SAndroid Build Coastguard Worker     }
310*e01b6f76SAndroid Build Coastguard Worker     Stream *stream = reinterpret_cast<Stream*>(buf_set->stream->priv);
311*e01b6f76SAndroid Build Coastguard Worker     return stream->registerBuffers(buf_set);
312*e01b6f76SAndroid Build Coastguard Worker }
313*e01b6f76SAndroid Build Coastguard Worker 
isValidTemplateType(int type)314*e01b6f76SAndroid Build Coastguard Worker bool Camera::isValidTemplateType(int type)
315*e01b6f76SAndroid Build Coastguard Worker {
316*e01b6f76SAndroid Build Coastguard Worker     return type < 1 || type >= CAMERA3_TEMPLATE_COUNT;
317*e01b6f76SAndroid Build Coastguard Worker }
318*e01b6f76SAndroid Build Coastguard Worker 
constructDefaultRequestSettings(int type)319*e01b6f76SAndroid Build Coastguard Worker const camera_metadata_t* Camera::constructDefaultRequestSettings(int type)
320*e01b6f76SAndroid Build Coastguard Worker {
321*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: type=%d", __func__, mId, type);
322*e01b6f76SAndroid Build Coastguard Worker 
323*e01b6f76SAndroid Build Coastguard Worker     if (!isValidTemplateType(type)) {
324*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid template request type: %d", __func__, mId, type);
325*e01b6f76SAndroid Build Coastguard Worker         return NULL;
326*e01b6f76SAndroid Build Coastguard Worker     }
327*e01b6f76SAndroid Build Coastguard Worker     return mTemplates[type];
328*e01b6f76SAndroid Build Coastguard Worker }
329*e01b6f76SAndroid Build Coastguard Worker 
processCaptureRequest(camera3_capture_request_t * request)330*e01b6f76SAndroid Build Coastguard Worker int Camera::processCaptureRequest(camera3_capture_request_t *request)
331*e01b6f76SAndroid Build Coastguard Worker {
332*e01b6f76SAndroid Build Coastguard Worker     camera3_capture_result result;
333*e01b6f76SAndroid Build Coastguard Worker 
334*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: request=%p", __func__, mId, request);
335*e01b6f76SAndroid Build Coastguard Worker     ATRACE_CALL();
336*e01b6f76SAndroid Build Coastguard Worker 
337*e01b6f76SAndroid Build Coastguard Worker     if (request == NULL) {
338*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: NULL request recieved", __func__, mId);
339*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
340*e01b6f76SAndroid Build Coastguard Worker     }
341*e01b6f76SAndroid Build Coastguard Worker 
342*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: Request Frame:%d Settings:%p", __func__, mId,
343*e01b6f76SAndroid Build Coastguard Worker             request->frame_number, request->settings);
344*e01b6f76SAndroid Build Coastguard Worker 
345*e01b6f76SAndroid Build Coastguard Worker     // NULL indicates use last settings
346*e01b6f76SAndroid Build Coastguard Worker     if (request->settings == NULL) {
347*e01b6f76SAndroid Build Coastguard Worker         if (mSettings == NULL) {
348*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: NULL settings without previous set Frame:%d Req:%p",
349*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId, request->frame_number, request);
350*e01b6f76SAndroid Build Coastguard Worker             return -EINVAL;
351*e01b6f76SAndroid Build Coastguard Worker         }
352*e01b6f76SAndroid Build Coastguard Worker     } else {
353*e01b6f76SAndroid Build Coastguard Worker         setSettings(request->settings);
354*e01b6f76SAndroid Build Coastguard Worker     }
355*e01b6f76SAndroid Build Coastguard Worker 
356*e01b6f76SAndroid Build Coastguard Worker     if (request->input_buffer != NULL) {
357*e01b6f76SAndroid Build Coastguard Worker         ALOGV("%s:%d: Reprocessing input buffer %p", __func__, mId,
358*e01b6f76SAndroid Build Coastguard Worker                 request->input_buffer);
359*e01b6f76SAndroid Build Coastguard Worker 
360*e01b6f76SAndroid Build Coastguard Worker         if (!isValidReprocessSettings(request->settings)) {
361*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: Invalid settings for reprocess request: %p",
362*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId, request->settings);
363*e01b6f76SAndroid Build Coastguard Worker             return -EINVAL;
364*e01b6f76SAndroid Build Coastguard Worker         }
365*e01b6f76SAndroid Build Coastguard Worker     } else {
366*e01b6f76SAndroid Build Coastguard Worker         ALOGV("%s:%d: Capturing new frame.", __func__, mId);
367*e01b6f76SAndroid Build Coastguard Worker 
368*e01b6f76SAndroid Build Coastguard Worker         if (!isValidCaptureSettings(request->settings)) {
369*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: Invalid settings for capture request: %p",
370*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId, request->settings);
371*e01b6f76SAndroid Build Coastguard Worker             return -EINVAL;
372*e01b6f76SAndroid Build Coastguard Worker         }
373*e01b6f76SAndroid Build Coastguard Worker     }
374*e01b6f76SAndroid Build Coastguard Worker 
375*e01b6f76SAndroid Build Coastguard Worker     if (request->num_output_buffers <= 0) {
376*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid number of output buffers: %d", __func__, mId,
377*e01b6f76SAndroid Build Coastguard Worker                 request->num_output_buffers);
378*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
379*e01b6f76SAndroid Build Coastguard Worker     }
380*e01b6f76SAndroid Build Coastguard Worker     result.num_output_buffers = request->num_output_buffers;
381*e01b6f76SAndroid Build Coastguard Worker     result.output_buffers = new camera3_stream_buffer_t[result.num_output_buffers];
382*e01b6f76SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < request->num_output_buffers; i++) {
383*e01b6f76SAndroid Build Coastguard Worker         int res = processCaptureBuffer(&request->output_buffers[i],
384*e01b6f76SAndroid Build Coastguard Worker                 const_cast<camera3_stream_buffer_t*>(&result.output_buffers[i]));
385*e01b6f76SAndroid Build Coastguard Worker         if (res)
386*e01b6f76SAndroid Build Coastguard Worker             goto err_out;
387*e01b6f76SAndroid Build Coastguard Worker     }
388*e01b6f76SAndroid Build Coastguard Worker 
389*e01b6f76SAndroid Build Coastguard Worker     result.frame_number = request->frame_number;
390*e01b6f76SAndroid Build Coastguard Worker     // TODO: return actual captured/reprocessed settings
391*e01b6f76SAndroid Build Coastguard Worker     result.result = request->settings;
392*e01b6f76SAndroid Build Coastguard Worker     // TODO: asynchronously return results
393*e01b6f76SAndroid Build Coastguard Worker     notifyShutter(request->frame_number, 0);
394*e01b6f76SAndroid Build Coastguard Worker     mCallbackOps->process_capture_result(mCallbackOps, &result);
395*e01b6f76SAndroid Build Coastguard Worker 
396*e01b6f76SAndroid Build Coastguard Worker     return 0;
397*e01b6f76SAndroid Build Coastguard Worker 
398*e01b6f76SAndroid Build Coastguard Worker err_out:
399*e01b6f76SAndroid Build Coastguard Worker     delete [] result.output_buffers;
400*e01b6f76SAndroid Build Coastguard Worker     // TODO: this should probably be a total device failure; transient for now
401*e01b6f76SAndroid Build Coastguard Worker     return -EINVAL;
402*e01b6f76SAndroid Build Coastguard Worker }
403*e01b6f76SAndroid Build Coastguard Worker 
setSettings(const camera_metadata_t * new_settings)404*e01b6f76SAndroid Build Coastguard Worker void Camera::setSettings(const camera_metadata_t *new_settings)
405*e01b6f76SAndroid Build Coastguard Worker {
406*e01b6f76SAndroid Build Coastguard Worker     if (mSettings != NULL) {
407*e01b6f76SAndroid Build Coastguard Worker         free_camera_metadata(mSettings);
408*e01b6f76SAndroid Build Coastguard Worker         mSettings = NULL;
409*e01b6f76SAndroid Build Coastguard Worker     }
410*e01b6f76SAndroid Build Coastguard Worker 
411*e01b6f76SAndroid Build Coastguard Worker     if (new_settings != NULL)
412*e01b6f76SAndroid Build Coastguard Worker         mSettings = clone_camera_metadata(new_settings);
413*e01b6f76SAndroid Build Coastguard Worker }
414*e01b6f76SAndroid Build Coastguard Worker 
isValidReprocessSettings(const camera_metadata_t *)415*e01b6f76SAndroid Build Coastguard Worker bool Camera::isValidReprocessSettings(const camera_metadata_t* /*settings*/)
416*e01b6f76SAndroid Build Coastguard Worker {
417*e01b6f76SAndroid Build Coastguard Worker     // TODO: reject settings that cannot be reprocessed
418*e01b6f76SAndroid Build Coastguard Worker     // input buffers unimplemented, use this to reject reprocessing requests
419*e01b6f76SAndroid Build Coastguard Worker     ALOGE("%s:%d: Input buffer reprocessing not implemented", __func__, mId);
420*e01b6f76SAndroid Build Coastguard Worker     return false;
421*e01b6f76SAndroid Build Coastguard Worker }
422*e01b6f76SAndroid Build Coastguard Worker 
processCaptureBuffer(const camera3_stream_buffer_t * in,camera3_stream_buffer_t * out)423*e01b6f76SAndroid Build Coastguard Worker int Camera::processCaptureBuffer(const camera3_stream_buffer_t *in,
424*e01b6f76SAndroid Build Coastguard Worker         camera3_stream_buffer_t *out)
425*e01b6f76SAndroid Build Coastguard Worker {
426*e01b6f76SAndroid Build Coastguard Worker     if (in->acquire_fence != -1) {
427*e01b6f76SAndroid Build Coastguard Worker         int res = sync_wait(in->acquire_fence, CAMERA_SYNC_TIMEOUT);
428*e01b6f76SAndroid Build Coastguard Worker         if (res == -ETIME) {
429*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: Timeout waiting on buffer acquire fence",
430*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId);
431*e01b6f76SAndroid Build Coastguard Worker             return res;
432*e01b6f76SAndroid Build Coastguard Worker         } else if (res) {
433*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: Error waiting on buffer acquire fence: %s(%d)",
434*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId, strerror(-res), res);
435*e01b6f76SAndroid Build Coastguard Worker             return res;
436*e01b6f76SAndroid Build Coastguard Worker         }
437*e01b6f76SAndroid Build Coastguard Worker     }
438*e01b6f76SAndroid Build Coastguard Worker 
439*e01b6f76SAndroid Build Coastguard Worker     out->stream = in->stream;
440*e01b6f76SAndroid Build Coastguard Worker     out->buffer = in->buffer;
441*e01b6f76SAndroid Build Coastguard Worker     out->status = CAMERA3_BUFFER_STATUS_OK;
442*e01b6f76SAndroid Build Coastguard Worker     // TODO: use driver-backed release fences
443*e01b6f76SAndroid Build Coastguard Worker     out->acquire_fence = -1;
444*e01b6f76SAndroid Build Coastguard Worker     out->release_fence = -1;
445*e01b6f76SAndroid Build Coastguard Worker 
446*e01b6f76SAndroid Build Coastguard Worker     // TODO: lock and software-paint buffer
447*e01b6f76SAndroid Build Coastguard Worker     return 0;
448*e01b6f76SAndroid Build Coastguard Worker }
449*e01b6f76SAndroid Build Coastguard Worker 
notifyShutter(uint32_t frame_number,uint64_t timestamp)450*e01b6f76SAndroid Build Coastguard Worker void Camera::notifyShutter(uint32_t frame_number, uint64_t timestamp)
451*e01b6f76SAndroid Build Coastguard Worker {
452*e01b6f76SAndroid Build Coastguard Worker     int res;
453*e01b6f76SAndroid Build Coastguard Worker     struct timespec ts;
454*e01b6f76SAndroid Build Coastguard Worker 
455*e01b6f76SAndroid Build Coastguard Worker     // If timestamp is 0, get timestamp from right now instead
456*e01b6f76SAndroid Build Coastguard Worker     if (timestamp == 0) {
457*e01b6f76SAndroid Build Coastguard Worker         ALOGW("%s:%d: No timestamp provided, using CLOCK_BOOTTIME",
458*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId);
459*e01b6f76SAndroid Build Coastguard Worker         res = clock_gettime(CLOCK_BOOTTIME, &ts);
460*e01b6f76SAndroid Build Coastguard Worker         if (res == 0) {
461*e01b6f76SAndroid Build Coastguard Worker             timestamp = ts.tv_sec * 1000000000ULL + ts.tv_nsec;
462*e01b6f76SAndroid Build Coastguard Worker         } else {
463*e01b6f76SAndroid Build Coastguard Worker             ALOGE("%s:%d: No timestamp and failed to get CLOCK_BOOTTIME %s(%d)",
464*e01b6f76SAndroid Build Coastguard Worker                     __func__, mId, strerror(errno), errno);
465*e01b6f76SAndroid Build Coastguard Worker         }
466*e01b6f76SAndroid Build Coastguard Worker     }
467*e01b6f76SAndroid Build Coastguard Worker     camera3_notify_msg_t m;
468*e01b6f76SAndroid Build Coastguard Worker     memset(&m, 0, sizeof(m));
469*e01b6f76SAndroid Build Coastguard Worker     m.type = CAMERA3_MSG_SHUTTER;
470*e01b6f76SAndroid Build Coastguard Worker     m.message.shutter.frame_number = frame_number;
471*e01b6f76SAndroid Build Coastguard Worker     m.message.shutter.timestamp = timestamp;
472*e01b6f76SAndroid Build Coastguard Worker     mCallbackOps->notify(mCallbackOps, &m);
473*e01b6f76SAndroid Build Coastguard Worker }
474*e01b6f76SAndroid Build Coastguard Worker 
dump(int fd)475*e01b6f76SAndroid Build Coastguard Worker void Camera::dump(int fd)
476*e01b6f76SAndroid Build Coastguard Worker {
477*e01b6f76SAndroid Build Coastguard Worker     ALOGV("%s:%d: Dumping to fd %d", __func__, mId, fd);
478*e01b6f76SAndroid Build Coastguard Worker     ATRACE_CALL();
479*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mDeviceLock);
480*e01b6f76SAndroid Build Coastguard Worker 
481*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Camera ID: %d (Busy: %d)\n", mId, mBusy);
482*e01b6f76SAndroid Build Coastguard Worker 
483*e01b6f76SAndroid Build Coastguard Worker     // TODO: dump all settings
484*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Most Recent Settings: (%p)\n", mSettings);
485*e01b6f76SAndroid Build Coastguard Worker 
486*e01b6f76SAndroid Build Coastguard Worker     dprintf(fd, "Number of streams: %d\n", mNumStreams);
487*e01b6f76SAndroid Build Coastguard Worker     for (int i = 0; i < mNumStreams; i++) {
488*e01b6f76SAndroid Build Coastguard Worker         dprintf(fd, "Stream %d/%d:\n", i, mNumStreams);
489*e01b6f76SAndroid Build Coastguard Worker         mStreams[i]->dump(fd);
490*e01b6f76SAndroid Build Coastguard Worker     }
491*e01b6f76SAndroid Build Coastguard Worker }
492*e01b6f76SAndroid Build Coastguard Worker 
templateToString(int type)493*e01b6f76SAndroid Build Coastguard Worker const char* Camera::templateToString(int type)
494*e01b6f76SAndroid Build Coastguard Worker {
495*e01b6f76SAndroid Build Coastguard Worker     switch (type) {
496*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_TEMPLATE_PREVIEW:
497*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_TEMPLATE_PREVIEW";
498*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_TEMPLATE_STILL_CAPTURE:
499*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_TEMPLATE_STILL_CAPTURE";
500*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_TEMPLATE_VIDEO_RECORD:
501*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_TEMPLATE_VIDEO_RECORD";
502*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
503*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_TEMPLATE_VIDEO_SNAPSHOT";
504*e01b6f76SAndroid Build Coastguard Worker     case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
505*e01b6f76SAndroid Build Coastguard Worker         return "CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG";
506*e01b6f76SAndroid Build Coastguard Worker     }
507*e01b6f76SAndroid Build Coastguard Worker     // TODO: support vendor templates
508*e01b6f76SAndroid Build Coastguard Worker     return "Invalid template type!";
509*e01b6f76SAndroid Build Coastguard Worker }
510*e01b6f76SAndroid Build Coastguard Worker 
setTemplate(int type,camera_metadata_t * settings)511*e01b6f76SAndroid Build Coastguard Worker int Camera::setTemplate(int type, camera_metadata_t *settings)
512*e01b6f76SAndroid Build Coastguard Worker {
513*e01b6f76SAndroid Build Coastguard Worker     android::Mutex::Autolock al(mDeviceLock);
514*e01b6f76SAndroid Build Coastguard Worker 
515*e01b6f76SAndroid Build Coastguard Worker     if (!isValidTemplateType(type)) {
516*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Invalid template request type: %d", __func__, mId, type);
517*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
518*e01b6f76SAndroid Build Coastguard Worker     }
519*e01b6f76SAndroid Build Coastguard Worker 
520*e01b6f76SAndroid Build Coastguard Worker     if (mTemplates[type] != NULL) {
521*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Setting already constructed template type %s(%d)",
522*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, templateToString(type), type);
523*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
524*e01b6f76SAndroid Build Coastguard Worker     }
525*e01b6f76SAndroid Build Coastguard Worker 
526*e01b6f76SAndroid Build Coastguard Worker     // Make a durable copy of the underlying metadata
527*e01b6f76SAndroid Build Coastguard Worker     mTemplates[type] = clone_camera_metadata(settings);
528*e01b6f76SAndroid Build Coastguard Worker     if (mTemplates[type] == NULL) {
529*e01b6f76SAndroid Build Coastguard Worker         ALOGE("%s:%d: Failed to clone metadata %p for template type %s(%d)",
530*e01b6f76SAndroid Build Coastguard Worker                 __func__, mId, settings, templateToString(type), type);
531*e01b6f76SAndroid Build Coastguard Worker         return -EINVAL;
532*e01b6f76SAndroid Build Coastguard Worker     }
533*e01b6f76SAndroid Build Coastguard Worker     return 0;
534*e01b6f76SAndroid Build Coastguard Worker }
535*e01b6f76SAndroid Build Coastguard Worker 
536*e01b6f76SAndroid Build Coastguard Worker extern "C" {
537*e01b6f76SAndroid Build Coastguard Worker // Get handle to camera from device priv data
camdev_to_camera(const camera3_device_t * dev)538*e01b6f76SAndroid Build Coastguard Worker static Camera *camdev_to_camera(const camera3_device_t *dev)
539*e01b6f76SAndroid Build Coastguard Worker {
540*e01b6f76SAndroid Build Coastguard Worker     return reinterpret_cast<Camera*>(dev->priv);
541*e01b6f76SAndroid Build Coastguard Worker }
542*e01b6f76SAndroid Build Coastguard Worker 
initialize(const camera3_device_t * dev,const camera3_callback_ops_t * callback_ops)543*e01b6f76SAndroid Build Coastguard Worker static int initialize(const camera3_device_t *dev,
544*e01b6f76SAndroid Build Coastguard Worker         const camera3_callback_ops_t *callback_ops)
545*e01b6f76SAndroid Build Coastguard Worker {
546*e01b6f76SAndroid Build Coastguard Worker     return camdev_to_camera(dev)->initialize(callback_ops);
547*e01b6f76SAndroid Build Coastguard Worker }
548*e01b6f76SAndroid Build Coastguard Worker 
configure_streams(const camera3_device_t * dev,camera3_stream_configuration_t * stream_list)549*e01b6f76SAndroid Build Coastguard Worker static int configure_streams(const camera3_device_t *dev,
550*e01b6f76SAndroid Build Coastguard Worker         camera3_stream_configuration_t *stream_list)
551*e01b6f76SAndroid Build Coastguard Worker {
552*e01b6f76SAndroid Build Coastguard Worker     return camdev_to_camera(dev)->configureStreams(stream_list);
553*e01b6f76SAndroid Build Coastguard Worker }
554*e01b6f76SAndroid Build Coastguard Worker 
register_stream_buffers(const camera3_device_t * dev,const camera3_stream_buffer_set_t * buffer_set)555*e01b6f76SAndroid Build Coastguard Worker static int register_stream_buffers(const camera3_device_t *dev,
556*e01b6f76SAndroid Build Coastguard Worker         const camera3_stream_buffer_set_t *buffer_set)
557*e01b6f76SAndroid Build Coastguard Worker {
558*e01b6f76SAndroid Build Coastguard Worker     return camdev_to_camera(dev)->registerStreamBuffers(buffer_set);
559*e01b6f76SAndroid Build Coastguard Worker }
560*e01b6f76SAndroid Build Coastguard Worker 
construct_default_request_settings(const camera3_device_t * dev,int type)561*e01b6f76SAndroid Build Coastguard Worker static const camera_metadata_t *construct_default_request_settings(
562*e01b6f76SAndroid Build Coastguard Worker         const camera3_device_t *dev, int type)
563*e01b6f76SAndroid Build Coastguard Worker {
564*e01b6f76SAndroid Build Coastguard Worker     return camdev_to_camera(dev)->constructDefaultRequestSettings(type);
565*e01b6f76SAndroid Build Coastguard Worker }
566*e01b6f76SAndroid Build Coastguard Worker 
process_capture_request(const camera3_device_t * dev,camera3_capture_request_t * request)567*e01b6f76SAndroid Build Coastguard Worker static int process_capture_request(const camera3_device_t *dev,
568*e01b6f76SAndroid Build Coastguard Worker         camera3_capture_request_t *request)
569*e01b6f76SAndroid Build Coastguard Worker {
570*e01b6f76SAndroid Build Coastguard Worker     return camdev_to_camera(dev)->processCaptureRequest(request);
571*e01b6f76SAndroid Build Coastguard Worker }
572*e01b6f76SAndroid Build Coastguard Worker 
dump(const camera3_device_t * dev,int fd)573*e01b6f76SAndroid Build Coastguard Worker static void dump(const camera3_device_t *dev, int fd)
574*e01b6f76SAndroid Build Coastguard Worker {
575*e01b6f76SAndroid Build Coastguard Worker     camdev_to_camera(dev)->dump(fd);
576*e01b6f76SAndroid Build Coastguard Worker }
577*e01b6f76SAndroid Build Coastguard Worker 
flush(const camera3_device_t *)578*e01b6f76SAndroid Build Coastguard Worker static int flush(const camera3_device_t*)
579*e01b6f76SAndroid Build Coastguard Worker {
580*e01b6f76SAndroid Build Coastguard Worker     ALOGE("%s: unimplemented.", __func__);
581*e01b6f76SAndroid Build Coastguard Worker     return -1;
582*e01b6f76SAndroid Build Coastguard Worker }
583*e01b6f76SAndroid Build Coastguard Worker 
584*e01b6f76SAndroid Build Coastguard Worker } // extern "C"
585*e01b6f76SAndroid Build Coastguard Worker 
586*e01b6f76SAndroid Build Coastguard Worker const camera3_device_ops_t Camera::sOps = {
587*e01b6f76SAndroid Build Coastguard Worker     .initialize = default_camera_hal::initialize,
588*e01b6f76SAndroid Build Coastguard Worker     .configure_streams = default_camera_hal::configure_streams,
589*e01b6f76SAndroid Build Coastguard Worker     .register_stream_buffers = default_camera_hal::register_stream_buffers,
590*e01b6f76SAndroid Build Coastguard Worker     .construct_default_request_settings
591*e01b6f76SAndroid Build Coastguard Worker         = default_camera_hal::construct_default_request_settings,
592*e01b6f76SAndroid Build Coastguard Worker     .process_capture_request = default_camera_hal::process_capture_request,
593*e01b6f76SAndroid Build Coastguard Worker     .get_metadata_vendor_tag_ops = NULL,
594*e01b6f76SAndroid Build Coastguard Worker     .dump = default_camera_hal::dump,
595*e01b6f76SAndroid Build Coastguard Worker     .flush = default_camera_hal::flush,
596*e01b6f76SAndroid Build Coastguard Worker     .reserved = {0},
597*e01b6f76SAndroid Build Coastguard Worker };
598*e01b6f76SAndroid Build Coastguard Worker 
599*e01b6f76SAndroid Build Coastguard Worker } // namespace default_camera_hal
600