Home | History | Annotate | Download | only in device2
      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 
     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 
     45 Camera2Device::~Camera2Device()
     46 {
     47     ATRACE_CALL();
     48     ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId);
     49     disconnect();
     50 }
     51 
     52 int Camera2Device::getId() const {
     53     return mId;
     54 }
     55 
     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 
    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 
    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 
    198 const CameraMetadata& Camera2Device::info() const {
    199     ALOGVV("%s: E", __FUNCTION__);
    200 
    201     return mDeviceInfo;
    202 }
    203 
    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 
    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 
    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 
    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 
    234 status_t Camera2Device::clearStreamingRequest(int64_t* /*lastFrameNumber*/) {
    235     ATRACE_CALL();
    236     return mRequestQueue.setStreamSlot(NULL);
    237 }
    238 
    239 status_t Camera2Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
    240     ATRACE_CALL();
    241     return mRequestQueue.waitForDequeue(requestId, timeout);
    242 }
    243 
    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 
    269 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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    478 bool Camera2Device::willNotify3A() {
    479     return true;
    480 }
    481 
    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 
    525 status_t Camera2Device::waitForNextFrame(nsecs_t timeout) {
    526     return mFrameQueue.waitForBuffer(timeout);
    527 }
    528 
    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 
    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 
    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 
    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 
    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 
    614 status_t Camera2Device::flush(int64_t* /*lastFrameNumber*/) {
    615     ATRACE_CALL();
    616 
    617     mRequestQueue.clear();
    618     return waitUntilDrained();
    619 }
    620 
    621 uint32_t Camera2Device::getDeviceVersion() {
    622     ATRACE_CALL();
    623     return mDeviceVersion;
    624 }
    625 
    626 /**
    627  * Camera2Device::MetadataQueue
    628  */
    629 
    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 
    648 Camera2Device::MetadataQueue::~MetadataQueue() {
    649     ATRACE_CALL();
    650     clear();
    651 }
    652 
    653 // Connect to camera2 HAL as consumer (input requests/reprocessing)
    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 
    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
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
   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 
   1030 Camera2Device::StreamAdapter::~StreamAdapter() {
   1031     ATRACE_CALL();
   1032     if (mState != RELEASED) {
   1033         release();
   1034     }
   1035 }
   1036 
   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 
   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 
   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 
   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 
   1282 const camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() {
   1283     return static_cast<camera2_stream_ops *>(this);
   1284 }
   1285 
   1286 ANativeWindow* Camera2Device::StreamAdapter::toANW(
   1287         const camera2_stream_ops_t *w) {
   1288     return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get();
   1289 }
   1290 
   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 
   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 
   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 
   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 
   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 
   1414 Camera2Device::ReprocessStreamAdapter::~ReprocessStreamAdapter() {
   1415     ATRACE_CALL();
   1416     if (mState != RELEASED) {
   1417         release();
   1418     }
   1419 }
   1420 
   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 
   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 
   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 
   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 
   1520 const camera2_stream_in_ops *Camera2Device::ReprocessStreamAdapter::getStreamOps() {
   1521     return static_cast<camera2_stream_in_ops *>(this);
   1522 }
   1523 
   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 
   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