From 72064af7e75f7e3b2eb2e58a3af408861eb8c4e9 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Tue, 11 Aug 2015 13:33:37 -0700 Subject: Camera: Fix framework bugs with DEPTH-only camera devices Mostly due to no standard stream configurations being defined, and for the correct overrides for DEPTH_POINT_CLOUD format. Bug: 20537722 Change-Id: I8a18f5f68697a09dcc4d7555e51728193fe7f333 --- .../camera2/params/StreamConfigurationMap.java | 21 ++++++++++++---- media/java/android/media/ImageReader.java | 28 +++++++++++++++------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java index 8e0eab2..e71e49f 100644 --- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java +++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java @@ -98,9 +98,19 @@ public final class StreamConfigurationMap { HighSpeedVideoConfiguration[] highSpeedVideoConfigurations, ReprocessFormatsMap inputOutputFormatsMap, boolean listHighResolution) { - mConfigurations = checkArrayElementsNotNull(configurations, "configurations"); - mMinFrameDurations = checkArrayElementsNotNull(minFrameDurations, "minFrameDurations"); - mStallDurations = checkArrayElementsNotNull(stallDurations, "stallDurations"); + + if (configurations == null) { + // If no color configurations exist, ensure depth ones do + checkArrayElementsNotNull(depthConfigurations, "depthConfigurations"); + mConfigurations = new StreamConfiguration[0]; + mMinFrameDurations = new StreamConfigurationDuration[0]; + mStallDurations = new StreamConfigurationDuration[0]; + } else { + mConfigurations = checkArrayElementsNotNull(configurations, "configurations"); + mMinFrameDurations = checkArrayElementsNotNull(minFrameDurations, "minFrameDurations"); + mStallDurations = checkArrayElementsNotNull(stallDurations, "stallDurations"); + } + mListHighResolution = listHighResolution; if (depthConfigurations == null) { @@ -124,7 +134,7 @@ public final class StreamConfigurationMap { } // For each format, track how many sizes there are available to configure - for (StreamConfiguration config : configurations) { + for (StreamConfiguration config : mConfigurations) { int fmt = config.getFormat(); SparseIntArray map = null; if (config.isOutput()) { @@ -159,7 +169,8 @@ public final class StreamConfigurationMap { mDepthOutputFormats.get(config.getFormat()) + 1); } - if (mOutputFormats.indexOfKey(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) < 0) { + if (configurations != null && + mOutputFormats.indexOfKey(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) < 0) { throw new AssertionError( "At least one stream configuration for IMPLEMENTATION_DEFINED must exist"); } diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java index c97de5d..2164eec 100644 --- a/media/java/android/media/ImageReader.java +++ b/media/java/android/media/ImageReader.java @@ -679,17 +679,31 @@ public class ImageReader implements AutoCloseable { @Override public int getWidth() { throwISEIfImageIsInvalid(); - mWidth = (getFormat() == ImageFormat.JPEG) ? ImageReader.this.getWidth() : - nativeGetWidth(mFormat); - return mWidth; + int width; + switch(getFormat()) { + case ImageFormat.JPEG: + case ImageFormat.DEPTH_POINT_CLOUD: + width = ImageReader.this.getWidth(); + break; + default: + width = nativeGetWidth(mFormat); + } + return width; } @Override public int getHeight() { throwISEIfImageIsInvalid(); - mHeight = (getFormat() == ImageFormat.JPEG) ? ImageReader.this.getHeight() : - nativeGetHeight(mFormat); - return mHeight; + int height; + switch(getFormat()) { + case ImageFormat.JPEG: + case ImageFormat.DEPTH_POINT_CLOUD: + height = ImageReader.this.getHeight(); + break; + default: + height = nativeGetHeight(mFormat); + } + return height; } @Override @@ -826,8 +840,6 @@ public class ImageReader implements AutoCloseable { private long mTimestamp; private SurfacePlane[] mPlanes; - private int mHeight = -1; - private int mWidth = -1; private int mFormat = ImageFormat.UNKNOWN; // If this image is detached from the ImageReader. private AtomicBoolean mIsDetached = new AtomicBoolean(false); -- cgit v1.1