Loading camera/ndk/impl/ACameraMetadata.cpp +70 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,10 @@ ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYP if (mType == ACM_CHARACTERISTICS) { filterUnsupportedFeatures(); filterStreamConfigurations(); filterDurations(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS); filterDurations(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS); filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS); filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS); } // TODO: filter request/result keys } Loading Loading @@ -81,6 +85,72 @@ ACameraMetadata::filterUnsupportedFeatures() { } void ACameraMetadata::filterDurations(uint32_t tag) { const int STREAM_CONFIGURATION_SIZE = 4; const int STREAM_FORMAT_OFFSET = 0; const int STREAM_WIDTH_OFFSET = 1; const int STREAM_HEIGHT_OFFSET = 2; const int STREAM_DURATION_OFFSET = 3; camera_metadata_entry entry = mData.find(tag); if (entry.count == 0 || entry.count % 4 || entry.type != TYPE_INT64) { ALOGE("%s: malformed duration key %d! count %zu, type %d", __FUNCTION__, tag, entry.count, entry.type); return; } Vector<int64_t> filteredDurations; filteredDurations.setCapacity(entry.count * 2); for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) { int64_t format = entry.data.i64[i + STREAM_FORMAT_OFFSET]; int64_t width = entry.data.i64[i + STREAM_WIDTH_OFFSET]; int64_t height = entry.data.i64[i + STREAM_HEIGHT_OFFSET]; int64_t duration = entry.data.i32[i + STREAM_DURATION_OFFSET]; // Leave the unfiltered format in so apps depending on previous wrong // filter behavior continue to work filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); // Translate HAL formats to NDK format switch (tag) { case ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS: case ANDROID_SCALER_AVAILABLE_STALL_DURATIONS: if (format == HAL_PIXEL_FORMAT_BLOB) { format = AIMAGE_FORMAT_JPEG; filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); } break; case ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS: case ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS: if (format == HAL_PIXEL_FORMAT_BLOB) { format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD; filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); } else if (format == HAL_PIXEL_FORMAT_Y16) { format = AIMAGE_FORMAT_DEPTH16; filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); } break; default: // Should not reach here ALOGE("%s: Unkown tag 0x%x", __FUNCTION__, tag); } } mData.update(tag, filteredDurations); } void ACameraMetadata::filterStreamConfigurations() { const int STREAM_CONFIGURATION_SIZE = 4; Loading camera/ndk/impl/ACameraMetadata.h +5 −3 Original line number Diff line number Diff line Loading @@ -58,13 +58,16 @@ struct ACameraMetadata : public RefBase { camera_status_t getTags(/*out*/int32_t* numTags, /*out*/const uint32_t** tags) const; const CameraMetadata& getInternalData() const; private: bool isNdkSupportedCapability(const int32_t capability); static inline bool isVendorTag(const uint32_t tag); static bool isCaptureRequestTag(const uint32_t tag); void filterUnsupportedFeatures(); // Hide features not yet supported by NDK void filterStreamConfigurations(); // Hide input streams, translate hal format to NDK formats const CameraMetadata& getInternalData() const; void filterDurations(uint32_t tag); // translate hal format to NDK formats template<typename INTERNAL_T, typename NDK_T> camera_status_t updateImpl(uint32_t tag, uint32_t count, const NDK_T* data) { Loading Loading @@ -96,7 +99,6 @@ struct ACameraMetadata : public RefBase { } } private: // guard access of public APIs: get/update/getTags mutable Mutex mLock; CameraMetadata mData; Loading Loading
camera/ndk/impl/ACameraMetadata.cpp +70 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,10 @@ ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYP if (mType == ACM_CHARACTERISTICS) { filterUnsupportedFeatures(); filterStreamConfigurations(); filterDurations(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS); filterDurations(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS); filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS); filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS); } // TODO: filter request/result keys } Loading Loading @@ -81,6 +85,72 @@ ACameraMetadata::filterUnsupportedFeatures() { } void ACameraMetadata::filterDurations(uint32_t tag) { const int STREAM_CONFIGURATION_SIZE = 4; const int STREAM_FORMAT_OFFSET = 0; const int STREAM_WIDTH_OFFSET = 1; const int STREAM_HEIGHT_OFFSET = 2; const int STREAM_DURATION_OFFSET = 3; camera_metadata_entry entry = mData.find(tag); if (entry.count == 0 || entry.count % 4 || entry.type != TYPE_INT64) { ALOGE("%s: malformed duration key %d! count %zu, type %d", __FUNCTION__, tag, entry.count, entry.type); return; } Vector<int64_t> filteredDurations; filteredDurations.setCapacity(entry.count * 2); for (size_t i=0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) { int64_t format = entry.data.i64[i + STREAM_FORMAT_OFFSET]; int64_t width = entry.data.i64[i + STREAM_WIDTH_OFFSET]; int64_t height = entry.data.i64[i + STREAM_HEIGHT_OFFSET]; int64_t duration = entry.data.i32[i + STREAM_DURATION_OFFSET]; // Leave the unfiltered format in so apps depending on previous wrong // filter behavior continue to work filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); // Translate HAL formats to NDK format switch (tag) { case ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS: case ANDROID_SCALER_AVAILABLE_STALL_DURATIONS: if (format == HAL_PIXEL_FORMAT_BLOB) { format = AIMAGE_FORMAT_JPEG; filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); } break; case ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS: case ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS: if (format == HAL_PIXEL_FORMAT_BLOB) { format = AIMAGE_FORMAT_DEPTH_POINT_CLOUD; filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); } else if (format == HAL_PIXEL_FORMAT_Y16) { format = AIMAGE_FORMAT_DEPTH16; filteredDurations.push_back(format); filteredDurations.push_back(width); filteredDurations.push_back(height); filteredDurations.push_back(duration); } break; default: // Should not reach here ALOGE("%s: Unkown tag 0x%x", __FUNCTION__, tag); } } mData.update(tag, filteredDurations); } void ACameraMetadata::filterStreamConfigurations() { const int STREAM_CONFIGURATION_SIZE = 4; Loading
camera/ndk/impl/ACameraMetadata.h +5 −3 Original line number Diff line number Diff line Loading @@ -58,13 +58,16 @@ struct ACameraMetadata : public RefBase { camera_status_t getTags(/*out*/int32_t* numTags, /*out*/const uint32_t** tags) const; const CameraMetadata& getInternalData() const; private: bool isNdkSupportedCapability(const int32_t capability); static inline bool isVendorTag(const uint32_t tag); static bool isCaptureRequestTag(const uint32_t tag); void filterUnsupportedFeatures(); // Hide features not yet supported by NDK void filterStreamConfigurations(); // Hide input streams, translate hal format to NDK formats const CameraMetadata& getInternalData() const; void filterDurations(uint32_t tag); // translate hal format to NDK formats template<typename INTERNAL_T, typename NDK_T> camera_status_t updateImpl(uint32_t tag, uint32_t count, const NDK_T* data) { Loading Loading @@ -96,7 +99,6 @@ struct ACameraMetadata : public RefBase { } } private: // guard access of public APIs: get/update/getTags mutable Mutex mLock; CameraMetadata mData; Loading