• 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 #define LOG_TAG "Camera2-Device"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 //#define LOG_NDEBUG 0
20 //#define LOG_NNDEBUG 0  // Per-frame verbose logging
21 
22 #ifdef LOG_NNDEBUG
23 #define ALOGVV(...) ALOGV(__VA_ARGS__)
24 #else
25 #define ALOGVV(...) ((void)0)
26 #endif
27 
28 #include <inttypes.h>
29 #include <utils/Log.h>
30 #include <utils/Trace.h>
31 #include <utils/Timers.h>
32 #include "Camera2Device.h"
33 #include "CameraService.h"
34 
35 namespace android {
36 
Camera2Device(int id)37 Camera2Device::Camera2Device(int id):
38         mId(id),
39         mHal2Device(NULL)
40 {
41     ATRACE_CALL();
42     ALOGV("%s: Created device for camera %d", __FUNCTION__, id);
43 }
44 
~Camera2Device()45 Camera2Device::~Camera2Device()
46 {
47     ATRACE_CALL();
48     ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId);
49     disconnect();
50 }
51 
getId() const52 int Camera2Device::getId() const {
53     return mId;
54 }
55 
initialize(camera_module_t * module)56 status_t Camera2Device::initialize(camera_module_t *module)
57 {
58     ATRACE_CALL();
59     ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId);
60     if (mHal2Device != NULL) {
61         ALOGE("%s: Already initialized!", __FUNCTION__);
62         return INVALID_OPERATION;
63     }
64 
65     status_t res;
66     char name[10];
67     snprintf(name, sizeof(name), "%d", mId);
68 
69     camera2_device_t *device;
70 
71     res = CameraService::filterOpenErrorCode(module->common.methods->open(
72         &module->common, name, reinterpret_cast<hw_device_t**>(&device)));
73 
74     if (res != OK) {
75         ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__,
76                 mId, strerror(-res), res);
77         return res;
78     }
79 
80     if (device->common.version != CAMERA_DEVICE_API_VERSION_2_0) {
81         ALOGE("%s: Could not open camera %d: "
82                 "Camera device is not version %x, reports %x instead",
83                 __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_2_0,
84                 device->common.version);
85         device->common.close(&device->common);
86         return BAD_VALUE;
87     }
88 
89     camera_info info;
90     res = module->get_camera_info(mId, &info);
91     if (res != OK ) return res;
92 
93     if (info.device_version != device->common.version) {
94         ALOGE("%s: HAL reporting mismatched camera_info version (%x)"
95                 " and device version (%x).", __FUNCTION__,
96                 device->common.version, info.device_version);
97         device->common.close(&device->common);
98         return BAD_VALUE;
99     }
100 
101     res = mRequestQueue.setConsumerDevice(device);
102     if (res != OK) {
103         ALOGE("%s: Camera %d: Unable to connect request queue to device: %s (%d)",
104                 __FUNCTION__, mId, strerror(-res), res);
105         device->common.close(&device->common);
106         return res;
107     }
108     res = mFrameQueue.setProducerDevice(device);
109     if (res != OK) {
110         ALOGE("%s: Camera %d: Unable to connect frame queue to device: %s (%d)",
111                 __FUNCTION__, mId, strerror(-res), res);
112         device->common.close(&device->common);
113         return res;
114     }
115 
116     res = device->ops->set_notify_callback(device, notificationCallback,
117             NULL);
118     if (res != OK) {
119         ALOGE("%s: Camera %d: Unable to initialize notification callback!",
120                 __FUNCTION__, mId);
121         device->common.close(&device->common);
122         return res;
123     }
124 
125     mDeviceInfo = info.static_camera_characteristics;
126     mHal2Device = device;
127     mDeviceVersion = device->common.version;
128 
129     return OK;
130 }
131 
disconnect()132 status_t Camera2Device::disconnect() {
133     ATRACE_CALL();
134     status_t res = OK;
135     if (mHal2Device) {
136         ALOGV("%s: Closing device for camera %d", __FUNCTION__, mId);
137 
138         int inProgressCount = mHal2Device->ops->get_in_progress_count(mHal2Device);
139         if (inProgressCount > 0) {
140             ALOGW("%s: Closing camera device %d with %d requests in flight!",
141                     __FUNCTION__, mId, inProgressCount);
142         }
143         mReprocessStreams.clear();
144         mStreams.clear();
145         res = mHal2Device->common.close(&mHal2Device->common);
146         if (res != OK) {
147             ALOGE("%s: Could not close camera %d: %s (%d)",
148                     __FUNCTION__,
149                     mId, strerror(-res), res);
150         }
151         mHal2Device = NULL;
152         ALOGV("%s: Shutdown complete", __FUNCTION__);
153     }
154     return res;
155 }
156 
dump(int fd,const Vector<String16> & args)157 status_t Camera2Device::dump(int fd, const Vector<String16>& args) {
158     ATRACE_CALL();
159     String8 result;
160     int detailLevel = 0;
161     int n = args.size();
162     String16 detailOption("-d");
163     for (int i = 0; i + 1 < n; i++) {
164         if (args[i] == detailOption) {
165             String8 levelStr(args[i+1]);
166             detailLevel = atoi(levelStr.string());
167         }
168     }
169 
170     result.appendFormat("  Camera2Device[%d] dump (detail level %d):\n",
171             mId, detailLevel);
172 
173     if (detailLevel > 0) {
174         result = "    Request queue contents:\n";
175         write(fd, result.string(), result.size());
176         mRequestQueue.dump(fd, args);
177 
178         result = "    Frame queue contents:\n";
179         write(fd, result.string(), result.size());
180         mFrameQueue.dump(fd, args);
181     }
182 
183     result = "    Active streams:\n";
184     write(fd, result.string(), result.size());
185     for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) {
186         (*s)->dump(fd, args);
187     }
188 
189     result = "    HAL device dump:\n";
190     write(fd, result.string(), result.size());
191 
192     status_t res;
193     res = mHal2Device->ops->dump(mHal2Device, fd);
194 
195     return res;
196 }
197 
info() const198 const CameraMetadata& Camera2Device::info() const {
199     ALOGVV("%s: E", __FUNCTION__);
200 
201     return mDeviceInfo;
202 }
203 
capture(CameraMetadata & request,int64_t *)204 status_t Camera2Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) {
205     ATRACE_CALL();
206     ALOGV("%s: E", __FUNCTION__);
207 
208     mRequestQueue.enqueue(request.release());
209     return OK;
210 }
211 
captureList(const List<const CameraMetadata> & requests,int64_t *)212 status_t Camera2Device::captureList(const List<const CameraMetadata> &requests,
213                                     int64_t* /*lastFrameNumber*/) {
214     ATRACE_CALL();
215     ALOGE("%s: Camera2Device burst capture not implemented", __FUNCTION__);
216     return INVALID_OPERATION;
217 }
218 
setStreamingRequest(const CameraMetadata & request,int64_t *)219 status_t Camera2Device::setStreamingRequest(const CameraMetadata &request,
220                                             int64_t* /*lastFrameNumber*/) {
221     ATRACE_CALL();
222     ALOGV("%s: E", __FUNCTION__);
223     CameraMetadata streamRequest(request);
224     return mRequestQueue.setStreamSlot(streamRequest.release());
225 }
226 
setStreamingRequestList(const List<const CameraMetadata> & requests,int64_t *)227 status_t Camera2Device::setStreamingRequestList(const List<const CameraMetadata> &requests,
228                                                 int64_t* /*lastFrameNumber*/) {
229     ATRACE_CALL();
230     ALOGE("%s, Camera2Device streaming burst not implemented", __FUNCTION__);
231     return INVALID_OPERATION;
232 }
233 
clearStreamingRequest(int64_t *)234 status_t Camera2Device::clearStreamingRequest(int64_t* /*lastFrameNumber*/) {
235     ATRACE_CALL();
236     return mRequestQueue.setStreamSlot(NULL);
237 }
238 
waitUntilRequestReceived(int32_t requestId,nsecs_t timeout)239 status_t Camera2Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
240     ATRACE_CALL();
241     return mRequestQueue.waitForDequeue(requestId, timeout);
242 }
243 
createStream(sp<ANativeWindow> consumer,uint32_t width,uint32_t height,int format,int * id)244 status_t Camera2Device::createStream(sp<ANativeWindow> consumer,
245         uint32_t width, uint32_t height, int format, int *id) {
246     ATRACE_CALL();
247     status_t res;
248     ALOGV("%s: E", __FUNCTION__);
249 
250     sp<StreamAdapter> stream = new StreamAdapter(mHal2Device);
251     size_t size = 0;
252     if (format == HAL_PIXEL_FORMAT_BLOB) {
253         size = getJpegBufferSize(width, height);
254     }
255     res = stream->connectToDevice(consumer, width, height, format, size);
256     if (res != OK) {
257         ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):"
258                 "%s (%d)",
259                 __FUNCTION__, mId, width, height, format, strerror(-res), res);
260         return res;
261     }
262 
263     *id = stream->getId();
264 
265     mStreams.push_back(stream);
266     return OK;
267 }
268 
getJpegBufferSize(uint32_t width,uint32_t height) const269 ssize_t Camera2Device::getJpegBufferSize(uint32_t width, uint32_t height) const {
270     // Always give the max jpeg buffer size regardless of the actual jpeg resolution.
271     camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE);
272     if (jpegBufMaxSize.count == 0) {
273         ALOGE("%s: Camera %d: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId);
274         return BAD_VALUE;
275     }
276 
277     return jpegBufMaxSize.data.i32[0];
278 }
279 
createReprocessStreamFromStream(int outputId,int * id)280 status_t Camera2Device::createReprocessStreamFromStream(int outputId, int *id) {
281     ATRACE_CALL();
282     status_t res;
283     ALOGV("%s: E", __FUNCTION__);
284 
285     bool found = false;
286     StreamList::iterator streamI;
287     for (streamI = mStreams.begin();
288          streamI != mStreams.end(); streamI++) {
289         if ((*streamI)->getId() == outputId) {
290             found = true;
291             break;
292         }
293     }
294     if (!found) {
295         ALOGE("%s: Camera %d: Output stream %d doesn't exist; can't create "
296                 "reprocess stream from it!", __FUNCTION__, mId, outputId);
297         return BAD_VALUE;
298     }
299 
300     sp<ReprocessStreamAdapter> stream = new ReprocessStreamAdapter(mHal2Device);
301 
302     res = stream->connectToDevice((*streamI));
303     if (res != OK) {
304         ALOGE("%s: Camera %d: Unable to create reprocessing stream from "\
305                 "stream %d: %s (%d)", __FUNCTION__, mId, outputId,
306                 strerror(-res), res);
307         return res;
308     }
309 
310     *id = stream->getId();
311 
312     mReprocessStreams.push_back(stream);
313     return OK;
314 }
315 
316 
getStreamInfo(int id,uint32_t * width,uint32_t * height,uint32_t * format)317 status_t Camera2Device::getStreamInfo(int id,
318         uint32_t *width, uint32_t *height, uint32_t *format) {
319     ATRACE_CALL();
320     ALOGV("%s: E", __FUNCTION__);
321     bool found = false;
322     StreamList::iterator streamI;
323     for (streamI = mStreams.begin();
324          streamI != mStreams.end(); streamI++) {
325         if ((*streamI)->getId() == id) {
326             found = true;
327             break;
328         }
329     }
330     if (!found) {
331         ALOGE("%s: Camera %d: Stream %d does not exist",
332                 __FUNCTION__, mId, id);
333         return BAD_VALUE;
334     }
335 
336     if (width) *width = (*streamI)->getWidth();
337     if (height) *height = (*streamI)->getHeight();
338     if (format) *format = (*streamI)->getFormat();
339 
340     return OK;
341 }
342 
setStreamTransform(int id,int transform)343 status_t Camera2Device::setStreamTransform(int id,
344         int transform) {
345     ATRACE_CALL();
346     ALOGV("%s: E", __FUNCTION__);
347     bool found = false;
348     StreamList::iterator streamI;
349     for (streamI = mStreams.begin();
350          streamI != mStreams.end(); streamI++) {
351         if ((*streamI)->getId() == id) {
352             found = true;
353             break;
354         }
355     }
356     if (!found) {
357         ALOGE("%s: Camera %d: Stream %d does not exist",
358                 __FUNCTION__, mId, id);
359         return BAD_VALUE;
360     }
361 
362     return (*streamI)->setTransform(transform);
363 }
364 
deleteStream(int id)365 status_t Camera2Device::deleteStream(int id) {
366     ATRACE_CALL();
367     ALOGV("%s: E", __FUNCTION__);
368     bool found = false;
369     for (StreamList::iterator streamI = mStreams.begin();
370          streamI != mStreams.end(); streamI++) {
371         if ((*streamI)->getId() == id) {
372             status_t res = (*streamI)->release();
373             if (res != OK) {
374                 ALOGE("%s: Unable to release stream %d from HAL device: "
375                         "%s (%d)", __FUNCTION__, id, strerror(-res), res);
376                 return res;
377             }
378             mStreams.erase(streamI);
379             found = true;
380             break;
381         }
382     }
383     if (!found) {
384         ALOGE("%s: Camera %d: Unable to find stream %d to delete",
385                 __FUNCTION__, mId, id);
386         return BAD_VALUE;
387     }
388     return OK;
389 }
390 
deleteReprocessStream(int id)391 status_t Camera2Device::deleteReprocessStream(int id) {
392     ATRACE_CALL();
393     ALOGV("%s: E", __FUNCTION__);
394     bool found = false;
395     for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin();
396          streamI != mReprocessStreams.end(); streamI++) {
397         if ((*streamI)->getId() == id) {
398             status_t res = (*streamI)->release();
399             if (res != OK) {
400                 ALOGE("%s: Unable to release reprocess stream %d from "
401                         "HAL device: %s (%d)", __FUNCTION__, id,
402                         strerror(-res), res);
403                 return res;
404             }
405             mReprocessStreams.erase(streamI);
406             found = true;
407             break;
408         }
409     }
410     if (!found) {
411         ALOGE("%s: Camera %d: Unable to find stream %d to delete",
412                 __FUNCTION__, mId, id);
413         return BAD_VALUE;
414     }
415     return OK;
416 }
417 
configureStreams()418 status_t Camera2Device::configureStreams() {
419     ATRACE_CALL();
420     ALOGV("%s: E", __FUNCTION__);
421 
422     /**
423      * HAL2 devices do not need to configure streams;
424      * streams are created on the fly.
425      */
426     ALOGW("%s: No-op for HAL2 devices", __FUNCTION__);
427 
428     return OK;
429 }
430 
431 
createDefaultRequest(int templateId,CameraMetadata * request)432 status_t Camera2Device::createDefaultRequest(int templateId,
433         CameraMetadata *request) {
434     ATRACE_CALL();
435     status_t err;
436     ALOGV("%s: E", __FUNCTION__);
437     camera_metadata_t *rawRequest;
438     err = mHal2Device->ops->construct_default_request(
439         mHal2Device, templateId, &rawRequest);
440     request->acquire(rawRequest);
441     return err;
442 }
443 
waitUntilDrained()444 status_t Camera2Device::waitUntilDrained() {
445     ATRACE_CALL();
446     static const uint32_t kSleepTime = 50000; // 50 ms
447     static const uint32_t kMaxSleepTime = 10000000; // 10 s
448     ALOGV("%s: Camera %d: Starting wait", __FUNCTION__, mId);
449     if (mRequestQueue.getBufferCount() ==
450             CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION;
451 
452     // TODO: Set up notifications from HAL, instead of sleeping here
453     uint32_t totalTime = 0;
454     while (mHal2Device->ops->get_in_progress_count(mHal2Device) > 0) {
455         usleep(kSleepTime);
456         totalTime += kSleepTime;
457         if (totalTime > kMaxSleepTime) {
458             ALOGE("%s: Waited %d us, %d requests still in flight", __FUNCTION__,
459                     totalTime, mHal2Device->ops->get_in_progress_count(mHal2Device));
460             return TIMED_OUT;
461         }
462     }
463     ALOGV("%s: Camera %d: HAL is idle", __FUNCTION__, mId);
464     return OK;
465 }
466 
setNotifyCallback(NotificationListener * listener)467 status_t Camera2Device::setNotifyCallback(NotificationListener *listener) {
468     ATRACE_CALL();
469     status_t res;
470     res = mHal2Device->ops->set_notify_callback(mHal2Device, notificationCallback,
471             reinterpret_cast<void*>(listener) );
472     if (res != OK) {
473         ALOGE("%s: Unable to set notification callback!", __FUNCTION__);
474     }
475     return res;
476 }
477 
willNotify3A()478 bool Camera2Device::willNotify3A() {
479     return true;
480 }
481 
notificationCallback(int32_t msg_type,int32_t ext1,int32_t ext2,int32_t ext3,void * user)482 void Camera2Device::notificationCallback(int32_t msg_type,
483         int32_t ext1,
484         int32_t ext2,
485         int32_t ext3,
486         void *user) {
487     ATRACE_CALL();
488     NotificationListener *listener = reinterpret_cast<NotificationListener*>(user);
489     ALOGV("%s: Notification %d, arguments %d, %d, %d", __FUNCTION__, msg_type,
490             ext1, ext2, ext3);
491     if (listener != NULL) {
492         switch (msg_type) {
493             case CAMERA2_MSG_ERROR:
494                 // TODO: This needs to be fixed. ext2 and ext3 need to be considered.
495                 listener->notifyError(
496                         ((ext1 == CAMERA2_MSG_ERROR_DEVICE)
497                         || (ext1 == CAMERA2_MSG_ERROR_HARDWARE)) ?
498                                 ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE :
499                                 ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE,
500                         CaptureResultExtras());
501                 break;
502             case CAMERA2_MSG_SHUTTER: {
503                 // TODO: Only needed for camera2 API, which is unsupported
504                 // by HAL2 directly.
505                 // nsecs_t timestamp = (nsecs_t)ext2 | ((nsecs_t)(ext3) << 32 );
506                 // listener->notifyShutter(requestId, timestamp);
507                 break;
508             }
509             case CAMERA2_MSG_AUTOFOCUS:
510                 listener->notifyAutoFocus(ext1, ext2);
511                 break;
512             case CAMERA2_MSG_AUTOEXPOSURE:
513                 listener->notifyAutoExposure(ext1, ext2);
514                 break;
515             case CAMERA2_MSG_AUTOWB:
516                 listener->notifyAutoWhitebalance(ext1, ext2);
517                 break;
518             default:
519                 ALOGE("%s: Unknown notification %d (arguments %d, %d, %d)!",
520                         __FUNCTION__, msg_type, ext1, ext2, ext3);
521         }
522     }
523 }
524 
waitForNextFrame(nsecs_t timeout)525 status_t Camera2Device::waitForNextFrame(nsecs_t timeout) {
526     return mFrameQueue.waitForBuffer(timeout);
527 }
528 
getNextResult(CaptureResult * result)529 status_t Camera2Device::getNextResult(CaptureResult *result) {
530     ATRACE_CALL();
531     ALOGV("%s: get CaptureResult", __FUNCTION__);
532     if (result == NULL) {
533         ALOGE("%s: result pointer is NULL", __FUNCTION__);
534         return BAD_VALUE;
535     }
536     status_t res;
537     camera_metadata_t *rawFrame;
538     res = mFrameQueue.dequeue(&rawFrame);
539     if (rawFrame == NULL) {
540         return NOT_ENOUGH_DATA;
541     } else if (res == OK) {
542         result->mMetadata.acquire(rawFrame);
543     }
544 
545     return res;
546 }
547 
triggerAutofocus(uint32_t id)548 status_t Camera2Device::triggerAutofocus(uint32_t id) {
549     ATRACE_CALL();
550     status_t res;
551     ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
552     res = mHal2Device->ops->trigger_action(mHal2Device,
553             CAMERA2_TRIGGER_AUTOFOCUS, id, 0);
554     if (res != OK) {
555         ALOGE("%s: Error triggering autofocus (id %d)",
556                 __FUNCTION__, id);
557     }
558     return res;
559 }
560 
triggerCancelAutofocus(uint32_t id)561 status_t Camera2Device::triggerCancelAutofocus(uint32_t id) {
562     ATRACE_CALL();
563     status_t res;
564     ALOGV("%s: Canceling autofocus, id %d", __FUNCTION__, id);
565     res = mHal2Device->ops->trigger_action(mHal2Device,
566             CAMERA2_TRIGGER_CANCEL_AUTOFOCUS, id, 0);
567     if (res != OK) {
568         ALOGE("%s: Error canceling autofocus (id %d)",
569                 __FUNCTION__, id);
570     }
571     return res;
572 }
573 
triggerPrecaptureMetering(uint32_t id)574 status_t Camera2Device::triggerPrecaptureMetering(uint32_t id) {
575     ATRACE_CALL();
576     status_t res;
577     ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
578     res = mHal2Device->ops->trigger_action(mHal2Device,
579             CAMERA2_TRIGGER_PRECAPTURE_METERING, id, 0);
580     if (res != OK) {
581         ALOGE("%s: Error triggering precapture metering (id %d)",
582                 __FUNCTION__, id);
583     }
584     return res;
585 }
586 
pushReprocessBuffer(int reprocessStreamId,buffer_handle_t * buffer,wp<BufferReleasedListener> listener)587 status_t Camera2Device::pushReprocessBuffer(int reprocessStreamId,
588         buffer_handle_t *buffer, wp<BufferReleasedListener> listener) {
589     ATRACE_CALL();
590     ALOGV("%s: E", __FUNCTION__);
591     bool found = false;
592     status_t res = OK;
593     for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin();
594          streamI != mReprocessStreams.end(); streamI++) {
595         if ((*streamI)->getId() == reprocessStreamId) {
596             res = (*streamI)->pushIntoStream(buffer, listener);
597             if (res != OK) {
598                 ALOGE("%s: Unable to push buffer to reprocess stream %d: %s (%d)",
599                         __FUNCTION__, reprocessStreamId, strerror(-res), res);
600                 return res;
601             }
602             found = true;
603             break;
604         }
605     }
606     if (!found) {
607         ALOGE("%s: Camera %d: Unable to find reprocess stream %d",
608                 __FUNCTION__, mId, reprocessStreamId);
609         res = BAD_VALUE;
610     }
611     return res;
612 }
613 
flush(int64_t *)614 status_t Camera2Device::flush(int64_t* /*lastFrameNumber*/) {
615     ATRACE_CALL();
616 
617     mRequestQueue.clear();
618     return waitUntilDrained();
619 }
620 
getDeviceVersion()621 uint32_t Camera2Device::getDeviceVersion() {
622     ATRACE_CALL();
623     return mDeviceVersion;
624 }
625 
626 /**
627  * Camera2Device::MetadataQueue
628  */
629 
MetadataQueue()630 Camera2Device::MetadataQueue::MetadataQueue():
631             mHal2Device(NULL),
632             mFrameCount(0),
633             mLatestRequestId(0),
634             mCount(0),
635             mStreamSlotCount(0),
636             mSignalConsumer(true)
637 {
638     ATRACE_CALL();
639     camera2_request_queue_src_ops::dequeue_request = consumer_dequeue;
640     camera2_request_queue_src_ops::request_count = consumer_buffer_count;
641     camera2_request_queue_src_ops::free_request = consumer_free;
642 
643     camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue;
644     camera2_frame_queue_dst_ops::cancel_frame = producer_cancel;
645     camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue;
646 }
647 
~MetadataQueue()648 Camera2Device::MetadataQueue::~MetadataQueue() {
649     ATRACE_CALL();
650     clear();
651 }
652 
653 // Connect to camera2 HAL as consumer (input requests/reprocessing)
setConsumerDevice(camera2_device_t * d)654 status_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) {
655     ATRACE_CALL();
656     status_t res;
657     res = d->ops->set_request_queue_src_ops(d,
658             this);
659     if (res != OK) return res;
660     mHal2Device = d;
661     return OK;
662 }
663 
setProducerDevice(camera2_device_t * d)664 status_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) {
665     ATRACE_CALL();
666     status_t res;
667     res = d->ops->set_frame_queue_dst_ops(d,
668             this);
669     return res;
670 }
671 
672 // Real interfaces
enqueue(camera_metadata_t * buf)673 status_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) {
674     ATRACE_CALL();
675     ALOGVV("%s: E", __FUNCTION__);
676     Mutex::Autolock l(mMutex);
677 
678     mCount++;
679     mEntries.push_back(buf);
680 
681     return signalConsumerLocked();
682 }
683 
getBufferCount()684 int Camera2Device::MetadataQueue::getBufferCount() {
685     ATRACE_CALL();
686     Mutex::Autolock l(mMutex);
687     if (mStreamSlotCount > 0) {
688         return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS;
689     }
690     return mCount;
691 }
692 
dequeue(camera_metadata_t ** buf,bool incrementCount)693 status_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf,
694         bool incrementCount)
695 {
696     ATRACE_CALL();
697     ALOGVV("%s: E", __FUNCTION__);
698     status_t res;
699     Mutex::Autolock l(mMutex);
700 
701     if (mCount == 0) {
702         if (mStreamSlotCount == 0) {
703             ALOGVV("%s: Empty", __FUNCTION__);
704             *buf = NULL;
705             mSignalConsumer = true;
706             return OK;
707         }
708         ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__,
709               mStreamSlotCount);
710 
711         for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin();
712                 slotEntry != mStreamSlot.end();
713                 slotEntry++ ) {
714             size_t entries = get_camera_metadata_entry_count(*slotEntry);
715             size_t dataBytes = get_camera_metadata_data_count(*slotEntry);
716 
717             camera_metadata_t *copy =
718                     allocate_camera_metadata(entries, dataBytes);
719             append_camera_metadata(copy, *slotEntry);
720             mEntries.push_back(copy);
721         }
722         mCount = mStreamSlotCount;
723     }
724     ALOGVV("MetadataQueue: deque (%d buffers)", mCount);
725     camera_metadata_t *b = *(mEntries.begin());
726     mEntries.erase(mEntries.begin());
727 
728     if (incrementCount) {
729         ATRACE_INT("cam2_request", mFrameCount);
730         camera_metadata_entry_t frameCount;
731         res = find_camera_metadata_entry(b,
732                 ANDROID_REQUEST_FRAME_COUNT,
733                 &frameCount);
734         if (res != OK) {
735             ALOGE("%s: Unable to add frame count: %s (%d)",
736                     __FUNCTION__, strerror(-res), res);
737         } else {
738             *frameCount.data.i32 = mFrameCount;
739         }
740         mFrameCount++;
741     }
742 
743     // Check for request ID, and if present, signal waiters.
744     camera_metadata_entry_t requestId;
745     res = find_camera_metadata_entry(b,
746             ANDROID_REQUEST_ID,
747             &requestId);
748     if (res == OK) {
749         mLatestRequestId = requestId.data.i32[0];
750         mNewRequestId.signal();
751     }
752 
753     *buf = b;
754     mCount--;
755 
756     return OK;
757 }
758 
waitForBuffer(nsecs_t timeout)759 status_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout)
760 {
761     Mutex::Autolock l(mMutex);
762     status_t res;
763     while (mCount == 0) {
764         res = notEmpty.waitRelative(mMutex,timeout);
765         if (res != OK) return res;
766     }
767     return OK;
768 }
769 
waitForDequeue(int32_t id,nsecs_t timeout)770 status_t Camera2Device::MetadataQueue::waitForDequeue(int32_t id,
771         nsecs_t timeout) {
772     Mutex::Autolock l(mMutex);
773     status_t res;
774     while (mLatestRequestId != id) {
775         nsecs_t startTime = systemTime();
776 
777         res = mNewRequestId.waitRelative(mMutex, timeout);
778         if (res != OK) return res;
779 
780         timeout -= (systemTime() - startTime);
781     }
782 
783     return OK;
784 }
785 
setStreamSlot(camera_metadata_t * buf)786 status_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf)
787 {
788     ATRACE_CALL();
789     ALOGV("%s: E", __FUNCTION__);
790     Mutex::Autolock l(mMutex);
791     if (buf == NULL) {
792         freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
793         mStreamSlotCount = 0;
794         return OK;
795     }
796     camera_metadata_t *buf2 = clone_camera_metadata(buf);
797     if (!buf2) {
798         ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
799         return NO_MEMORY;
800     }
801 
802     if (mStreamSlotCount > 1) {
803         List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin();
804         freeBuffers(++mStreamSlot.begin(), mStreamSlot.end());
805         mStreamSlotCount = 1;
806     }
807     if (mStreamSlotCount == 1) {
808         free_camera_metadata( *(mStreamSlot.begin()) );
809         *(mStreamSlot.begin()) = buf2;
810     } else {
811         mStreamSlot.push_front(buf2);
812         mStreamSlotCount = 1;
813     }
814     return signalConsumerLocked();
815 }
816 
setStreamSlot(const List<camera_metadata_t * > & bufs)817 status_t Camera2Device::MetadataQueue::setStreamSlot(
818         const List<camera_metadata_t*> &bufs)
819 {
820     ATRACE_CALL();
821     ALOGV("%s: E", __FUNCTION__);
822     Mutex::Autolock l(mMutex);
823 
824     if (mStreamSlotCount > 0) {
825         freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
826     }
827     mStreamSlotCount = 0;
828     for (List<camera_metadata_t*>::const_iterator r = bufs.begin();
829          r != bufs.end(); r++) {
830         camera_metadata_t *r2 = clone_camera_metadata(*r);
831         if (!r2) {
832             ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
833             return NO_MEMORY;
834         }
835         mStreamSlot.push_back(r2);
836         mStreamSlotCount++;
837     }
838     return signalConsumerLocked();
839 }
840 
clear()841 status_t Camera2Device::MetadataQueue::clear()
842 {
843     ATRACE_CALL();
844     ALOGV("%s: E", __FUNCTION__);
845 
846     Mutex::Autolock l(mMutex);
847 
848     // Clear streaming slot
849     freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
850     mStreamSlotCount = 0;
851 
852     // Clear request queue
853     freeBuffers(mEntries.begin(), mEntries.end());
854     mCount = 0;
855     return OK;
856 }
857 
dump(int fd,const Vector<String16> &)858 status_t Camera2Device::MetadataQueue::dump(int fd,
859         const Vector<String16>& /*args*/) {
860     ATRACE_CALL();
861     String8 result;
862     status_t notLocked;
863     notLocked = mMutex.tryLock();
864     if (notLocked) {
865         result.append("    (Unable to lock queue mutex)\n");
866     }
867     result.appendFormat("      Current frame number: %d\n", mFrameCount);
868     if (mStreamSlotCount == 0) {
869         result.append("      Stream slot: Empty\n");
870         write(fd, result.string(), result.size());
871     } else {
872         result.appendFormat("      Stream slot: %zu entries\n",
873                 mStreamSlot.size());
874         int i = 0;
875         for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin();
876              r != mStreamSlot.end(); r++) {
877             result = String8::format("       Stream slot buffer %d:\n", i);
878             write(fd, result.string(), result.size());
879             dump_indented_camera_metadata(*r, fd, 2, 10);
880             i++;
881         }
882     }
883     if (mEntries.size() == 0) {
884         result = "      Main queue is empty\n";
885         write(fd, result.string(), result.size());
886     } else {
887         result = String8::format("      Main queue has %zu entries:\n",
888                 mEntries.size());
889         int i = 0;
890         for (List<camera_metadata_t*>::iterator r = mEntries.begin();
891              r != mEntries.end(); r++) {
892             result = String8::format("       Queue entry %d:\n", i);
893             write(fd, result.string(), result.size());
894             dump_indented_camera_metadata(*r, fd, 2, 10);
895             i++;
896         }
897     }
898 
899     if (notLocked == 0) {
900         mMutex.unlock();
901     }
902 
903     return OK;
904 }
905 
signalConsumerLocked()906 status_t Camera2Device::MetadataQueue::signalConsumerLocked() {
907     ATRACE_CALL();
908     status_t res = OK;
909     notEmpty.signal();
910     if (mSignalConsumer && mHal2Device != NULL) {
911         mSignalConsumer = false;
912 
913         mMutex.unlock();
914         ALOGV("%s: Signaling consumer", __FUNCTION__);
915         res = mHal2Device->ops->notify_request_queue_not_empty(mHal2Device);
916         mMutex.lock();
917     }
918     return res;
919 }
920 
freeBuffers(List<camera_metadata_t * >::iterator start,List<camera_metadata_t * >::iterator end)921 status_t Camera2Device::MetadataQueue::freeBuffers(
922         List<camera_metadata_t*>::iterator start,
923         List<camera_metadata_t*>::iterator end)
924 {
925     ATRACE_CALL();
926     while (start != end) {
927         free_camera_metadata(*start);
928         start = mStreamSlot.erase(start);
929     }
930     return OK;
931 }
932 
getInstance(const camera2_request_queue_src_ops_t * q)933 Camera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
934         const camera2_request_queue_src_ops_t *q)
935 {
936     const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
937     return const_cast<MetadataQueue*>(cmq);
938 }
939 
getInstance(const camera2_frame_queue_dst_ops_t * q)940 Camera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
941         const camera2_frame_queue_dst_ops_t *q)
942 {
943     const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
944     return const_cast<MetadataQueue*>(cmq);
945 }
946 
consumer_buffer_count(const camera2_request_queue_src_ops_t * q)947 int Camera2Device::MetadataQueue::consumer_buffer_count(
948         const camera2_request_queue_src_ops_t *q)
949 {
950     MetadataQueue *queue = getInstance(q);
951     return queue->getBufferCount();
952 }
953 
consumer_dequeue(const camera2_request_queue_src_ops_t * q,camera_metadata_t ** buffer)954 int Camera2Device::MetadataQueue::consumer_dequeue(
955         const camera2_request_queue_src_ops_t *q,
956         camera_metadata_t **buffer)
957 {
958     MetadataQueue *queue = getInstance(q);
959     return queue->dequeue(buffer, true);
960 }
961 
consumer_free(const camera2_request_queue_src_ops_t * q,camera_metadata_t * old_buffer)962 int Camera2Device::MetadataQueue::consumer_free(
963         const camera2_request_queue_src_ops_t *q,
964         camera_metadata_t *old_buffer)
965 {
966     ATRACE_CALL();
967     MetadataQueue *queue = getInstance(q);
968     (void)queue;
969     free_camera_metadata(old_buffer);
970     return OK;
971 }
972 
producer_dequeue(const camera2_frame_queue_dst_ops_t *,size_t entries,size_t bytes,camera_metadata_t ** buffer)973 int Camera2Device::MetadataQueue::producer_dequeue(
974         const camera2_frame_queue_dst_ops_t * /*q*/,
975         size_t entries, size_t bytes,
976         camera_metadata_t **buffer)
977 {
978     ATRACE_CALL();
979     camera_metadata_t *new_buffer =
980             allocate_camera_metadata(entries, bytes);
981     if (new_buffer == NULL) return NO_MEMORY;
982     *buffer = new_buffer;
983         return OK;
984 }
985 
producer_cancel(const camera2_frame_queue_dst_ops_t *,camera_metadata_t * old_buffer)986 int Camera2Device::MetadataQueue::producer_cancel(
987         const camera2_frame_queue_dst_ops_t * /*q*/,
988         camera_metadata_t *old_buffer)
989 {
990     ATRACE_CALL();
991     free_camera_metadata(old_buffer);
992     return OK;
993 }
994 
producer_enqueue(const camera2_frame_queue_dst_ops_t * q,camera_metadata_t * filled_buffer)995 int Camera2Device::MetadataQueue::producer_enqueue(
996         const camera2_frame_queue_dst_ops_t *q,
997         camera_metadata_t *filled_buffer)
998 {
999     MetadataQueue *queue = getInstance(q);
1000     return queue->enqueue(filled_buffer);
1001 }
1002 
1003 /**
1004  * Camera2Device::StreamAdapter
1005  */
1006 
1007 #ifndef container_of
1008 #define container_of(ptr, type, member) \
1009     (type *)((char*)(ptr) - offsetof(type, member))
1010 #endif
1011 
StreamAdapter(camera2_device_t * d)1012 Camera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d):
1013         mState(RELEASED),
1014         mHal2Device(d),
1015         mId(-1),
1016         mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0),
1017         mMaxProducerBuffers(0), mMaxConsumerBuffers(0),
1018         mTotalBuffers(0),
1019         mFormatRequested(0),
1020         mActiveBuffers(0),
1021         mFrameCount(0),
1022         mLastTimestamp(0)
1023 {
1024     camera2_stream_ops::dequeue_buffer = dequeue_buffer;
1025     camera2_stream_ops::enqueue_buffer = enqueue_buffer;
1026     camera2_stream_ops::cancel_buffer = cancel_buffer;
1027     camera2_stream_ops::set_crop = set_crop;
1028 }
1029 
~StreamAdapter()1030 Camera2Device::StreamAdapter::~StreamAdapter() {
1031     ATRACE_CALL();
1032     if (mState != RELEASED) {
1033         release();
1034     }
1035 }
1036 
connectToDevice(sp<ANativeWindow> consumer,uint32_t width,uint32_t height,int format,size_t size)1037 status_t Camera2Device::StreamAdapter::connectToDevice(
1038         sp<ANativeWindow> consumer,
1039         uint32_t width, uint32_t height, int format, size_t size) {
1040     ATRACE_CALL();
1041     status_t res;
1042     ALOGV("%s: E", __FUNCTION__);
1043 
1044     if (mState != RELEASED) return INVALID_OPERATION;
1045     if (consumer == NULL) {
1046         ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__);
1047         return BAD_VALUE;
1048     }
1049 
1050     ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %zu",
1051             __FUNCTION__, width, height, format, size);
1052 
1053     mConsumerInterface = consumer;
1054     mWidth = width;
1055     mHeight = height;
1056     mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0;
1057     mFormatRequested = format;
1058 
1059     // Allocate device-side stream interface
1060 
1061     uint32_t id;
1062     uint32_t formatActual;
1063     uint32_t usage;
1064     uint32_t maxBuffers = 2;
1065     res = mHal2Device->ops->allocate_stream(mHal2Device,
1066             mWidth, mHeight, mFormatRequested, getStreamOps(),
1067             &id, &formatActual, &usage, &maxBuffers);
1068     if (res != OK) {
1069         ALOGE("%s: Device stream allocation failed: %s (%d)",
1070                 __FUNCTION__, strerror(-res), res);
1071         return res;
1072     }
1073 
1074     ALOGV("%s: Allocated stream id %d, actual format 0x%x, "
1075             "usage 0x%x, producer wants %d buffers", __FUNCTION__,
1076             id, formatActual, usage, maxBuffers);
1077 
1078     mId = id;
1079     mFormat = formatActual;
1080     mUsage = usage;
1081     mMaxProducerBuffers = maxBuffers;
1082 
1083     mState = ALLOCATED;
1084 
1085     // Configure consumer-side ANativeWindow interface
1086     res = native_window_api_connect(mConsumerInterface.get(),
1087             NATIVE_WINDOW_API_CAMERA);
1088     if (res != OK) {
1089         ALOGE("%s: Unable to connect to native window for stream %d",
1090                 __FUNCTION__, mId);
1091 
1092         return res;
1093     }
1094 
1095     mState = CONNECTED;
1096 
1097     res = native_window_set_usage(mConsumerInterface.get(), mUsage);
1098     if (res != OK) {
1099         ALOGE("%s: Unable to configure usage %08x for stream %d",
1100                 __FUNCTION__, mUsage, mId);
1101         return res;
1102     }
1103 
1104     res = native_window_set_scaling_mode(mConsumerInterface.get(),
1105             NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
1106     if (res != OK) {
1107         ALOGE("%s: Unable to configure stream scaling: %s (%d)",
1108                 __FUNCTION__, strerror(-res), res);
1109         return res;
1110     }
1111 
1112     res = setTransform(0);
1113     if (res != OK) {
1114         return res;
1115     }
1116 
1117     if (mFormat == HAL_PIXEL_FORMAT_BLOB) {
1118         res = native_window_set_buffers_dimensions(mConsumerInterface.get(),
1119                 mSize, 1);
1120         if (res != OK) {
1121             ALOGE("%s: Unable to configure compressed stream buffer dimensions"
1122                     " %d x %d, size %zu for stream %d",
1123                     __FUNCTION__, mWidth, mHeight, mSize, mId);
1124             return res;
1125         }
1126     } else {
1127         res = native_window_set_buffers_dimensions(mConsumerInterface.get(),
1128                 mWidth, mHeight);
1129         if (res != OK) {
1130             ALOGE("%s: Unable to configure stream buffer dimensions"
1131                     " %d x %d for stream %d",
1132                     __FUNCTION__, mWidth, mHeight, mId);
1133             return res;
1134         }
1135     }
1136 
1137     res = native_window_set_buffers_format(mConsumerInterface.get(), mFormat);
1138     if (res != OK) {
1139         ALOGE("%s: Unable to configure stream buffer format"
1140                 " %#x for stream %d",
1141                 __FUNCTION__, mFormat, mId);
1142         return res;
1143     }
1144 
1145     int maxConsumerBuffers;
1146     res = mConsumerInterface->query(mConsumerInterface.get(),
1147             NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers);
1148     if (res != OK) {
1149         ALOGE("%s: Unable to query consumer undequeued"
1150                 " buffer count for stream %d", __FUNCTION__, mId);
1151         return res;
1152     }
1153     mMaxConsumerBuffers = maxConsumerBuffers;
1154 
1155     ALOGV("%s: Consumer wants %d buffers", __FUNCTION__,
1156             mMaxConsumerBuffers);
1157 
1158     mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers;
1159     mActiveBuffers = 0;
1160     mFrameCount = 0;
1161     mLastTimestamp = 0;
1162 
1163     res = native_window_set_buffer_count(mConsumerInterface.get(),
1164             mTotalBuffers);
1165     if (res != OK) {
1166         ALOGE("%s: Unable to set buffer count for stream %d",
1167                 __FUNCTION__, mId);
1168         return res;
1169     }
1170 
1171     // Register allocated buffers with HAL device
1172     buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers];
1173     ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers];
1174     uint32_t bufferIdx = 0;
1175     for (; bufferIdx < mTotalBuffers; bufferIdx++) {
1176         res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(),
1177                 &anwBuffers[bufferIdx]);
1178         if (res != OK) {
1179             ALOGE("%s: Unable to dequeue buffer %d for initial registration for "
1180                     "stream %d", __FUNCTION__, bufferIdx, mId);
1181             goto cleanUpBuffers;
1182         }
1183 
1184         buffers[bufferIdx] = anwBuffers[bufferIdx]->handle;
1185         ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)buffers[bufferIdx]);
1186     }
1187 
1188     ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers);
1189     res = mHal2Device->ops->register_stream_buffers(mHal2Device,
1190             mId,
1191             mTotalBuffers,
1192             buffers);
1193     if (res != OK) {
1194         ALOGE("%s: Unable to register buffers with HAL device for stream %d",
1195                 __FUNCTION__, mId);
1196     } else {
1197         mState = ACTIVE;
1198     }
1199 
1200 cleanUpBuffers:
1201     ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx);
1202     for (uint32_t i = 0; i < bufferIdx; i++) {
1203         res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(),
1204                 anwBuffers[i], -1);
1205         if (res != OK) {
1206             ALOGE("%s: Unable to cancel buffer %d after registration",
1207                     __FUNCTION__, i);
1208         }
1209     }
1210     delete[] anwBuffers;
1211     delete[] buffers;
1212 
1213     return res;
1214 }
1215 
release()1216 status_t Camera2Device::StreamAdapter::release() {
1217     ATRACE_CALL();
1218     status_t res;
1219     ALOGV("%s: Releasing stream %d (%d x %d, format %d)", __FUNCTION__, mId,
1220             mWidth, mHeight, mFormat);
1221     if (mState >= ALLOCATED) {
1222         res = mHal2Device->ops->release_stream(mHal2Device, mId);
1223         if (res != OK) {
1224             ALOGE("%s: Unable to release stream %d",
1225                     __FUNCTION__, mId);
1226             return res;
1227         }
1228     }
1229     if (mState >= CONNECTED) {
1230         res = native_window_api_disconnect(mConsumerInterface.get(),
1231                 NATIVE_WINDOW_API_CAMERA);
1232 
1233         /* this is not an error. if client calling process dies,
1234            the window will also die and all calls to it will return
1235            DEAD_OBJECT, thus it's already "disconnected" */
1236         if (res == DEAD_OBJECT) {
1237             ALOGW("%s: While disconnecting stream %d from native window, the"
1238                   " native window died from under us", __FUNCTION__, mId);
1239         }
1240         else if (res != OK) {
1241             ALOGE("%s: Unable to disconnect stream %d from native window (error %d %s)",
1242                     __FUNCTION__, mId, res, strerror(-res));
1243             return res;
1244         }
1245     }
1246     mId = -1;
1247     mState = RELEASED;
1248     return OK;
1249 }
1250 
setTransform(int transform)1251 status_t Camera2Device::StreamAdapter::setTransform(int transform) {
1252     ATRACE_CALL();
1253     status_t res;
1254     if (mState < CONNECTED) {
1255         ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__);
1256         return INVALID_OPERATION;
1257     }
1258     res = native_window_set_buffers_transform(mConsumerInterface.get(),
1259                                               transform);
1260     if (res != OK) {
1261         ALOGE("%s: Unable to configure stream transform to %x: %s (%d)",
1262                 __FUNCTION__, transform, strerror(-res), res);
1263     }
1264     return res;
1265 }
1266 
dump(int fd,const Vector<String16> &)1267 status_t Camera2Device::StreamAdapter::dump(int fd,
1268         const Vector<String16>& /*args*/) {
1269     ATRACE_CALL();
1270     String8 result = String8::format("      Stream %d: %d x %d, format 0x%x\n",
1271             mId, mWidth, mHeight, mFormat);
1272     result.appendFormat("        size %zu, usage 0x%x, requested format 0x%x\n",
1273             mSize, mUsage, mFormatRequested);
1274     result.appendFormat("        total buffers: %d, dequeued buffers: %d\n",
1275             mTotalBuffers, mActiveBuffers);
1276     result.appendFormat("        frame count: %d, last timestamp %" PRId64 "\n",
1277             mFrameCount, mLastTimestamp);
1278     write(fd, result.string(), result.size());
1279     return OK;
1280 }
1281 
getStreamOps()1282 const camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() {
1283     return static_cast<camera2_stream_ops *>(this);
1284 }
1285 
toANW(const camera2_stream_ops_t * w)1286 ANativeWindow* Camera2Device::StreamAdapter::toANW(
1287         const camera2_stream_ops_t *w) {
1288     return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get();
1289 }
1290 
dequeue_buffer(const camera2_stream_ops_t * w,buffer_handle_t ** buffer)1291 int Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w,
1292         buffer_handle_t** buffer) {
1293     ATRACE_CALL();
1294     int res;
1295     StreamAdapter* stream =
1296             const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1297     if (stream->mState != ACTIVE) {
1298         ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
1299         return INVALID_OPERATION;
1300     }
1301 
1302     ANativeWindow *a = toANW(w);
1303     ANativeWindowBuffer* anb;
1304     res = native_window_dequeue_buffer_and_wait(a, &anb);
1305     if (res != OK) {
1306         ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId,
1307                 strerror(-res), res);
1308         return res;
1309     }
1310 
1311     *buffer = &(anb->handle);
1312     stream->mActiveBuffers++;
1313 
1314     ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer));
1315     return res;
1316 }
1317 
enqueue_buffer(const camera2_stream_ops_t * w,int64_t timestamp,buffer_handle_t * buffer)1318 int Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w,
1319         int64_t timestamp,
1320         buffer_handle_t* buffer) {
1321     ATRACE_CALL();
1322     StreamAdapter *stream =
1323             const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1324     stream->mFrameCount++;
1325     ALOGVV("Stream %d enqueue: Frame %d (%p) captured at %lld ns",
1326             stream->mId, stream->mFrameCount, (void*)(*buffer), timestamp);
1327     int state = stream->mState;
1328     if (state != ACTIVE) {
1329         ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
1330         return INVALID_OPERATION;
1331     }
1332     ANativeWindow *a = toANW(w);
1333     status_t err;
1334 
1335     err = native_window_set_buffers_timestamp(a, timestamp);
1336     if (err != OK) {
1337         ALOGE("%s: Error setting timestamp on native window: %s (%d)",
1338                 __FUNCTION__, strerror(-err), err);
1339         return err;
1340     }
1341     err = a->queueBuffer(a,
1342             container_of(buffer, ANativeWindowBuffer, handle), -1);
1343     if (err != OK) {
1344         ALOGE("%s: Error queueing buffer to native window: %s (%d)",
1345                 __FUNCTION__, strerror(-err), err);
1346         return err;
1347     }
1348 
1349     stream->mActiveBuffers--;
1350     stream->mLastTimestamp = timestamp;
1351     return OK;
1352 }
1353 
cancel_buffer(const camera2_stream_ops_t * w,buffer_handle_t * buffer)1354 int Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w,
1355         buffer_handle_t* buffer) {
1356     ATRACE_CALL();
1357     StreamAdapter *stream =
1358             const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1359     ALOGVV("Stream %d cancel: Buffer %p",
1360             stream->mId, (void*)(*buffer));
1361     if (stream->mState != ACTIVE) {
1362         ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
1363         return INVALID_OPERATION;
1364     }
1365 
1366     ANativeWindow *a = toANW(w);
1367     int err = a->cancelBuffer(a,
1368             container_of(buffer, ANativeWindowBuffer, handle), -1);
1369     if (err != OK) {
1370         ALOGE("%s: Error canceling buffer to native window: %s (%d)",
1371                 __FUNCTION__, strerror(-err), err);
1372         return err;
1373     }
1374 
1375     stream->mActiveBuffers--;
1376     return OK;
1377 }
1378 
set_crop(const camera2_stream_ops_t * w,int left,int top,int right,int bottom)1379 int Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w,
1380         int left, int top, int right, int bottom) {
1381     ATRACE_CALL();
1382     int state = static_cast<const StreamAdapter*>(w)->mState;
1383     if (state != ACTIVE) {
1384         ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
1385         return INVALID_OPERATION;
1386     }
1387     ANativeWindow *a = toANW(w);
1388     android_native_rect_t crop = { left, top, right, bottom };
1389     return native_window_set_crop(a, &crop);
1390 }
1391 
1392 /**
1393  * Camera2Device::ReprocessStreamAdapter
1394  */
1395 
1396 #ifndef container_of
1397 #define container_of(ptr, type, member) \
1398     (type *)((char*)(ptr) - offsetof(type, member))
1399 #endif
1400 
ReprocessStreamAdapter(camera2_device_t * d)1401 Camera2Device::ReprocessStreamAdapter::ReprocessStreamAdapter(camera2_device_t *d):
1402         mState(RELEASED),
1403         mHal2Device(d),
1404         mId(-1),
1405         mWidth(0), mHeight(0), mFormat(0),
1406         mActiveBuffers(0),
1407         mFrameCount(0)
1408 {
1409     ATRACE_CALL();
1410     camera2_stream_in_ops::acquire_buffer = acquire_buffer;
1411     camera2_stream_in_ops::release_buffer = release_buffer;
1412 }
1413 
~ReprocessStreamAdapter()1414 Camera2Device::ReprocessStreamAdapter::~ReprocessStreamAdapter() {
1415     ATRACE_CALL();
1416     if (mState != RELEASED) {
1417         release();
1418     }
1419 }
1420 
connectToDevice(const sp<StreamAdapter> & outputStream)1421 status_t Camera2Device::ReprocessStreamAdapter::connectToDevice(
1422         const sp<StreamAdapter> &outputStream) {
1423     ATRACE_CALL();
1424     status_t res;
1425     ALOGV("%s: E", __FUNCTION__);
1426 
1427     if (mState != RELEASED) return INVALID_OPERATION;
1428     if (outputStream == NULL) {
1429         ALOGE("%s: Null base stream passed to reprocess stream adapter",
1430                 __FUNCTION__);
1431         return BAD_VALUE;
1432     }
1433 
1434     mBaseStream = outputStream;
1435     mWidth = outputStream->getWidth();
1436     mHeight = outputStream->getHeight();
1437     mFormat = outputStream->getFormat();
1438 
1439     ALOGV("%s: New reprocess stream parameters %d x %d, format 0x%x",
1440             __FUNCTION__, mWidth, mHeight, mFormat);
1441 
1442     // Allocate device-side stream interface
1443 
1444     uint32_t id;
1445     res = mHal2Device->ops->allocate_reprocess_stream_from_stream(mHal2Device,
1446             outputStream->getId(), getStreamOps(),
1447             &id);
1448     if (res != OK) {
1449         ALOGE("%s: Device reprocess stream allocation failed: %s (%d)",
1450                 __FUNCTION__, strerror(-res), res);
1451         return res;
1452     }
1453 
1454     ALOGV("%s: Allocated reprocess stream id %d based on stream %d",
1455             __FUNCTION__, id, outputStream->getId());
1456 
1457     mId = id;
1458 
1459     mState = ACTIVE;
1460 
1461     return OK;
1462 }
1463 
release()1464 status_t Camera2Device::ReprocessStreamAdapter::release() {
1465     ATRACE_CALL();
1466     status_t res;
1467     ALOGV("%s: Releasing stream %d", __FUNCTION__, mId);
1468     if (mState >= ACTIVE) {
1469         res = mHal2Device->ops->release_reprocess_stream(mHal2Device, mId);
1470         if (res != OK) {
1471             ALOGE("%s: Unable to release stream %d",
1472                     __FUNCTION__, mId);
1473             return res;
1474         }
1475     }
1476 
1477     List<QueueEntry>::iterator s;
1478     for (s = mQueue.begin(); s != mQueue.end(); s++) {
1479         sp<BufferReleasedListener> listener = s->releaseListener.promote();
1480         if (listener != 0) listener->onBufferReleased(s->handle);
1481     }
1482     for (s = mInFlightQueue.begin(); s != mInFlightQueue.end(); s++) {
1483         sp<BufferReleasedListener> listener = s->releaseListener.promote();
1484         if (listener != 0) listener->onBufferReleased(s->handle);
1485     }
1486     mQueue.clear();
1487     mInFlightQueue.clear();
1488 
1489     mState = RELEASED;
1490     return OK;
1491 }
1492 
pushIntoStream(buffer_handle_t * handle,const wp<BufferReleasedListener> & releaseListener)1493 status_t Camera2Device::ReprocessStreamAdapter::pushIntoStream(
1494     buffer_handle_t *handle, const wp<BufferReleasedListener> &releaseListener) {
1495     ATRACE_CALL();
1496     // TODO: Some error checking here would be nice
1497     ALOGV("%s: Pushing buffer %p to stream", __FUNCTION__, (void*)(*handle));
1498 
1499     QueueEntry entry;
1500     entry.handle = handle;
1501     entry.releaseListener = releaseListener;
1502     mQueue.push_back(entry);
1503     return OK;
1504 }
1505 
dump(int fd,const Vector<String16> &)1506 status_t Camera2Device::ReprocessStreamAdapter::dump(int fd,
1507         const Vector<String16>& /*args*/) {
1508     ATRACE_CALL();
1509     String8 result =
1510             String8::format("      Reprocess stream %d: %d x %d, fmt 0x%x\n",
1511                     mId, mWidth, mHeight, mFormat);
1512     result.appendFormat("        acquired buffers: %d\n",
1513             mActiveBuffers);
1514     result.appendFormat("        frame count: %d\n",
1515             mFrameCount);
1516     write(fd, result.string(), result.size());
1517     return OK;
1518 }
1519 
getStreamOps()1520 const camera2_stream_in_ops *Camera2Device::ReprocessStreamAdapter::getStreamOps() {
1521     return static_cast<camera2_stream_in_ops *>(this);
1522 }
1523 
acquire_buffer(const camera2_stream_in_ops_t * w,buffer_handle_t ** buffer)1524 int Camera2Device::ReprocessStreamAdapter::acquire_buffer(
1525     const camera2_stream_in_ops_t *w,
1526         buffer_handle_t** buffer) {
1527     ATRACE_CALL();
1528 
1529     ReprocessStreamAdapter* stream =
1530             const_cast<ReprocessStreamAdapter*>(
1531                 static_cast<const ReprocessStreamAdapter*>(w));
1532     if (stream->mState != ACTIVE) {
1533         ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
1534         return INVALID_OPERATION;
1535     }
1536 
1537     if (stream->mQueue.empty()) {
1538         *buffer = NULL;
1539         return OK;
1540     }
1541 
1542     QueueEntry &entry = *(stream->mQueue.begin());
1543 
1544     *buffer = entry.handle;
1545 
1546     stream->mInFlightQueue.push_back(entry);
1547     stream->mQueue.erase(stream->mQueue.begin());
1548 
1549     stream->mActiveBuffers++;
1550 
1551     ALOGV("Stream %d acquire: Buffer %p acquired", stream->mId,
1552             (void*)(**buffer));
1553     return OK;
1554 }
1555 
release_buffer(const camera2_stream_in_ops_t * w,buffer_handle_t * buffer)1556 int Camera2Device::ReprocessStreamAdapter::release_buffer(
1557     const camera2_stream_in_ops_t* w,
1558     buffer_handle_t* buffer) {
1559     ATRACE_CALL();
1560     ReprocessStreamAdapter *stream =
1561             const_cast<ReprocessStreamAdapter*>(
1562                 static_cast<const ReprocessStreamAdapter*>(w) );
1563     stream->mFrameCount++;
1564     ALOGV("Reprocess stream %d release: Frame %d (%p)",
1565             stream->mId, stream->mFrameCount, (void*)*buffer);
1566     int state = stream->mState;
1567     if (state != ACTIVE) {
1568         ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
1569         return INVALID_OPERATION;
1570     }
1571     stream->mActiveBuffers--;
1572 
1573     List<QueueEntry>::iterator s;
1574     for (s = stream->mInFlightQueue.begin(); s != stream->mInFlightQueue.end(); s++) {
1575         if ( s->handle == buffer ) break;
1576     }
1577     if (s == stream->mInFlightQueue.end()) {
1578         ALOGE("%s: Can't find buffer %p in in-flight list!", __FUNCTION__,
1579                 buffer);
1580         return INVALID_OPERATION;
1581     }
1582 
1583     sp<BufferReleasedListener> listener = s->releaseListener.promote();
1584     if (listener != 0) {
1585         listener->onBufferReleased(s->handle);
1586     } else {
1587         ALOGE("%s: Can't free buffer - missing listener", __FUNCTION__);
1588     }
1589     stream->mInFlightQueue.erase(s);
1590 
1591     return OK;
1592 }
1593 
1594 }; // namespace android
1595