From e57e9a2ca66a801ace5d6b93200d24807d2566cc Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Thu, 23 Aug 2018 15:36:41 -0700 Subject: [PATCH] Camera NDK: internal->public format conversion Test: new CTS test Bug: 112897492 Change-Id: I785612966e7c6201db333e3a736e6efda9e63feb --- camera/ndk/impl/ACameraMetadata.cpp | 70 +++++++++++++++++++++++++++++ camera/ndk/impl/ACameraMetadata.h | 8 ++-- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/camera/ndk/impl/ACameraMetadata.cpp b/camera/ndk/impl/ACameraMetadata.cpp index fc00a2d2ba..d73f7440e7 100644 --- a/camera/ndk/impl/ACameraMetadata.cpp +++ b/camera/ndk/impl/ACameraMetadata.cpp @@ -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 } @@ -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 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; diff --git a/camera/ndk/impl/ACameraMetadata.h b/camera/ndk/impl/ACameraMetadata.h index 0fd7efa163..e76b80cef7 100644 --- a/camera/ndk/impl/ACameraMetadata.h +++ b/camera/ndk/impl/ACameraMetadata.h @@ -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 camera_status_t updateImpl(uint32_t tag, uint32_t count, const NDK_T* data) { @@ -96,7 +99,6 @@ struct ACameraMetadata : public RefBase { } } - private: // guard access of public APIs: get/update/getTags mutable Mutex mLock; CameraMetadata mData;