Home | History | Annotate | Download | only in device1
      1 /*
      2  * Copyright (C) 2017 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 #define LOG_TAG "CameraHardwareInterface"
     17 //#define LOG_NDEBUG 0
     18 
     19 #include <inttypes.h>
     20 #include <media/hardware/HardwareAPI.h> // For VideoNativeHandleMetadata
     21 #include "CameraHardwareInterface.h"
     22 
     23 namespace android {
     24 
     25 using namespace hardware::camera::device::V1_0;
     26 using namespace hardware::camera::common::V1_0;
     27 using hardware::hidl_handle;
     28 
     29 CameraHardwareInterface::~CameraHardwareInterface()
     30 {
     31     ALOGI("Destroying camera %s", mName.string());
     32     if (mHidlDevice != nullptr) {
     33         mHidlDevice->close();
     34         mHidlDevice.clear();
     35         cleanupCirculatingBuffers();
     36     }
     37 }
     38 
     39 status_t CameraHardwareInterface::initialize(sp<CameraProviderManager> manager) {
     40     ALOGI("Opening camera %s", mName.string());
     41 
     42     status_t ret = manager->openSession(mName.string(), this, &mHidlDevice);
     43     if (ret != OK) {
     44         ALOGE("%s: openSession failed! %s (%d)", __FUNCTION__, strerror(-ret), ret);
     45     }
     46     return ret;
     47 }
     48 
     49 status_t CameraHardwareInterface::setPreviewScalingMode(int scalingMode)
     50 {
     51     int rc = OK;
     52     mPreviewScalingMode = scalingMode;
     53     if (mPreviewWindow != nullptr) {
     54         rc = native_window_set_scaling_mode(mPreviewWindow.get(),
     55                 scalingMode);
     56     }
     57     return rc;
     58 }
     59 
     60 status_t CameraHardwareInterface::setPreviewTransform(int transform) {
     61     int rc = OK;
     62     mPreviewTransform = transform;
     63     if (mPreviewWindow != nullptr) {
     64         rc = native_window_set_buffers_transform(mPreviewWindow.get(),
     65                 mPreviewTransform);
     66     }
     67     return rc;
     68 }
     69 
     70 /**
     71  * Implementation of android::hardware::camera::device::V1_0::ICameraDeviceCallback
     72  */
     73 hardware::Return<void> CameraHardwareInterface::notifyCallback(
     74         NotifyCallbackMsg msgType, int32_t ext1, int32_t ext2) {
     75     sNotifyCb((int32_t) msgType, ext1, ext2, (void*) this);
     76     return hardware::Void();
     77 }
     78 
     79 hardware::Return<uint32_t> CameraHardwareInterface::registerMemory(
     80         const hardware::hidl_handle& descriptor,
     81         uint32_t bufferSize, uint32_t bufferCount) {
     82     if (descriptor->numFds != 1) {
     83         ALOGE("%s: camera memory descriptor has numFds %d (expect 1)",
     84                 __FUNCTION__, descriptor->numFds);
     85         return 0;
     86     }
     87     if (descriptor->data[0] < 0) {
     88         ALOGE("%s: camera memory descriptor has FD %d (expect >= 0)",
     89                 __FUNCTION__, descriptor->data[0]);
     90         return 0;
     91     }
     92 
     93     camera_memory_t* mem = sGetMemory(descriptor->data[0], bufferSize, bufferCount, this);
     94     sp<CameraHeapMemory> camMem(static_cast<CameraHeapMemory *>(mem->handle));
     95     int memPoolId = camMem->mHeap->getHeapID();
     96     if (memPoolId < 0) {
     97         ALOGE("%s: CameraHeapMemory has FD %d (expect >= 0)", __FUNCTION__, memPoolId);
     98         return 0;
     99     }
    100     std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
    101     mHidlMemPoolMap.insert(std::make_pair(memPoolId, mem));
    102     return memPoolId;
    103 }
    104 
    105 hardware::Return<void> CameraHardwareInterface::unregisterMemory(uint32_t memId) {
    106     camera_memory_t* mem = nullptr;
    107     {
    108         std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
    109         if (mHidlMemPoolMap.count(memId) == 0) {
    110             ALOGE("%s: memory pool ID %d not found", __FUNCTION__, memId);
    111             return hardware::Void();
    112         }
    113         mem = mHidlMemPoolMap.at(memId);
    114         mHidlMemPoolMap.erase(memId);
    115     }
    116     sPutMemory(mem);
    117     return hardware::Void();
    118 }
    119 
    120 hardware::Return<void> CameraHardwareInterface::dataCallback(
    121         DataCallbackMsg msgType, uint32_t data, uint32_t bufferIndex,
    122         const hardware::camera::device::V1_0::CameraFrameMetadata& metadata) {
    123     camera_memory_t* mem = nullptr;
    124     {
    125         std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
    126         if (mHidlMemPoolMap.count(data) == 0) {
    127             ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
    128             return hardware::Void();
    129         }
    130         mem = mHidlMemPoolMap.at(data);
    131     }
    132     camera_frame_metadata_t md;
    133     md.number_of_faces = metadata.faces.size();
    134     md.faces = (camera_face_t*) metadata.faces.data();
    135     sDataCb((int32_t) msgType, mem, bufferIndex, &md, this);
    136     return hardware::Void();
    137 }
    138 
    139 hardware::Return<void> CameraHardwareInterface::dataCallbackTimestamp(
    140         DataCallbackMsg msgType, uint32_t data,
    141         uint32_t bufferIndex, int64_t timestamp) {
    142     camera_memory_t* mem = nullptr;
    143     {
    144         std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
    145         if (mHidlMemPoolMap.count(data) == 0) {
    146             ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
    147             return hardware::Void();
    148         }
    149         mem = mHidlMemPoolMap.at(data);
    150     }
    151     sDataCbTimestamp(timestamp, (int32_t) msgType, mem, bufferIndex, this);
    152     return hardware::Void();
    153 }
    154 
    155 hardware::Return<void> CameraHardwareInterface::handleCallbackTimestamp(
    156         DataCallbackMsg msgType, const hidl_handle& frameData, uint32_t data,
    157         uint32_t bufferIndex, int64_t timestamp) {
    158     camera_memory_t* mem = nullptr;
    159     {
    160         std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
    161         if (mHidlMemPoolMap.count(data) == 0) {
    162             ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
    163             return hardware::Void();
    164         }
    165         mem = mHidlMemPoolMap.at(data);
    166     }
    167     sp<CameraHeapMemory> heapMem(static_cast<CameraHeapMemory *>(mem->handle));
    168     VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*)
    169             heapMem->mBuffers[bufferIndex]->pointer();
    170     md->pHandle = const_cast<native_handle_t*>(frameData.getNativeHandle());
    171     sDataCbTimestamp(timestamp, (int32_t) msgType, mem, bufferIndex, this);
    172     return hardware::Void();
    173 }
    174 
    175 hardware::Return<void> CameraHardwareInterface::handleCallbackTimestampBatch(
    176         DataCallbackMsg msgType,
    177         const hardware::hidl_vec<hardware::camera::device::V1_0::HandleTimestampMessage>& messages) {
    178     std::vector<android::HandleTimestampMessage> msgs;
    179     msgs.reserve(messages.size());
    180     {
    181         std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
    182         for (const auto& hidl_msg : messages) {
    183             if (mHidlMemPoolMap.count(hidl_msg.data) == 0) {
    184                 ALOGE("%s: memory pool ID %d not found", __FUNCTION__, hidl_msg.data);
    185                 return hardware::Void();
    186             }
    187             sp<CameraHeapMemory> mem(
    188                     static_cast<CameraHeapMemory *>(mHidlMemPoolMap.at(hidl_msg.data)->handle));
    189 
    190             if (hidl_msg.bufferIndex >= mem->mNumBufs) {
    191                 ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
    192                      hidl_msg.bufferIndex, mem->mNumBufs);
    193                 return hardware::Void();
    194             }
    195             VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*)
    196                     mem->mBuffers[hidl_msg.bufferIndex]->pointer();
    197             md->pHandle = const_cast<native_handle_t*>(hidl_msg.frameData.getNativeHandle());
    198 
    199             msgs.push_back({hidl_msg.timestamp, mem->mBuffers[hidl_msg.bufferIndex]});
    200         }
    201     }
    202     mDataCbTimestampBatch((int32_t) msgType, msgs, mCbUser);
    203     return hardware::Void();
    204 }
    205 
    206 std::pair<bool, uint64_t> CameraHardwareInterface::getBufferId(
    207         ANativeWindowBuffer* anb) {
    208     std::lock_guard<std::mutex> lock(mBufferIdMapLock);
    209 
    210     buffer_handle_t& buf = anb->handle;
    211     auto it = mBufferIdMap.find(buf);
    212     if (it == mBufferIdMap.end()) {
    213         uint64_t bufId = mNextBufferId++;
    214         mBufferIdMap[buf] = bufId;
    215         mReversedBufMap[bufId] = anb;
    216         return std::make_pair(true, bufId);
    217     } else {
    218         return std::make_pair(false, it->second);
    219     }
    220 }
    221 
    222 void CameraHardwareInterface::cleanupCirculatingBuffers() {
    223     std::lock_guard<std::mutex> lock(mBufferIdMapLock);
    224     mBufferIdMap.clear();
    225     mReversedBufMap.clear();
    226 }
    227 
    228 hardware::Return<void>
    229 CameraHardwareInterface::dequeueBuffer(dequeueBuffer_cb _hidl_cb) {
    230     ANativeWindow *a = mPreviewWindow.get();
    231     if (a == nullptr) {
    232         ALOGE("%s: preview window is null", __FUNCTION__);
    233         return hardware::Void();
    234     }
    235     ANativeWindowBuffer* anb;
    236     int rc = native_window_dequeue_buffer_and_wait(a, &anb);
    237     Status s = Status::INTERNAL_ERROR;
    238     uint64_t bufferId = 0;
    239     uint32_t stride = 0;
    240     hidl_handle buf = nullptr;
    241     if (rc == OK) {
    242         s = Status::OK;
    243         auto pair = getBufferId(anb);
    244         buf = (pair.first) ? anb->handle : nullptr;
    245         bufferId = pair.second;
    246         stride = anb->stride;
    247     }
    248 
    249     _hidl_cb(s, bufferId, buf, stride);
    250     return hardware::Void();
    251 }
    252 
    253 hardware::Return<Status>
    254 CameraHardwareInterface::enqueueBuffer(uint64_t bufferId) {
    255     ANativeWindow *a = mPreviewWindow.get();
    256     if (a == nullptr) {
    257         ALOGE("%s: preview window is null", __FUNCTION__);
    258         return Status::INTERNAL_ERROR;
    259     }
    260     if (mReversedBufMap.count(bufferId) == 0) {
    261         ALOGE("%s: bufferId %" PRIu64 " not found", __FUNCTION__, bufferId);
    262         return Status::ILLEGAL_ARGUMENT;
    263     }
    264     int rc = a->queueBuffer(a, mReversedBufMap.at(bufferId), -1);
    265     if (rc == 0) {
    266         return Status::OK;
    267     }
    268     return Status::INTERNAL_ERROR;
    269 }
    270 
    271 hardware::Return<Status>
    272 CameraHardwareInterface::cancelBuffer(uint64_t bufferId) {
    273     ANativeWindow *a = mPreviewWindow.get();
    274     if (a == nullptr) {
    275         ALOGE("%s: preview window is null", __FUNCTION__);
    276         return Status::INTERNAL_ERROR;
    277     }
    278     if (mReversedBufMap.count(bufferId) == 0) {
    279         ALOGE("%s: bufferId %" PRIu64 " not found", __FUNCTION__, bufferId);
    280         return Status::ILLEGAL_ARGUMENT;
    281     }
    282     int rc = a->cancelBuffer(a, mReversedBufMap.at(bufferId), -1);
    283     if (rc == 0) {
    284         return Status::OK;
    285     }
    286     return Status::INTERNAL_ERROR;
    287 }
    288 
    289 hardware::Return<Status>
    290 CameraHardwareInterface::setBufferCount(uint32_t count) {
    291     ANativeWindow *a = mPreviewWindow.get();
    292     if (a != nullptr) {
    293         // Workaround for b/27039775
    294         // Previously, setting the buffer count would reset the buffer
    295         // queue's flag that allows for all buffers to be dequeued on the
    296         // producer side, instead of just the producer's declared max count,
    297         // if no filled buffers have yet been queued by the producer.  This
    298         // reset no longer happens, but some HALs depend on this behavior,
    299         // so it needs to be maintained for HAL backwards compatibility.
    300         // Simulate the prior behavior by disconnecting/reconnecting to the
    301         // window and setting the values again.  This has the drawback of
    302         // actually causing memory reallocation, which may not have happened
    303         // in the past.
    304         native_window_api_disconnect(a, NATIVE_WINDOW_API_CAMERA);
    305         native_window_api_connect(a, NATIVE_WINDOW_API_CAMERA);
    306         if (mPreviewScalingMode != NOT_SET) {
    307             native_window_set_scaling_mode(a, mPreviewScalingMode);
    308         }
    309         if (mPreviewTransform != NOT_SET) {
    310             native_window_set_buffers_transform(a, mPreviewTransform);
    311         }
    312         if (mPreviewWidth != NOT_SET) {
    313             native_window_set_buffers_dimensions(a,
    314                     mPreviewWidth, mPreviewHeight);
    315             native_window_set_buffers_format(a, mPreviewFormat);
    316         }
    317         if (mPreviewUsage != 0) {
    318             native_window_set_usage(a, mPreviewUsage);
    319         }
    320         if (mPreviewSwapInterval != NOT_SET) {
    321             a->setSwapInterval(a, mPreviewSwapInterval);
    322         }
    323         if (mPreviewCrop.left != NOT_SET) {
    324             native_window_set_crop(a, &(mPreviewCrop));
    325         }
    326     }
    327     int rc = native_window_set_buffer_count(a, count);
    328     if (rc == OK) {
    329         cleanupCirculatingBuffers();
    330         return Status::OK;
    331     }
    332     return Status::INTERNAL_ERROR;
    333 }
    334 
    335 hardware::Return<Status>
    336 CameraHardwareInterface::setBuffersGeometry(
    337         uint32_t w, uint32_t h, hardware::graphics::common::V1_0::PixelFormat format) {
    338     Status s = Status::INTERNAL_ERROR;
    339     ANativeWindow *a = mPreviewWindow.get();
    340     if (a == nullptr) {
    341         ALOGE("%s: preview window is null", __FUNCTION__);
    342         return s;
    343     }
    344     mPreviewWidth = w;
    345     mPreviewHeight = h;
    346     mPreviewFormat = (int) format;
    347     int rc = native_window_set_buffers_dimensions(a, w, h);
    348     if (rc == OK) {
    349         rc = native_window_set_buffers_format(a, mPreviewFormat);
    350     }
    351     if (rc == OK) {
    352         cleanupCirculatingBuffers();
    353         s = Status::OK;
    354     }
    355     return s;
    356 }
    357 
    358 hardware::Return<Status>
    359 CameraHardwareInterface::setCrop(int32_t left, int32_t top, int32_t right, int32_t bottom) {
    360     Status s = Status::INTERNAL_ERROR;
    361     ANativeWindow *a = mPreviewWindow.get();
    362     if (a == nullptr) {
    363         ALOGE("%s: preview window is null", __FUNCTION__);
    364         return s;
    365     }
    366     mPreviewCrop.left = left;
    367     mPreviewCrop.top = top;
    368     mPreviewCrop.right = right;
    369     mPreviewCrop.bottom = bottom;
    370     int rc = native_window_set_crop(a, &mPreviewCrop);
    371     if (rc == OK) {
    372         s = Status::OK;
    373     }
    374     return s;
    375 }
    376 
    377 hardware::Return<Status>
    378 CameraHardwareInterface::setUsage(hardware::graphics::common::V1_0::BufferUsage usage) {
    379     Status s = Status::INTERNAL_ERROR;
    380     ANativeWindow *a = mPreviewWindow.get();
    381     if (a == nullptr) {
    382         ALOGE("%s: preview window is null", __FUNCTION__);
    383         return s;
    384     }
    385     mPreviewUsage = static_cast<uint64_t> (usage);
    386     int rc = native_window_set_usage(a, mPreviewUsage);
    387     if (rc == OK) {
    388         cleanupCirculatingBuffers();
    389         s = Status::OK;
    390     }
    391     return s;
    392 }
    393 
    394 hardware::Return<Status>
    395 CameraHardwareInterface::setSwapInterval(int32_t interval) {
    396     Status s = Status::INTERNAL_ERROR;
    397     ANativeWindow *a = mPreviewWindow.get();
    398     if (a == nullptr) {
    399         ALOGE("%s: preview window is null", __FUNCTION__);
    400         return s;
    401     }
    402     mPreviewSwapInterval = interval;
    403     int rc = a->setSwapInterval(a, interval);
    404     if (rc == OK) {
    405         s = Status::OK;
    406     }
    407     return s;
    408 }
    409 
    410 hardware::Return<void>
    411 CameraHardwareInterface::getMinUndequeuedBufferCount(getMinUndequeuedBufferCount_cb _hidl_cb) {
    412     ANativeWindow *a = mPreviewWindow.get();
    413     if (a == nullptr) {
    414         ALOGE("%s: preview window is null", __FUNCTION__);
    415         return hardware::Void();
    416     }
    417     int count = 0;
    418     int rc = a->query(a, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &count);
    419     Status s = Status::INTERNAL_ERROR;
    420     if (rc == OK) {
    421         s = Status::OK;
    422     }
    423     _hidl_cb(s, count);
    424     return hardware::Void();
    425 }
    426 
    427 hardware::Return<Status>
    428 CameraHardwareInterface::setTimestamp(int64_t timestamp) {
    429     Status s = Status::INTERNAL_ERROR;
    430     ANativeWindow *a = mPreviewWindow.get();
    431     if (a == nullptr) {
    432         ALOGE("%s: preview window is null", __FUNCTION__);
    433         return s;
    434     }
    435     int rc = native_window_set_buffers_timestamp(a, timestamp);
    436     if (rc == OK) {
    437         s = Status::OK;
    438     }
    439     return s;
    440 }
    441 
    442 status_t CameraHardwareInterface::setPreviewWindow(const sp<ANativeWindow>& buf)
    443 {
    444     ALOGV("%s(%s) buf %p", __FUNCTION__, mName.string(), buf.get());
    445     if (CC_LIKELY(mHidlDevice != nullptr)) {
    446         mPreviewWindow = buf;
    447         if (buf != nullptr) {
    448             if (mPreviewScalingMode != NOT_SET) {
    449                 setPreviewScalingMode(mPreviewScalingMode);
    450             }
    451             if (mPreviewTransform != NOT_SET) {
    452                 setPreviewTransform(mPreviewTransform);
    453             }
    454         }
    455         return CameraProviderManager::mapToStatusT(
    456                 mHidlDevice->setPreviewWindow(buf.get() ? this : nullptr));
    457     }
    458     return INVALID_OPERATION;
    459 }
    460 
    461 void CameraHardwareInterface::setCallbacks(notify_callback notify_cb,
    462         data_callback data_cb,
    463         data_callback_timestamp data_cb_timestamp,
    464         data_callback_timestamp_batch data_cb_timestamp_batch,
    465         void* user)
    466 {
    467     mNotifyCb = notify_cb;
    468     mDataCb = data_cb;
    469     mDataCbTimestamp = data_cb_timestamp;
    470     mDataCbTimestampBatch = data_cb_timestamp_batch;
    471     mCbUser = user;
    472 
    473     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    474 }
    475 
    476 void CameraHardwareInterface::enableMsgType(int32_t msgType)
    477 {
    478     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    479     if (CC_LIKELY(mHidlDevice != nullptr)) {
    480         mHidlDevice->enableMsgType(msgType);
    481     }
    482 }
    483 
    484 void CameraHardwareInterface::disableMsgType(int32_t msgType)
    485 {
    486     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    487     if (CC_LIKELY(mHidlDevice != nullptr)) {
    488         mHidlDevice->disableMsgType(msgType);
    489     }
    490 }
    491 
    492 int CameraHardwareInterface::msgTypeEnabled(int32_t msgType)
    493 {
    494     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    495     if (CC_LIKELY(mHidlDevice != nullptr)) {
    496         return mHidlDevice->msgTypeEnabled(msgType);
    497     }
    498     return false;
    499 }
    500 
    501 status_t CameraHardwareInterface::startPreview()
    502 {
    503     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    504     if (CC_LIKELY(mHidlDevice != nullptr)) {
    505         return CameraProviderManager::mapToStatusT(
    506                 mHidlDevice->startPreview());
    507     }
    508     return INVALID_OPERATION;
    509 }
    510 
    511 void CameraHardwareInterface::stopPreview()
    512 {
    513     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    514     if (CC_LIKELY(mHidlDevice != nullptr)) {
    515         mHidlDevice->stopPreview();
    516     }
    517 }
    518 
    519 int CameraHardwareInterface::previewEnabled()
    520 {
    521     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    522     if (CC_LIKELY(mHidlDevice != nullptr)) {
    523         return mHidlDevice->previewEnabled();
    524     }
    525     return false;
    526 }
    527 
    528 status_t CameraHardwareInterface::storeMetaDataInBuffers(int enable)
    529 {
    530     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    531     if (CC_LIKELY(mHidlDevice != nullptr)) {
    532         return CameraProviderManager::mapToStatusT(
    533                 mHidlDevice->storeMetaDataInBuffers(enable));
    534     }
    535     return enable ? INVALID_OPERATION: OK;
    536 }
    537 
    538 status_t CameraHardwareInterface::startRecording()
    539 {
    540     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    541     if (CC_LIKELY(mHidlDevice != nullptr)) {
    542         return CameraProviderManager::mapToStatusT(
    543                 mHidlDevice->startRecording());
    544     }
    545     return INVALID_OPERATION;
    546 }
    547 
    548 /**
    549  * Stop a previously started recording.
    550  */
    551 void CameraHardwareInterface::stopRecording()
    552 {
    553     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    554     if (CC_LIKELY(mHidlDevice != nullptr)) {
    555         mHidlDevice->stopRecording();
    556     }
    557 }
    558 
    559 /**
    560  * Returns true if recording is enabled.
    561  */
    562 int CameraHardwareInterface::recordingEnabled()
    563 {
    564     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    565     if (CC_LIKELY(mHidlDevice != nullptr)) {
    566         return mHidlDevice->recordingEnabled();
    567     }
    568     return false;
    569 }
    570 
    571 void CameraHardwareInterface::releaseRecordingFrame(const sp<IMemory>& mem)
    572 {
    573     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    574     ssize_t offset;
    575     size_t size;
    576     sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
    577     int heapId = heap->getHeapID();
    578     int bufferIndex = offset / size;
    579     if (CC_LIKELY(mHidlDevice != nullptr)) {
    580         if (size == sizeof(VideoNativeHandleMetadata)) {
    581             VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) mem->pointer();
    582             // Caching the handle here because md->pHandle will be subject to HAL's edit
    583             native_handle_t* nh = md->pHandle;
    584             hidl_handle frame = nh;
    585             mHidlDevice->releaseRecordingFrameHandle(heapId, bufferIndex, frame);
    586             native_handle_close(nh);
    587             native_handle_delete(nh);
    588         } else {
    589             mHidlDevice->releaseRecordingFrame(heapId, bufferIndex);
    590         }
    591     }
    592 }
    593 
    594 void CameraHardwareInterface::releaseRecordingFrameBatch(const std::vector<sp<IMemory>>& frames)
    595 {
    596     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    597     size_t n = frames.size();
    598     std::vector<VideoFrameMessage> msgs;
    599     msgs.reserve(n);
    600     for (auto& mem : frames) {
    601         if (CC_LIKELY(mHidlDevice != nullptr)) {
    602             ssize_t offset;
    603             size_t size;
    604             sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
    605             if (size == sizeof(VideoNativeHandleMetadata)) {
    606                 uint32_t heapId = heap->getHeapID();
    607                 uint32_t bufferIndex = offset / size;
    608                 VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) mem->pointer();
    609                 // Caching the handle here because md->pHandle will be subject to HAL's edit
    610                 native_handle_t* nh = md->pHandle;
    611                 VideoFrameMessage msg;
    612                 msgs.push_back({nh, heapId, bufferIndex});
    613             } else {
    614                 ALOGE("%s only supports VideoNativeHandleMetadata mode", __FUNCTION__);
    615                 return;
    616             }
    617         }
    618     }
    619 
    620     mHidlDevice->releaseRecordingFrameHandleBatch(msgs);
    621 
    622     for (auto& msg : msgs) {
    623         native_handle_t* nh = const_cast<native_handle_t*>(msg.frameData.getNativeHandle());
    624         native_handle_close(nh);
    625         native_handle_delete(nh);
    626     }
    627 }
    628 
    629 status_t CameraHardwareInterface::autoFocus()
    630 {
    631     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    632     if (CC_LIKELY(mHidlDevice != nullptr)) {
    633         return CameraProviderManager::mapToStatusT(
    634                 mHidlDevice->autoFocus());
    635     }
    636     return INVALID_OPERATION;
    637 }
    638 
    639 status_t CameraHardwareInterface::cancelAutoFocus()
    640 {
    641     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    642     if (CC_LIKELY(mHidlDevice != nullptr)) {
    643         return CameraProviderManager::mapToStatusT(
    644                 mHidlDevice->cancelAutoFocus());
    645     }
    646     return INVALID_OPERATION;
    647 }
    648 
    649 status_t CameraHardwareInterface::takePicture()
    650 {
    651     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    652     if (CC_LIKELY(mHidlDevice != nullptr)) {
    653         return CameraProviderManager::mapToStatusT(
    654                 mHidlDevice->takePicture());
    655     }
    656     return INVALID_OPERATION;
    657 }
    658 
    659 status_t CameraHardwareInterface::cancelPicture()
    660 {
    661     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    662     if (CC_LIKELY(mHidlDevice != nullptr)) {
    663         return CameraProviderManager::mapToStatusT(
    664                 mHidlDevice->cancelPicture());
    665     }
    666     return INVALID_OPERATION;
    667 }
    668 
    669 status_t CameraHardwareInterface::setParameters(const CameraParameters &params)
    670 {
    671     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    672     if (CC_LIKELY(mHidlDevice != nullptr)) {
    673         return CameraProviderManager::mapToStatusT(
    674                 mHidlDevice->setParameters(params.flatten().string()));
    675     }
    676     return INVALID_OPERATION;
    677 }
    678 
    679 CameraParameters CameraHardwareInterface::getParameters() const
    680 {
    681     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    682     CameraParameters parms;
    683     if (CC_LIKELY(mHidlDevice != nullptr)) {
    684         hardware::hidl_string outParam;
    685         mHidlDevice->getParameters(
    686                 [&outParam](const auto& outStr) {
    687                     outParam = outStr;
    688                 });
    689         String8 tmp(outParam.c_str());
    690         parms.unflatten(tmp);
    691     }
    692     return parms;
    693 }
    694 
    695 status_t CameraHardwareInterface::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
    696 {
    697     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    698     if (CC_LIKELY(mHidlDevice != nullptr)) {
    699         return CameraProviderManager::mapToStatusT(
    700                 mHidlDevice->sendCommand((CommandType) cmd, arg1, arg2));
    701     }
    702     return INVALID_OPERATION;
    703 }
    704 
    705 /**
    706  * Release the hardware resources owned by this object.  Note that this is
    707  * *not* done in the destructor.
    708  */
    709 void CameraHardwareInterface::release() {
    710     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    711     if (CC_LIKELY(mHidlDevice != nullptr)) {
    712         mHidlDevice->close();
    713         mHidlDevice.clear();
    714     }
    715 }
    716 
    717 /**
    718  * Dump state of the camera hardware
    719  */
    720 status_t CameraHardwareInterface::dump(int fd, const Vector<String16>& /*args*/) const
    721 {
    722     ALOGV("%s(%s)", __FUNCTION__, mName.string());
    723     if (CC_LIKELY(mHidlDevice != nullptr)) {
    724         native_handle_t* handle = native_handle_create(1,0);
    725         handle->data[0] = fd;
    726         Status s = mHidlDevice->dumpState(handle);
    727         native_handle_delete(handle);
    728         return CameraProviderManager::mapToStatusT(s);
    729     }
    730     return OK; // It's fine if the HAL doesn't implement dump()
    731 }
    732 
    733 void CameraHardwareInterface::sNotifyCb(int32_t msg_type, int32_t ext1,
    734                         int32_t ext2, void *user)
    735 {
    736     ALOGV("%s", __FUNCTION__);
    737     CameraHardwareInterface *object =
    738             static_cast<CameraHardwareInterface *>(user);
    739     object->mNotifyCb(msg_type, ext1, ext2, object->mCbUser);
    740 }
    741 
    742 void CameraHardwareInterface::sDataCb(int32_t msg_type,
    743                       const camera_memory_t *data, unsigned int index,
    744                       camera_frame_metadata_t *metadata,
    745                       void *user)
    746 {
    747     ALOGV("%s", __FUNCTION__);
    748     CameraHardwareInterface *object =
    749             static_cast<CameraHardwareInterface *>(user);
    750     sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle));
    751     if (index >= mem->mNumBufs) {
    752         ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
    753              index, mem->mNumBufs);
    754         return;
    755     }
    756     object->mDataCb(msg_type, mem->mBuffers[index], metadata, object->mCbUser);
    757 }
    758 
    759 void CameraHardwareInterface::sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type,
    760                          const camera_memory_t *data, unsigned index,
    761                          void *user)
    762 {
    763     ALOGV("%s", __FUNCTION__);
    764     CameraHardwareInterface *object =
    765             static_cast<CameraHardwareInterface *>(user);
    766     // Start refcounting the heap object from here on.  When the clients
    767     // drop all references, it will be destroyed (as well as the enclosed
    768     // MemoryHeapBase.
    769     sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle));
    770     if (index >= mem->mNumBufs) {
    771         ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
    772              index, mem->mNumBufs);
    773         return;
    774     }
    775     object->mDataCbTimestamp(timestamp, msg_type, mem->mBuffers[index], object->mCbUser);
    776 }
    777 
    778 camera_memory_t* CameraHardwareInterface::sGetMemory(
    779         int fd, size_t buf_size, uint_t num_bufs,
    780         void *user __attribute__((unused)))
    781 {
    782     CameraHeapMemory *mem;
    783     if (fd < 0) {
    784         mem = new CameraHeapMemory(buf_size, num_bufs);
    785     } else {
    786         mem = new CameraHeapMemory(fd, buf_size, num_bufs);
    787     }
    788     mem->incStrong(mem);
    789     return &mem->handle;
    790 }
    791 
    792 void CameraHardwareInterface::sPutMemory(camera_memory_t *data)
    793 {
    794     if (!data) {
    795         return;
    796     }
    797 
    798     CameraHeapMemory *mem = static_cast<CameraHeapMemory *>(data->handle);
    799     mem->decStrong(mem);
    800 }
    801 
    802 }; // namespace android
    803