• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * Contains implementation of a class EmulatedCamera that encapsulates
19  * functionality common to all version 2.0 emulated camera devices.  Instances
20  * of this class (for each emulated camera) are created during the construction
21  * of the EmulatedCameraFactory instance.  This class serves as an entry point
22  * for all camera API calls that defined by camera2_device_ops_t API.
23  */
24 
25 #define LOG_NDEBUG 0
26 #define LOG_TAG "EmulatedCamera2_Camera"
27 #include <cutils/log.h>
28 
29 #include "EmulatedCamera2.h"
30 #include "system/camera_metadata.h"
31 
32 namespace android {
33 
34 /* Constructs EmulatedCamera2 instance.
35  * Param:
36  *  cameraId - Zero based camera identifier, which is an index of the camera
37  *      instance in camera factory's array.
38  *  module - Emulated camera HAL module descriptor.
39  */
EmulatedCamera2(int cameraId,struct hw_module_t * module)40 EmulatedCamera2::EmulatedCamera2(int cameraId,
41         struct hw_module_t* module):
42         EmulatedBaseCamera(cameraId,
43                 CAMERA_DEVICE_API_VERSION_2_0,
44                 &common,
45                 module)
46 {
47     common.close = EmulatedCamera2::close;
48     ops = &sDeviceOps;
49     priv = this;
50 
51     mRequestQueueDstOps.notify_queue_not_empty =
52             EmulatedCamera2::request_queue_notify_queue_not_empty;
53     mRequestQueueDstOps.parent                 = this;
54 
55     mRequestQueueDstOps.notify_queue_not_empty =
56             EmulatedCamera2::reprocess_queue_notify_queue_not_empty;
57     mReprocessQueueDstOps.parent               = this;
58 
59     mFrameQueueSrcOps.buffer_count = EmulatedCamera2::frame_queue_buffer_count;
60     mFrameQueueSrcOps.dequeue      = EmulatedCamera2::frame_queue_dequeue;
61     mFrameQueueSrcOps.free         = EmulatedCamera2::frame_queue_free;
62     mFrameQueueSrcOps.parent       = this;
63 
64     mReprocessStreamOps.dequeue_buffer =
65             EmulatedCamera2::reprocess_stream_dequeue_buffer;
66     mReprocessStreamOps.enqueue_buffer =
67             EmulatedCamera2::reprocess_stream_enqueue_buffer;
68     mReprocessStreamOps.cancel_buffer =
69             EmulatedCamera2::reprocess_stream_cancel_buffer;
70     mReprocessStreamOps.set_buffer_count =
71             EmulatedCamera2::reprocess_stream_set_buffer_count;
72     mReprocessStreamOps.set_crop = EmulatedCamera2::reprocess_stream_set_crop;
73     mReprocessStreamOps.set_timestamp =
74             EmulatedCamera2::reprocess_stream_set_timestamp;
75     mReprocessStreamOps.set_usage = EmulatedCamera2::reprocess_stream_set_usage;
76     mReprocessStreamOps.get_min_undequeued_buffer_count =
77             EmulatedCamera2::reprocess_stream_get_min_undequeued_buffer_count;
78     mReprocessStreamOps.lock_buffer =
79             EmulatedCamera2::reprocess_stream_lock_buffer;
80     mReprocessStreamOps.parent   = this;
81 
82     mVendorTagOps.get_camera_vendor_section_name =
83             EmulatedCamera2::get_camera_vendor_section_name;
84     mVendorTagOps.get_camera_vendor_tag_name =
85             EmulatedCamera2::get_camera_vendor_tag_name;
86     mVendorTagOps.get_camera_vendor_tag_type =
87             EmulatedCamera2::get_camera_vendor_tag_type;
88     mVendorTagOps.parent = this;
89 }
90 
91 /* Destructs EmulatedCamera2 instance. */
~EmulatedCamera2()92 EmulatedCamera2::~EmulatedCamera2() {
93 }
94 
95 /****************************************************************************
96  * Abstract API
97  ***************************************************************************/
98 
99 /****************************************************************************
100  * Public API
101  ***************************************************************************/
102 
Initialize()103 status_t EmulatedCamera2::Initialize() {
104     return NO_ERROR;
105 }
106 
107 /****************************************************************************
108  * Camera API implementation
109  ***************************************************************************/
110 
connectCamera(hw_device_t ** device)111 status_t EmulatedCamera2::connectCamera(hw_device_t** device) {
112     return NO_ERROR;
113 }
114 
closeCamera()115 status_t EmulatedCamera2::closeCamera() {
116     return NO_ERROR;
117 }
118 
getCameraInfo(struct camera_info * info)119 status_t EmulatedCamera2::getCameraInfo(struct camera_info* info) {
120 
121     return EmulatedBaseCamera::getCameraInfo(info);
122 }
123 
124 /****************************************************************************
125  * Camera API implementation.
126  * These methods are called from the camera API callback routines.
127  ***************************************************************************/
128 
129 /** Request input queue */
130 
setRequestQueueSrcOps(camera2_metadata_queue_src_ops * request_queue_src_ops)131 int EmulatedCamera2::setRequestQueueSrcOps(
132     camera2_metadata_queue_src_ops *request_queue_src_ops) {
133     return NO_ERROR;
134 }
135 
requestQueueNotifyNotEmpty()136 int EmulatedCamera2::requestQueueNotifyNotEmpty() {
137     return NO_ERROR;
138 }
139 
140 /** Reprocessing input queue */
141 
setReprocessQueueSrcOps(camera2_metadata_queue_src_ops * reprocess_queue_src_ops)142 int EmulatedCamera2::setReprocessQueueSrcOps(
143     camera2_metadata_queue_src_ops *reprocess_queue_src_ops) {
144     return NO_ERROR;
145 }
146 
reprocessQueueNotifyNotEmpty()147 int EmulatedCamera2::reprocessQueueNotifyNotEmpty() {
148     return NO_ERROR;
149 }
150 
151 /** Frame output queue */
152 
setFrameQueueDstOps(camera2_metadata_queue_dst_ops * frame_queue_dst_ops)153 int EmulatedCamera2::setFrameQueueDstOps(camera2_metadata_queue_dst_ops *frame_queue_dst_ops) {
154     return NO_ERROR;
155 }
156 
frameQueueBufferCount()157 int EmulatedCamera2::frameQueueBufferCount() {
158     return NO_ERROR;
159 }
frameQueueDequeue(camera_metadata_t ** buffer)160 int EmulatedCamera2::frameQueueDequeue(camera_metadata_t **buffer) {
161     return NO_ERROR;
162 }
frameQueueFree(camera_metadata_t * old_buffer)163 int EmulatedCamera2::frameQueueFree(camera_metadata_t *old_buffer) {
164     return NO_ERROR;
165 }
166 
167 /** Notifications to application */
setNotifyCallback(camera2_notify_callback notify_cb)168 int EmulatedCamera2::setNotifyCallback(camera2_notify_callback notify_cb) {
169     return NO_ERROR;
170 }
171 
172 /** Count of requests in flight */
getInProgressCount()173 int EmulatedCamera2::getInProgressCount() {
174     return NO_ERROR;
175 }
176 
177 /** Cancel all captures in flight */
flushCapturesInProgress()178 int EmulatedCamera2::flushCapturesInProgress() {
179     return NO_ERROR;
180 }
181 
182 /** Reprocessing input stream management */
reprocessStreamDequeueBuffer(buffer_handle_t ** buffer,int * stride)183 int EmulatedCamera2::reprocessStreamDequeueBuffer(buffer_handle_t** buffer,
184         int *stride) {
185     return NO_ERROR;
186 }
187 
reprocessStreamEnqueueBuffer(buffer_handle_t * buffer)188 int EmulatedCamera2::reprocessStreamEnqueueBuffer(buffer_handle_t* buffer) {
189     return NO_ERROR;
190 }
191 
reprocessStreamCancelBuffer(buffer_handle_t * buffer)192 int EmulatedCamera2::reprocessStreamCancelBuffer(buffer_handle_t* buffer) {
193     return NO_ERROR;
194 }
195 
reprocessStreamSetBufferCount(int count)196 int EmulatedCamera2::reprocessStreamSetBufferCount(int count) {
197     return NO_ERROR;
198 }
199 
reprocessStreamSetCrop(int left,int top,int right,int bottom)200 int EmulatedCamera2::reprocessStreamSetCrop(int left, int top, int right, int bottom) {
201     return NO_ERROR;
202 }
203 
reprocessStreamSetTimestamp(int64_t timestamp)204 int EmulatedCamera2::reprocessStreamSetTimestamp(int64_t timestamp) {
205     return NO_ERROR;
206 }
207 
reprocessStreamSetUsage(int usage)208 int EmulatedCamera2::reprocessStreamSetUsage(int usage) {
209     return NO_ERROR;
210 }
211 
reprocessStreamSetSwapInterval(int interval)212 int EmulatedCamera2::reprocessStreamSetSwapInterval(int interval) {
213     return NO_ERROR;
214 }
215 
reprocessStreamGetMinUndequeuedBufferCount(int * count)216 int EmulatedCamera2::reprocessStreamGetMinUndequeuedBufferCount(int *count) {
217     return NO_ERROR;
218 }
219 
reprocessStreamLockBuffer(buffer_handle_t * buffer)220 int EmulatedCamera2::reprocessStreamLockBuffer(buffer_handle_t *buffer) {
221     return NO_ERROR;
222 }
223 
224 /** Output stream creation and management */
225 
getStreamSlotCount()226 int EmulatedCamera2::getStreamSlotCount() {
227     return NO_ERROR;
228 }
229 
allocateStream(uint32_t stream_slot,uint32_t width,uint32_t height,int format,camera2_stream_ops_t * stream_ops)230 int EmulatedCamera2::allocateStream(uint32_t stream_slot,
231         uint32_t width,
232         uint32_t height,
233         int format,
234         camera2_stream_ops_t *stream_ops) {
235     return NO_ERROR;
236 }
237 
releaseStream(uint32_t stream_slot)238 int EmulatedCamera2::releaseStream(uint32_t stream_slot) {
239     return NO_ERROR;
240 }
241 
242 /** Custom tag query methods */
243 
getVendorSectionName(uint32_t tag)244 const char* EmulatedCamera2::getVendorSectionName(uint32_t tag) {
245     return NULL;
246 }
247 
getVendorTagName(uint32_t tag)248 const char* EmulatedCamera2::getVendorTagName(uint32_t tag) {
249     return NULL;
250 }
251 
getVendorTagType(uint32_t tag)252 int EmulatedCamera2::getVendorTagType(uint32_t tag) {
253     return -1;
254 }
255 
256 /** Shutdown and debug methods */
257 
release()258 int EmulatedCamera2::release() {
259     return NO_ERROR;
260 }
261 
dump(int fd)262 int EmulatedCamera2::dump(int fd) {
263     return NO_ERROR;
264 }
265 
266 /****************************************************************************
267  * Private API.
268  ***************************************************************************/
269 
270 /****************************************************************************
271  * Camera API callbacks as defined by camera2_device_ops structure.  See
272  * hardware/libhardware/include/hardware/camera2.h for information on each
273  * of these callbacks. Implemented in this class, these callbacks simply
274  * dispatch the call into an instance of EmulatedCamera2 class defined by the
275  * 'camera_device2' parameter.
276  ***************************************************************************/
277 
set_request_queue_src_ops(struct camera2_device * d,camera2_metadata_queue_src_ops * queue_src_ops)278 int EmulatedCamera2::set_request_queue_src_ops(struct camera2_device *d,
279         camera2_metadata_queue_src_ops *queue_src_ops) {
280     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
281     return ec->setRequestQueueSrcOps(queue_src_ops);
282 }
283 
get_request_queue_dst_ops(struct camera2_device * d,camera2_metadata_queue_dst_ops ** queue_dst_ops)284 int EmulatedCamera2::get_request_queue_dst_ops(struct camera2_device *d,
285         camera2_metadata_queue_dst_ops **queue_dst_ops) {
286     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
287     *queue_dst_ops = static_cast<camera2_metadata_queue_dst_ops*>(
288         &ec->mRequestQueueDstOps);
289     return NO_ERROR;
290 }
291 
request_queue_notify_queue_not_empty(camera2_metadata_queue_dst_ops * q)292 int EmulatedCamera2::request_queue_notify_queue_not_empty(
293         camera2_metadata_queue_dst_ops *q) {
294     EmulatedCamera2* ec = static_cast<QueueDstOps*>(q)->parent;
295     return ec->requestQueueNotifyNotEmpty();
296 }
297 
set_reprocess_queue_src_ops(struct camera2_device * d,camera2_metadata_queue_src_ops * queue_src_ops)298 int EmulatedCamera2::set_reprocess_queue_src_ops(struct camera2_device *d,
299         camera2_metadata_queue_src_ops *queue_src_ops) {
300     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
301     return ec->setReprocessQueueSrcOps(queue_src_ops);
302 }
303 
get_reprocess_queue_dst_ops(struct camera2_device * d,camera2_metadata_queue_dst_ops ** queue_dst_ops)304 int EmulatedCamera2::get_reprocess_queue_dst_ops(struct camera2_device *d,
305         camera2_metadata_queue_dst_ops **queue_dst_ops) {
306     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
307     *queue_dst_ops = static_cast<camera2_metadata_queue_dst_ops*>(
308         &ec->mReprocessQueueDstOps);
309     return NO_ERROR;
310 }
311 
reprocess_queue_notify_queue_not_empty(camera2_metadata_queue_dst_ops * q)312 int EmulatedCamera2::reprocess_queue_notify_queue_not_empty(
313         camera2_metadata_queue_dst_ops *q) {
314     EmulatedCamera2* ec = static_cast<QueueDstOps*>(q)->parent;
315     return ec->reprocessQueueNotifyNotEmpty();
316 }
317 
set_frame_queue_dst_ops(struct camera2_device * d,camera2_metadata_queue_dst_ops * queue_dst_ops)318 int EmulatedCamera2::set_frame_queue_dst_ops(struct camera2_device *d,
319         camera2_metadata_queue_dst_ops *queue_dst_ops) {
320     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
321     return ec->setFrameQueueDstOps(queue_dst_ops);
322 }
323 
get_frame_queue_src_ops(struct camera2_device * d,camera2_metadata_queue_src_ops ** queue_src_ops)324 int EmulatedCamera2::get_frame_queue_src_ops(struct camera2_device *d,
325         camera2_metadata_queue_src_ops **queue_src_ops) {
326     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
327     *queue_src_ops = static_cast<camera2_metadata_queue_src_ops*>(
328         &ec->mFrameQueueSrcOps);
329     return NO_ERROR;
330 }
331 
frame_queue_buffer_count(camera2_metadata_queue_src_ops * q)332 int EmulatedCamera2::frame_queue_buffer_count(camera2_metadata_queue_src_ops *q) {
333     EmulatedCamera2 *ec = static_cast<QueueSrcOps*>(q)->parent;
334     return ec->frameQueueBufferCount();
335 }
336 
frame_queue_dequeue(camera2_metadata_queue_src_ops * q,camera_metadata_t ** buffer)337 int EmulatedCamera2::frame_queue_dequeue(camera2_metadata_queue_src_ops *q,
338         camera_metadata_t **buffer) {
339     EmulatedCamera2 *ec = static_cast<QueueSrcOps*>(q)->parent;
340     return ec->frameQueueDequeue(buffer);
341 }
342 
frame_queue_free(camera2_metadata_queue_src_ops * q,camera_metadata_t * old_buffer)343 int EmulatedCamera2::frame_queue_free(camera2_metadata_queue_src_ops *q,
344         camera_metadata_t *old_buffer) {
345     EmulatedCamera2 *ec = static_cast<QueueSrcOps*>(q)->parent;
346     return ec->frameQueueFree(old_buffer);
347 }
348 
set_notify_callback(struct camera2_device * d,camera2_notify_callback notify_cb)349 int EmulatedCamera2::set_notify_callback(struct camera2_device *d,
350         camera2_notify_callback notify_cb) {
351     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
352     return ec->setNotifyCallback(notify_cb);
353 }
354 
get_in_progress_count(struct camera2_device * d)355 int EmulatedCamera2::get_in_progress_count(struct camera2_device *d) {
356     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
357     return ec->getInProgressCount();
358 }
359 
flush_captures_in_progress(struct camera2_device * d)360 int EmulatedCamera2::flush_captures_in_progress(struct camera2_device *d) {
361     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
362     return ec->flushCapturesInProgress();
363 }
364 
get_reprocess_stream_ops(camera2_device_t * d,camera2_stream_ops ** stream)365 int EmulatedCamera2::get_reprocess_stream_ops(camera2_device_t *d,
366         camera2_stream_ops **stream) {
367     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
368     *stream = static_cast<camera2_stream_ops*>(&ec->mReprocessStreamOps);
369     return NO_ERROR;
370 }
371 
reprocess_stream_dequeue_buffer(camera2_stream_ops * s,buffer_handle_t ** buffer,int * stride)372 int EmulatedCamera2::reprocess_stream_dequeue_buffer(camera2_stream_ops *s,
373         buffer_handle_t** buffer, int *stride) {
374     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
375     return ec->reprocessStreamDequeueBuffer(buffer, stride);
376 }
377 
reprocess_stream_enqueue_buffer(camera2_stream_ops * s,buffer_handle_t * buffer)378 int EmulatedCamera2::reprocess_stream_enqueue_buffer(camera2_stream_ops *s,
379         buffer_handle_t* buffer) {
380     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
381     return ec->reprocessStreamEnqueueBuffer(buffer);
382 }
383 
reprocess_stream_cancel_buffer(camera2_stream_ops * s,buffer_handle_t * buffer)384 int EmulatedCamera2::reprocess_stream_cancel_buffer(camera2_stream_ops *s,
385         buffer_handle_t* buffer) {
386     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
387     return ec->reprocessStreamCancelBuffer(buffer);
388 }
389 
reprocess_stream_set_buffer_count(camera2_stream_ops * s,int count)390 int EmulatedCamera2::reprocess_stream_set_buffer_count(camera2_stream_ops *s,
391         int count) {
392     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
393     return ec->reprocessStreamSetBufferCount(count);
394 }
395 
reprocess_stream_set_crop(camera2_stream_ops * s,int left,int top,int right,int bottom)396 int EmulatedCamera2::reprocess_stream_set_crop(camera2_stream_ops *s,
397         int left, int top, int right, int bottom) {
398     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
399     return ec->reprocessStreamSetCrop(left, top, right, bottom);
400 }
401 
reprocess_stream_set_timestamp(camera2_stream_ops * s,int64_t timestamp)402 int EmulatedCamera2::reprocess_stream_set_timestamp(camera2_stream_ops *s,
403         int64_t timestamp) {
404     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
405     return ec->reprocessStreamSetTimestamp(timestamp);
406 }
407 
reprocess_stream_set_usage(camera2_stream_ops * s,int usage)408 int EmulatedCamera2::reprocess_stream_set_usage(camera2_stream_ops *s,
409         int usage) {
410     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
411     return ec->reprocessStreamSetUsage(usage);
412 }
413 
reprocess_stream_set_swap_interval(camera2_stream_ops * s,int interval)414 int EmulatedCamera2::reprocess_stream_set_swap_interval(camera2_stream_ops *s,
415         int interval) {
416     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
417     return ec->reprocessStreamSetSwapInterval(interval);
418 }
419 
reprocess_stream_get_min_undequeued_buffer_count(const camera2_stream_ops * s,int * count)420 int EmulatedCamera2::reprocess_stream_get_min_undequeued_buffer_count(
421         const camera2_stream_ops *s,
422         int *count) {
423     EmulatedCamera2* ec = static_cast<const StreamOps*>(s)->parent;
424     return ec->reprocessStreamGetMinUndequeuedBufferCount(count);
425 }
426 
reprocess_stream_lock_buffer(camera2_stream_ops * s,buffer_handle_t * buffer)427 int EmulatedCamera2::reprocess_stream_lock_buffer(camera2_stream_ops *s,
428         buffer_handle_t* buffer) {
429     EmulatedCamera2* ec = static_cast<StreamOps*>(s)->parent;
430     return ec->reprocessStreamLockBuffer(buffer);
431 }
432 
get_stream_slot_count(struct camera2_device * d)433 int EmulatedCamera2::get_stream_slot_count(struct camera2_device *d) {
434     EmulatedCamera2* ec =
435             static_cast<EmulatedCamera2*>(d);
436     return ec->getStreamSlotCount();
437 }
438 
allocate_stream(struct camera2_device * d,uint32_t stream_slot,uint32_t width,uint32_t height,uint32_t format,camera2_stream_ops_t * stream_ops)439 int EmulatedCamera2::allocate_stream(struct camera2_device *d,
440         uint32_t stream_slot,
441         uint32_t width,
442         uint32_t height,
443         uint32_t format,
444         camera2_stream_ops_t *stream_ops) {
445     EmulatedCamera2* ec =
446             static_cast<EmulatedCamera2*>(d);
447     return ec->allocateStream(stream_slot, width, height, format, stream_ops);
448 }
449 
release_stream(struct camera2_device * d,uint32_t stream_slot)450 int EmulatedCamera2::release_stream(struct camera2_device *d,
451         uint32_t stream_slot) {
452     EmulatedCamera2* ec =
453             static_cast<EmulatedCamera2*>(d);
454     return ec->releaseStream(stream_slot);
455 }
456 
release(struct camera2_device * d)457 void EmulatedCamera2::release(struct camera2_device *d) {
458     EmulatedCamera2* ec =
459             static_cast<EmulatedCamera2*>(d);
460     ec->release();
461 }
462 
dump(struct camera2_device * d,int fd)463 int EmulatedCamera2::dump(struct camera2_device *d, int fd) {
464     EmulatedCamera2* ec =
465             static_cast<EmulatedCamera2*>(d);
466     return ec->dump(fd);
467 }
468 
close(struct hw_device_t * device)469 int EmulatedCamera2::close(struct hw_device_t* device) {
470     EmulatedCamera2* ec =
471             static_cast<EmulatedCamera2*>(
472                 reinterpret_cast<struct camera2_device*>(device) );
473     if (ec == NULL) {
474         ALOGE("%s: Unexpected NULL camera2 device", __FUNCTION__);
475         return -EINVAL;
476     }
477     return ec->closeCamera();
478 }
479 
get_metadata_vendor_tag_ops(struct camera2_device * d,vendor_tag_query_ops_t ** ops)480 int EmulatedCamera2::get_metadata_vendor_tag_ops(struct camera2_device *d,
481         vendor_tag_query_ops_t **ops) {
482     EmulatedCamera2* ec = static_cast<EmulatedCamera2*>(d);
483     *ops = static_cast<vendor_tag_query_ops_t*>(
484             &ec->mVendorTagOps);
485     return NO_ERROR;
486 }
487 
get_camera_vendor_section_name(const vendor_tag_query_ops_t * v,uint32_t tag)488 const char* EmulatedCamera2::get_camera_vendor_section_name(
489         const vendor_tag_query_ops_t *v,
490         uint32_t tag) {
491     EmulatedCamera2* ec = static_cast<const TagOps*>(v)->parent;
492     return ec->getVendorSectionName(tag);
493 }
494 
get_camera_vendor_tag_name(const vendor_tag_query_ops_t * v,uint32_t tag)495 const char* EmulatedCamera2::get_camera_vendor_tag_name(
496         const vendor_tag_query_ops_t *v,
497         uint32_t tag) {
498     EmulatedCamera2* ec = static_cast<const TagOps*>(v)->parent;
499     return ec->getVendorTagName(tag);
500 }
501 
get_camera_vendor_tag_type(const vendor_tag_query_ops_t * v,uint32_t tag)502 int EmulatedCamera2::get_camera_vendor_tag_type(
503         const vendor_tag_query_ops_t *v,
504         uint32_t tag)  {
505     EmulatedCamera2* ec = static_cast<const TagOps*>(v)->parent;
506     return ec->getVendorTagType(tag);
507 }
508 
509 camera2_device_ops_t EmulatedCamera2::sDeviceOps = {
510     EmulatedCamera2::set_request_queue_src_ops,
511     EmulatedCamera2::get_request_queue_dst_ops,
512     EmulatedCamera2::set_reprocess_queue_src_ops,
513     EmulatedCamera2::get_reprocess_queue_dst_ops,
514     EmulatedCamera2::set_frame_queue_dst_ops,
515     EmulatedCamera2::get_frame_queue_src_ops,
516     EmulatedCamera2::set_notify_callback,
517     EmulatedCamera2::get_in_progress_count,
518     EmulatedCamera2::flush_captures_in_progress,
519     EmulatedCamera2::get_reprocess_stream_ops,
520     EmulatedCamera2::get_stream_slot_count,
521     EmulatedCamera2::allocate_stream,
522     EmulatedCamera2::release_stream,
523     EmulatedCamera2::get_metadata_vendor_tag_ops,
524     EmulatedCamera2::release,
525     EmulatedCamera2::dump
526 };
527 
528 }; /* namespace android */
529