diff --git a/camera/ndk/impl/ACameraMetadata.cpp b/camera/ndk/impl/ACameraMetadata.cpp index de40990b93..359eaed81a 100644 --- a/camera/ndk/impl/ACameraMetadata.cpp +++ b/camera/ndk/impl/ACameraMetadata.cpp @@ -38,6 +38,8 @@ ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYP filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS); filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS); filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS); + filterDurations(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS); + filterDurations(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS); } // TODO: filter request/result keys } @@ -186,6 +188,16 @@ ACameraMetadata::filterDurations(uint32_t tag) { filteredDurations.push_back(duration); } break; + case ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS: + case ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS: + if (format == HAL_PIXEL_FORMAT_BLOB) { + format = AIMAGE_FORMAT_DEPTH_JPEG; + 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); @@ -284,6 +296,32 @@ ACameraMetadata::filterStreamConfigurations() { filteredHeicStreamConfigs.push_back(isInput); } mData.update(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, filteredHeicStreamConfigs); + + entry = mData.find(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS); + Vector filteredDynamicDepthStreamConfigs; + filteredDynamicDepthStreamConfigs.setCapacity(entry.count); + + for (size_t i = 0; i < entry.count; i += STREAM_CONFIGURATION_SIZE) { + int32_t format = entry.data.i32[i + STREAM_FORMAT_OFFSET]; + int32_t width = entry.data.i32[i + STREAM_WIDTH_OFFSET]; + int32_t height = entry.data.i32[i + STREAM_HEIGHT_OFFSET]; + int32_t isInput = entry.data.i32[i + STREAM_IS_INPUT_OFFSET]; + if (isInput == ACAMERA_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_INPUT) { + // Hide input streams + continue; + } + // Translate HAL formats to NDK format + if (format == HAL_PIXEL_FORMAT_BLOB) { + format = AIMAGE_FORMAT_DEPTH_JPEG; + } + + filteredDynamicDepthStreamConfigs.push_back(format); + filteredDynamicDepthStreamConfigs.push_back(width); + filteredDynamicDepthStreamConfigs.push_back(height); + filteredDynamicDepthStreamConfigs.push_back(isInput); + } + mData.update(ACAMERA_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS, + filteredDynamicDepthStreamConfigs); } bool diff --git a/media/ndk/NdkImageReader.cpp b/media/ndk/NdkImageReader.cpp index b929f7f802..b010aa9781 100644 --- a/media/ndk/NdkImageReader.cpp +++ b/media/ndk/NdkImageReader.cpp @@ -70,6 +70,7 @@ AImageReader::isSupportedFormatAndUsage(int32_t format, uint64_t usage) { case AIMAGE_FORMAT_DEPTH_POINT_CLOUD: case AIMAGE_FORMAT_Y8: case AIMAGE_FORMAT_HEIC: + case AIMAGE_FORMAT_DEPTH_JPEG: return true; case AIMAGE_FORMAT_PRIVATE: // For private format, cpu usage is prohibited. @@ -98,6 +99,7 @@ AImageReader::getNumPlanesForFormat(int32_t format) { case AIMAGE_FORMAT_DEPTH_POINT_CLOUD: case AIMAGE_FORMAT_Y8: case AIMAGE_FORMAT_HEIC: + case AIMAGE_FORMAT_DEPTH_JPEG: return 1; case AIMAGE_FORMAT_PRIVATE: return 0; diff --git a/media/ndk/include/media/NdkImage.h b/media/ndk/include/media/NdkImage.h index 14d88cbbb2..3e60de0ab6 100644 --- a/media/ndk/include/media/NdkImage.h +++ b/media/ndk/include/media/NdkImage.h @@ -535,6 +535,15 @@ enum AIMAGE_FORMATS { * Format as described in ISO/IEC 23008-12.

*/ AIMAGE_FORMAT_HEIC = 0x48454946, + + /** + * Depth augmented compressed JPEG format. + * + *

JPEG compressed main image along with XMP embedded depth metadata + * following ISO 16684-1:2011(E).

+ */ + AIMAGE_FORMAT_DEPTH_JPEG = 0x69656963, + }; /**