Loading camera/device/3.2/ICameraDevice.hal +1 −1 Original line number Diff line number Diff line Loading @@ -167,7 +167,7 @@ interface ICameraDevice { * longer available. This interface is now stale, and a new instance * must be acquired if the device is reconnected. All subsequent * calls on this interface must return CAMERA_DISCONNECTED. * @return cameraDevice The interface to the newly-opened camera session, * @return session The interface to the newly-opened camera session, * or null if status is not OK. */ open(ICameraDeviceCallback callback) generates Loading camera/device/3.2/ICameraDeviceSession.hal +15 −0 Original line number Diff line number Diff line Loading @@ -247,6 +247,21 @@ interface ICameraDeviceSession { vec<BufferCache> cachesToRemove) generates (Status status, uint32_t numRequestProcessed); /** * getCaptureRequestMetadataQueue: * * Retrieves the queue used along with processCaptureRequest. If * client decides to use fast message queue to pass request metadata, * it must: * - Call getCaptureRequestMetadataQueue to retrieve the fast message queue; * - In each of the requests sent in processCaptureRequest, set * fmqSettingsSize field of CaptureRequest to be the size to read from the * fast message queue; leave settings field of CaptureRequest empty. * * @return queue the queue that client writes request metadata to. */ getCaptureRequestMetadataQueue() generates (fmq_sync<uint8_t> queue); /** * flush: * Loading camera/device/3.2/default/Android.bp +6 −2 Original line number Diff line number Diff line Loading @@ -14,10 +14,14 @@ cc_library_shared { "android.hardware.camera.provider@2.4", "liblog", "libhardware", "libcamera_metadata" "libcamera_metadata", "libfmq" ], static_libs: [ "android.hardware.camera.common@1.0-helper" ], export_include_dirs: ["."] export_include_dirs: ["."], export_shared_lib_headers: [ "libfmq", ] } camera/device/3.2/default/CameraDeviceSession.cpp +35 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ namespace device { namespace V3_2 { namespace implementation { // Size of request metadata fast message queue. Change to 0 to always use hwbinder buffer. static constexpr size_t CAMERA_REQUEST_METADATA_QUEUE_SIZE = 1 << 20 /* 1MB */; HandleImporter& CameraDeviceSession::sHandleImporter = HandleImporter::getInstance(); const int CameraDeviceSession::ResultBatcher::NOT_BATCHED; Loading Loading @@ -66,6 +69,14 @@ bool CameraDeviceSession::initialize() { mClosed = true; return true; } mRequestMetadataQueue = std::make_unique<RequestMetadataQueue>( CAMERA_REQUEST_METADATA_QUEUE_SIZE, false /* non blocking */); if (!mRequestMetadataQueue->isValid()) { ALOGE("%s: invalid fmq", __FUNCTION__); return true; } return false; } Loading Loading @@ -699,6 +710,12 @@ void CameraDeviceSession::updateBufferCaches(const hidl_vec<BufferCache>& caches } } Return<void> CameraDeviceSession::getCaptureRequestMetadataQueue( getCaptureRequestMetadataQueue_cb _hidl_cb) { _hidl_cb(*mRequestMetadataQueue->getDesc()); return Void(); } Return<void> CameraDeviceSession::processCaptureRequest( const hidl_vec<CaptureRequest>& requests, const hidl_vec<BufferCache>& cachesToRemove, Loading Loading @@ -731,7 +748,24 @@ Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& reque camera3_capture_request_t halRequest; halRequest.frame_number = request.frameNumber; bool converted = convertFromHidl(request.settings, &halRequest.settings); bool converted = true; CameraMetadata settingsFmq; // settings from FMQ if (request.fmqSettingsSize > 0) { // non-blocking read; client must write metadata before calling // processOneCaptureRequest settingsFmq.resize(request.fmqSettingsSize); bool read = mRequestMetadataQueue->read(settingsFmq.data(), request.fmqSettingsSize); if (read) { converted = convertFromHidl(settingsFmq, &halRequest.settings); } else { ALOGE("%s: capture request settings metadata couldn't be read from fmq!", __FUNCTION__); converted = false; } } else { converted = convertFromHidl(request.settings, &halRequest.settings); } if (!converted) { ALOGE("%s: capture request settings metadata is corrupt!", __FUNCTION__); return Status::INTERNAL_ERROR; Loading camera/device/3.2/default/CameraDeviceSession.h +17 −8 Original line number Diff line number Diff line Loading @@ -17,19 +17,20 @@ #ifndef ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE3SESSION_H #define ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE3SESSION_H #include <deque> #include <map> #include <unordered_map> #include "hardware/camera_common.h" #include "hardware/camera3.h" #include "utils/Mutex.h" #include <android/hardware/camera/device/3.2/ICameraDevice.h> #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h> #include <hidl/Status.h> #include <fmq/MessageQueue.h> #include <hidl/MQDescriptor.h> #include <hidl/Status.h> #include <include/convert.h> #include "HandleImporter.h" #include <deque> #include <map> #include <unordered_map> #include "CameraMetadata.h" #include "HandleImporter.h" #include "hardware/camera3.h" #include "hardware/camera_common.h" #include "utils/Mutex.h" namespace android { namespace hardware { Loading @@ -44,6 +45,9 @@ using ::android::hardware::camera::device::V3_2::StreamConfiguration; using ::android::hardware::camera::device::V3_2::ICameraDeviceSession; using ::android::hardware::camera::common::V1_0::Status; using ::android::hardware::camera::common::V1_0::helper::HandleImporter; using ::android::hardware::kSynchronizedReadWrite; using ::android::hardware::MessageQueue; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::hidl_vec; Loading Loading @@ -84,6 +88,8 @@ struct CameraDeviceSession : public ICameraDeviceSession, private camera3_callba RequestTemplate type, constructDefaultRequestSettings_cb _hidl_cb) override; Return<void> configureStreams( const StreamConfiguration& requestedConfiguration, configureStreams_cb _hidl_cb) override; Return<void> getCaptureRequestMetadataQueue( getCaptureRequestMetadataQueue_cb _hidl_cb) override; Return<void> processCaptureRequest( const hidl_vec<CaptureRequest>& requests, const hidl_vec<BufferCache>& cachesToRemove, Loading Loading @@ -126,6 +132,9 @@ private: common::V1_0::helper::CameraMetadata mDeviceInfo; using RequestMetadataQueue = MessageQueue<uint8_t, kSynchronizedReadWrite>; std::unique_ptr<RequestMetadataQueue> mRequestMetadataQueue; class ResultBatcher { public: ResultBatcher(const sp<ICameraDeviceCallback>& callback); Loading Loading
camera/device/3.2/ICameraDevice.hal +1 −1 Original line number Diff line number Diff line Loading @@ -167,7 +167,7 @@ interface ICameraDevice { * longer available. This interface is now stale, and a new instance * must be acquired if the device is reconnected. All subsequent * calls on this interface must return CAMERA_DISCONNECTED. * @return cameraDevice The interface to the newly-opened camera session, * @return session The interface to the newly-opened camera session, * or null if status is not OK. */ open(ICameraDeviceCallback callback) generates Loading
camera/device/3.2/ICameraDeviceSession.hal +15 −0 Original line number Diff line number Diff line Loading @@ -247,6 +247,21 @@ interface ICameraDeviceSession { vec<BufferCache> cachesToRemove) generates (Status status, uint32_t numRequestProcessed); /** * getCaptureRequestMetadataQueue: * * Retrieves the queue used along with processCaptureRequest. If * client decides to use fast message queue to pass request metadata, * it must: * - Call getCaptureRequestMetadataQueue to retrieve the fast message queue; * - In each of the requests sent in processCaptureRequest, set * fmqSettingsSize field of CaptureRequest to be the size to read from the * fast message queue; leave settings field of CaptureRequest empty. * * @return queue the queue that client writes request metadata to. */ getCaptureRequestMetadataQueue() generates (fmq_sync<uint8_t> queue); /** * flush: * Loading
camera/device/3.2/default/Android.bp +6 −2 Original line number Diff line number Diff line Loading @@ -14,10 +14,14 @@ cc_library_shared { "android.hardware.camera.provider@2.4", "liblog", "libhardware", "libcamera_metadata" "libcamera_metadata", "libfmq" ], static_libs: [ "android.hardware.camera.common@1.0-helper" ], export_include_dirs: ["."] export_include_dirs: ["."], export_shared_lib_headers: [ "libfmq", ] }
camera/device/3.2/default/CameraDeviceSession.cpp +35 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ namespace device { namespace V3_2 { namespace implementation { // Size of request metadata fast message queue. Change to 0 to always use hwbinder buffer. static constexpr size_t CAMERA_REQUEST_METADATA_QUEUE_SIZE = 1 << 20 /* 1MB */; HandleImporter& CameraDeviceSession::sHandleImporter = HandleImporter::getInstance(); const int CameraDeviceSession::ResultBatcher::NOT_BATCHED; Loading Loading @@ -66,6 +69,14 @@ bool CameraDeviceSession::initialize() { mClosed = true; return true; } mRequestMetadataQueue = std::make_unique<RequestMetadataQueue>( CAMERA_REQUEST_METADATA_QUEUE_SIZE, false /* non blocking */); if (!mRequestMetadataQueue->isValid()) { ALOGE("%s: invalid fmq", __FUNCTION__); return true; } return false; } Loading Loading @@ -699,6 +710,12 @@ void CameraDeviceSession::updateBufferCaches(const hidl_vec<BufferCache>& caches } } Return<void> CameraDeviceSession::getCaptureRequestMetadataQueue( getCaptureRequestMetadataQueue_cb _hidl_cb) { _hidl_cb(*mRequestMetadataQueue->getDesc()); return Void(); } Return<void> CameraDeviceSession::processCaptureRequest( const hidl_vec<CaptureRequest>& requests, const hidl_vec<BufferCache>& cachesToRemove, Loading Loading @@ -731,7 +748,24 @@ Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& reque camera3_capture_request_t halRequest; halRequest.frame_number = request.frameNumber; bool converted = convertFromHidl(request.settings, &halRequest.settings); bool converted = true; CameraMetadata settingsFmq; // settings from FMQ if (request.fmqSettingsSize > 0) { // non-blocking read; client must write metadata before calling // processOneCaptureRequest settingsFmq.resize(request.fmqSettingsSize); bool read = mRequestMetadataQueue->read(settingsFmq.data(), request.fmqSettingsSize); if (read) { converted = convertFromHidl(settingsFmq, &halRequest.settings); } else { ALOGE("%s: capture request settings metadata couldn't be read from fmq!", __FUNCTION__); converted = false; } } else { converted = convertFromHidl(request.settings, &halRequest.settings); } if (!converted) { ALOGE("%s: capture request settings metadata is corrupt!", __FUNCTION__); return Status::INTERNAL_ERROR; Loading
camera/device/3.2/default/CameraDeviceSession.h +17 −8 Original line number Diff line number Diff line Loading @@ -17,19 +17,20 @@ #ifndef ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE3SESSION_H #define ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE3SESSION_H #include <deque> #include <map> #include <unordered_map> #include "hardware/camera_common.h" #include "hardware/camera3.h" #include "utils/Mutex.h" #include <android/hardware/camera/device/3.2/ICameraDevice.h> #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h> #include <hidl/Status.h> #include <fmq/MessageQueue.h> #include <hidl/MQDescriptor.h> #include <hidl/Status.h> #include <include/convert.h> #include "HandleImporter.h" #include <deque> #include <map> #include <unordered_map> #include "CameraMetadata.h" #include "HandleImporter.h" #include "hardware/camera3.h" #include "hardware/camera_common.h" #include "utils/Mutex.h" namespace android { namespace hardware { Loading @@ -44,6 +45,9 @@ using ::android::hardware::camera::device::V3_2::StreamConfiguration; using ::android::hardware::camera::device::V3_2::ICameraDeviceSession; using ::android::hardware::camera::common::V1_0::Status; using ::android::hardware::camera::common::V1_0::helper::HandleImporter; using ::android::hardware::kSynchronizedReadWrite; using ::android::hardware::MessageQueue; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::hidl_vec; Loading Loading @@ -84,6 +88,8 @@ struct CameraDeviceSession : public ICameraDeviceSession, private camera3_callba RequestTemplate type, constructDefaultRequestSettings_cb _hidl_cb) override; Return<void> configureStreams( const StreamConfiguration& requestedConfiguration, configureStreams_cb _hidl_cb) override; Return<void> getCaptureRequestMetadataQueue( getCaptureRequestMetadataQueue_cb _hidl_cb) override; Return<void> processCaptureRequest( const hidl_vec<CaptureRequest>& requests, const hidl_vec<BufferCache>& cachesToRemove, Loading Loading @@ -126,6 +132,9 @@ private: common::V1_0::helper::CameraMetadata mDeviceInfo; using RequestMetadataQueue = MessageQueue<uint8_t, kSynchronizedReadWrite>; std::unique_ptr<RequestMetadataQueue> mRequestMetadataQueue; class ResultBatcher { public: ResultBatcher(const sp<ICameraDeviceCallback>& callback); Loading