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