Merge "Camera: Add HEIC format output"

This commit is contained in:
Shuzhen Wang
2019-02-07 19:15:32 +00:00
committed by Android (Google) Code Review
15 changed files with 342 additions and 52 deletions

View File

@@ -14172,6 +14172,7 @@ package android.graphics {
field public static final int DEPTH_POINT_CLOUD = 257; // 0x101
field public static final int FLEX_RGBA_8888 = 42; // 0x2a
field public static final int FLEX_RGB_888 = 41; // 0x29
field public static final int HEIC = 1212500294; // 0x48454946
field public static final int JPEG = 256; // 0x100
field public static final int NV16 = 16; // 0x10
field public static final int NV21 = 17; // 0x11

View File

@@ -1159,9 +1159,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <li>Each output JPEG size in android.scaler.availableStreamConfigurations will have at least
* one corresponding size that has the same aspect ratio in availableThumbnailSizes,
* and vice versa.</li>
* <li>All non-<code>(0, 0)</code> sizes will have non-zero widths and heights.
* This key is available on all devices.</li>
* <li>All non-<code>(0, 0)</code> sizes will have non-zero widths and heights.</li>
* </ul>
* <p>This list is also used as supported thumbnail sizes for HEIC image format capture.</p>
* <p>This key is available on all devices.</p>
*
* @see CaptureRequest#JPEG_THUMBNAIL_SIZE
*/
@@ -3838,6 +3839,74 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
public static final Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES =
new Key<int[]>("android.distortionCorrection.availableModes", int[].class);
/**
* <p>The available HEIC (ISO/IEC 23008-12) stream
* configurations that this camera device supports
* (i.e. format, width, height, output/input stream).</p>
* <p>The configurations are listed as <code>(format, width, height, input?)</code> tuples.</p>
* <p>If the camera device supports HEIC image format, it will support identical set of stream
* combinations involving HEIC image format, compared to the combinations involving JPEG
* image format as required by the device's hardware level and capabilities.</p>
* <p>All the static, control, and dynamic metadata tags related to JPEG apply to HEIC formats.
* Configuring JPEG and HEIC streams at the same time is not supported.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
*
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @hide
*/
public static final Key<android.hardware.camera2.params.StreamConfiguration[]> HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS =
new Key<android.hardware.camera2.params.StreamConfiguration[]>("android.heic.availableHeicStreamConfigurations", android.hardware.camera2.params.StreamConfiguration[].class);
/**
* <p>This lists the minimum frame duration for each
* format/size combination for HEIC output formats.</p>
* <p>This should correspond to the frame duration when only that
* stream is active, with all processing (typically in android.*.mode)
* set to either OFF or FAST.</p>
* <p>When multiple streams are used in a request, the minimum frame
* duration will be max(individual stream min durations).</p>
* <p>See {@link CaptureRequest#SENSOR_FRAME_DURATION android.sensor.frameDuration} and
* android.scaler.availableStallDurations for more details about
* calculating the max frame rate.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
*
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @see CaptureRequest#SENSOR_FRAME_DURATION
* @hide
*/
public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS =
new Key<android.hardware.camera2.params.StreamConfigurationDuration[]>("android.heic.availableHeicMinFrameDurations", android.hardware.camera2.params.StreamConfigurationDuration[].class);
/**
* <p>This lists the maximum stall duration for each
* output format/size combination for HEIC streams.</p>
* <p>A stall duration is how much extra time would get added
* to the normal minimum frame duration for a repeating request
* that has streams with non-zero stall.</p>
* <p>This functions similarly to
* android.scaler.availableStallDurations for HEIC
* streams.</p>
* <p>All HEIC output stream formats may have a nonzero stall
* duration.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
*
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @hide
*/
public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> HEIC_AVAILABLE_HEIC_STALL_DURATIONS =
new Key<android.hardware.camera2.params.StreamConfigurationDuration[]>("android.heic.availableHeicStallDurations", android.hardware.camera2.params.StreamConfigurationDuration[].class);
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/

View File

@@ -356,12 +356,6 @@ public abstract class CameraDevice implements AutoCloseable {
* </table><br>
* </p>
*
* <p>MONOCHROME-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES}
* includes {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME MONOCHROME}) devices
* supporting {@link android.graphics.ImageFormat#Y8 Y8} support substituting {@code YUV}
* streams with {@code Y8} in all guaranteed stream combinations for the device's hardware level
* and capabilities.</p>
*
* <p>FULL-level ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
* {@code == }{@link CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL FULL}) devices
* support at least the following stream combinations in addition to those for
@@ -435,6 +429,18 @@ public abstract class CameraDevice implements AutoCloseable {
* </table><br>
* </p>
*
* <p>MONOCHROME-capability ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES}
* includes {@link CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME MONOCHROME}) devices
* supporting {@link android.graphics.ImageFormat#Y8 Y8} support substituting {@code YUV}
* streams with {@code Y8} in all guaranteed stream combinations for the device's hardware level
* and capabilities.</p>
*
* <p>Devices capable of outputting HEIC formats ({@link StreamConfigurationMap#getOutputFormats}
* contains {@link android.graphics.ImageFormat#HEIC}) will support substituting {@code JPEG}
* streams with {@code HEIC} in all guaranteed stream combinations for the device's hardware
* level and capabilities. Calling createCaptureSession with both JPEG and HEIC outputs is not
* supported.</p>
*
* <p>Clients can access the above mandatory stream combination tables via
* {@link android.hardware.camera2.params.MandatoryStreamCombination}.</p>
*

View File

@@ -2126,6 +2126,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p>Setting a location object in a request will include the GPS coordinates of the location
* into any JPEG images captured based on the request. These coordinates can then be
* viewed by anyone who receives the JPEG image.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p>This key is available on all devices.</p>
*/
@PublicKey
@@ -2136,6 +2137,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>GPS coordinates to include in output JPEG
* EXIF.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p><b>Range of valid values:</b><br>
* (-180 - 180], [-90,90], [-inf, inf]</p>
* <p>This key is available on all devices.</p>
@@ -2147,6 +2149,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>32 characters describing GPS algorithm to
* include in EXIF.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p>This key is available on all devices.</p>
* @hide
*/
@@ -2156,6 +2159,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>Time GPS fix was made to include in
* EXIF.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p><b>Units</b>: UTC in seconds since January 1, 1970</p>
* <p>This key is available on all devices.</p>
* @hide
@@ -2195,6 +2199,10 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </code></pre>
* <p>For EXTERNAL cameras the sensor orientation will always be set to 0 and the facing will
* also be set to EXTERNAL. The above code is not relevant in such case.</p>
* <p>This tag is also used to describe the orientation of the HEIC image capture, in which
* case the rotation is reflected by
* {@link android.media.ExifInterface#TAG_ORIENTATION EXIF orientation flag}, and not by
* rotating the image data itself.</p>
* <p><b>Units</b>: Degrees in multiples of 90</p>
* <p><b>Range of valid values:</b><br>
* 0, 90, 180, 270</p>
@@ -2209,7 +2217,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>Compression quality of the final JPEG
* image.</p>
* <p>85-95 is typical usage range.</p>
* <p>85-95 is typical usage range. This tag is also used to describe the quality
* of the HEIC image capture.</p>
* <p><b>Range of valid values:</b><br>
* 1-100; larger is higher quality</p>
* <p>This key is available on all devices.</p>
@@ -2221,6 +2230,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>Compression quality of JPEG
* thumbnail.</p>
* <p>This tag is also used to describe the quality of the HEIC image capture.</p>
* <p><b>Range of valid values:</b><br>
* 1-100; larger is higher quality</p>
* <p>This key is available on all devices.</p>
@@ -2253,6 +2263,10 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* orientation is requested. LEGACY device will always report unrotated thumbnail
* size.</li>
* </ul>
* <p>The tag is also used as thumbnail size for HEIC image format capture, in which case the
* the thumbnail rotation is reflected by
* {@link android.media.ExifInterface#TAG_ORIENTATION EXIF orientation flag}, and not by
* rotating the thumbnail data itself.</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#JPEG_AVAILABLE_THUMBNAIL_SIZES android.jpeg.availableThumbnailSizes}</p>
* <p>This key is available on all devices.</p>

View File

@@ -2450,6 +2450,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>Setting a location object in a request will include the GPS coordinates of the location
* into any JPEG images captured based on the request. These coordinates can then be
* viewed by anyone who receives the JPEG image.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p>This key is available on all devices.</p>
*/
@PublicKey
@@ -2460,6 +2461,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>GPS coordinates to include in output JPEG
* EXIF.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p><b>Range of valid values:</b><br>
* (-180 - 180], [-90,90], [-inf, inf]</p>
* <p>This key is available on all devices.</p>
@@ -2471,6 +2473,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>32 characters describing GPS algorithm to
* include in EXIF.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p>This key is available on all devices.</p>
* @hide
*/
@@ -2480,6 +2483,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>Time GPS fix was made to include in
* EXIF.</p>
* <p>This tag is also used for HEIC image capture.</p>
* <p><b>Units</b>: UTC in seconds since January 1, 1970</p>
* <p>This key is available on all devices.</p>
* @hide
@@ -2519,6 +2523,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </code></pre>
* <p>For EXTERNAL cameras the sensor orientation will always be set to 0 and the facing will
* also be set to EXTERNAL. The above code is not relevant in such case.</p>
* <p>This tag is also used to describe the orientation of the HEIC image capture, in which
* case the rotation is reflected by
* {@link android.media.ExifInterface#TAG_ORIENTATION EXIF orientation flag}, and not by
* rotating the image data itself.</p>
* <p><b>Units</b>: Degrees in multiples of 90</p>
* <p><b>Range of valid values:</b><br>
* 0, 90, 180, 270</p>
@@ -2533,7 +2541,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>Compression quality of the final JPEG
* image.</p>
* <p>85-95 is typical usage range.</p>
* <p>85-95 is typical usage range. This tag is also used to describe the quality
* of the HEIC image capture.</p>
* <p><b>Range of valid values:</b><br>
* 1-100; larger is higher quality</p>
* <p>This key is available on all devices.</p>
@@ -2545,6 +2554,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>Compression quality of JPEG
* thumbnail.</p>
* <p>This tag is also used to describe the quality of the HEIC image capture.</p>
* <p><b>Range of valid values:</b><br>
* 1-100; larger is higher quality</p>
* <p>This key is available on all devices.</p>
@@ -2577,6 +2587,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* orientation is requested. LEGACY device will always report unrotated thumbnail
* size.</li>
* </ul>
* <p>The tag is also used as thumbnail size for HEIC image format capture, in which case the
* the thumbnail rotation is reflected by
* {@link android.media.ExifInterface#TAG_ORIENTATION EXIF orientation flag}, and not by
* rotating the thumbnail data itself.</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#JPEG_AVAILABLE_THUMBNAIL_SIZES android.jpeg.availableThumbnailSizes}</p>
* <p>This key is available on all devices.</p>

View File

@@ -1133,6 +1133,9 @@ public class CameraMetadataNative implements Parcelable {
/*dynamicDepthConfigurations*/ null,
/*dynamicDepthMinFrameDurations*/ null,
/*dynamicDepthStallDurations*/ null,
/*heicconfiguration*/ null,
/*heicminduration*/ null,
/*heicstallduration*/ null,
/*highspeedvideoconfigurations*/ null,
/*inputoutputformatsmap*/ null, listHighResolution, supportsPrivate[i]);
break;
@@ -1144,6 +1147,9 @@ public class CameraMetadataNative implements Parcelable {
/*dynamicDepthConfigurations*/ null,
/*dynamicDepthMinFrameDurations*/ null,
/*dynamicDepthStallDurations*/ null,
/*heicconfiguration*/ null,
/*heicminduration*/ null,
/*heicstallduration*/ null,
highSpeedVideoConfigurations,
/*inputoutputformatsmap*/ null, listHighResolution, supportsPrivate[i]);
break;
@@ -1155,6 +1161,9 @@ public class CameraMetadataNative implements Parcelable {
/*dynamicDepthConfigurations*/ null,
/*dynamicDepthMinFrameDurations*/ null,
/*dynamicDepthStallDurations*/ null,
/*heicconfiguration*/ null,
/*heicminduration*/ null,
/*heicstallduration*/ null,
/*highSpeedVideoConfigurations*/ null,
inputOutputFormatsMap, listHighResolution, supportsPrivate[i]);
break;
@@ -1166,6 +1175,9 @@ public class CameraMetadataNative implements Parcelable {
/*dynamicDepthConfigurations*/ null,
/*dynamicDepthMinFrameDurations*/ null,
/*dynamicDepthStallDurations*/ null,
/*heicconfiguration*/ null,
/*heicminduration*/ null,
/*heicstallduration*/ null,
/*highSpeedVideoConfigurations*/ null,
/*inputOutputFormatsMap*/ null, listHighResolution, supportsPrivate[i]);
}
@@ -1230,6 +1242,12 @@ public class CameraMetadataNative implements Parcelable {
CameraCharacteristics.DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS);
StreamConfigurationDuration[] dynamicDepthStallDurations = getBase(
CameraCharacteristics.DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS);
StreamConfiguration[] heicConfigurations = getBase(
CameraCharacteristics.HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS);
StreamConfigurationDuration[] heicMinFrameDurations = getBase(
CameraCharacteristics.HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS);
StreamConfigurationDuration[] heicStallDurations = getBase(
CameraCharacteristics.HEIC_AVAILABLE_HEIC_STALL_DURATIONS);
HighSpeedVideoConfiguration[] highSpeedVideoConfigurations = getBase(
CameraCharacteristics.CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS);
ReprocessFormatsMap inputOutputFormatsMap = getBase(
@@ -1239,7 +1257,9 @@ public class CameraMetadataNative implements Parcelable {
configurations, minFrameDurations, stallDurations,
depthConfigurations, depthMinFrameDurations, depthStallDurations,
dynamicDepthConfigurations, dynamicDepthMinFrameDurations,
dynamicDepthStallDurations, highSpeedVideoConfigurations, inputOutputFormatsMap,
dynamicDepthStallDurations, heicConfigurations,
heicMinFrameDurations, heicStallDurations,
highSpeedVideoConfigurations, inputOutputFormatsMap,
listHighResolution);
}

View File

@@ -79,6 +79,22 @@ public final class StreamConfigurationMap {
* @param configurations a non-{@code null} array of {@link StreamConfiguration}
* @param minFrameDurations a non-{@code null} array of {@link StreamConfigurationDuration}
* @param stallDurations a non-{@code null} array of {@link StreamConfigurationDuration}
* @param depthConfigurations a non-{@code null} array of depth {@link StreamConfiguration}
* @param depthMinFrameDurations a non-{@code null} array of depth
* {@link StreamConfigurationDuration}
* @param depthStallDurations a non-{@code null} array of depth
* {@link StreamConfigurationDuration}
* @param dynamicDepthConfigurations a non-{@code null} array of dynamic depth
* {@link StreamConfiguration}
* @param dynamicDepthMinFrameDurations a non-{@code null} array of dynamic depth
* {@link StreamConfigurationDuration}
* @param dynamicDepthStallDurations a non-{@code null} array of dynamic depth
* {@link StreamConfigurationDuration}
* @param heicConfigurations a non-{@code null} array of heic {@link StreamConfiguration}
* @param heicMinFrameDurations a non-{@code null} array of heic
* {@link StreamConfigurationDuration}
* @param heicStallDurations a non-{@code null} array of heic
* {@link StreamConfigurationDuration}
* @param highSpeedVideoConfigurations an array of {@link HighSpeedVideoConfiguration}, null if
* camera device does not support high speed video recording
* @param listHighResolution a flag indicating whether the device supports BURST_CAPTURE
@@ -98,14 +114,19 @@ public final class StreamConfigurationMap {
StreamConfiguration[] dynamicDepthConfigurations,
StreamConfigurationDuration[] dynamicDepthMinFrameDurations,
StreamConfigurationDuration[] dynamicDepthStallDurations,
StreamConfiguration[] heicConfigurations,
StreamConfigurationDuration[] heicMinFrameDurations,
StreamConfigurationDuration[] heicStallDurations,
HighSpeedVideoConfiguration[] highSpeedVideoConfigurations,
ReprocessFormatsMap inputOutputFormatsMap,
boolean listHighResolution) {
this(configurations, minFrameDurations, stallDurations,
depthConfigurations, depthMinFrameDurations, depthStallDurations,
dynamicDepthConfigurations, dynamicDepthMinFrameDurations,
dynamicDepthStallDurations, highSpeedVideoConfigurations, inputOutputFormatsMap,
listHighResolution, /*enforceImplementationDefined*/ true);
dynamicDepthStallDurations,
heicConfigurations, heicMinFrameDurations, heicStallDurations,
highSpeedVideoConfigurations, inputOutputFormatsMap, listHighResolution,
/*enforceImplementationDefined*/ true);
}
/**
@@ -117,6 +138,22 @@ public final class StreamConfigurationMap {
* @param configurations a non-{@code null} array of {@link StreamConfiguration}
* @param minFrameDurations a non-{@code null} array of {@link StreamConfigurationDuration}
* @param stallDurations a non-{@code null} array of {@link StreamConfigurationDuration}
* @param depthConfigurations a non-{@code null} array of depth {@link StreamConfiguration}
* @param depthMinFrameDurations a non-{@code null} array of depth
* {@link StreamConfigurationDuration}
* @param depthStallDurations a non-{@code null} array of depth
* {@link StreamConfigurationDuration}
* @param dynamicDepthConfigurations a non-{@code null} array of dynamic depth
* {@link StreamConfiguration}
* @param dynamicDepthMinFrameDurations a non-{@code null} array of dynamic depth
* {@link StreamConfigurationDuration}
* @param dynamicDepthStallDurations a non-{@code null} array of dynamic depth
* {@link StreamConfigurationDuration}
* @param heicConfigurations a non-{@code null} array of heic {@link StreamConfiguration}
* @param heicMinFrameDurations a non-{@code null} array of heic
* {@link StreamConfigurationDuration}
* @param heicStallDurations a non-{@code null} array of heic
* {@link StreamConfigurationDuration}
* @param highSpeedVideoConfigurations an array of {@link HighSpeedVideoConfiguration}, null if
* camera device does not support high speed video recording
* @param listHighResolution a flag indicating whether the device supports BURST_CAPTURE
@@ -138,14 +175,23 @@ public final class StreamConfigurationMap {
StreamConfiguration[] dynamicDepthConfigurations,
StreamConfigurationDuration[] dynamicDepthMinFrameDurations,
StreamConfigurationDuration[] dynamicDepthStallDurations,
StreamConfiguration[] heicConfigurations,
StreamConfigurationDuration[] heicMinFrameDurations,
StreamConfigurationDuration[] heicStallDurations,
HighSpeedVideoConfiguration[] highSpeedVideoConfigurations,
ReprocessFormatsMap inputOutputFormatsMap,
boolean listHighResolution,
boolean enforceImplementationDefined) {
if (configurations == null &&
depthConfigurations == null &&
heicConfigurations == null) {
throw new NullPointerException("At least one of color/depth/heic configurations " +
"must not be null");
}
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];
@@ -183,6 +229,19 @@ public final class StreamConfigurationMap {
"dynamicDepthStallDurations");
}
if (heicConfigurations == null) {
mHeicConfigurations = new StreamConfiguration[0];
mHeicMinFrameDurations = new StreamConfigurationDuration[0];
mHeicStallDurations = new StreamConfigurationDuration[0];
} else {
mHeicConfigurations = checkArrayElementsNotNull(heicConfigurations,
"heicConfigurations");
mHeicMinFrameDurations = checkArrayElementsNotNull(heicMinFrameDurations,
"heicMinFrameDurations");
mHeicStallDurations = checkArrayElementsNotNull(heicStallDurations,
"heicStallDurations");
}
if (highSpeedVideoConfigurations == null) {
mHighSpeedVideoConfigurations = new HighSpeedVideoConfiguration[0];
} else {
@@ -235,6 +294,17 @@ public final class StreamConfigurationMap {
mDynamicDepthOutputFormats.get(config.getFormat()) + 1);
}
// For each heic format, track how many sizes there are available to configure
for (StreamConfiguration config : mHeicConfigurations) {
if (!config.isOutput()) {
// Ignoring input depth configs
continue;
}
mHeicOutputFormats.put(config.getFormat(),
mHeicOutputFormats.get(config.getFormat()) + 1);
}
if (configurations != null && enforceImplementationDefined &&
mOutputFormats.indexOfKey(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) < 0) {
throw new AssertionError(
@@ -302,7 +372,16 @@ public final class StreamConfigurationMap {
if (mInputOutputFormatsMap == null) {
return new int[0];
}
return mInputOutputFormatsMap.getOutputs(inputFormat);
int[] outputs = mInputOutputFormatsMap.getOutputs(inputFormat);
if (mHeicOutputFormats.size() > 0) {
// All reprocessing formats map contain JPEG.
int[] outputsWithHeic = Arrays.copyOf(outputs, outputs.length+1);
outputsWithHeic[outputs.length] = ImageFormat.HEIC;
return outputsWithHeic;
} else {
return outputs;
}
}
/**
@@ -366,6 +445,8 @@ public final class StreamConfigurationMap {
return mDepthOutputFormats.indexOfKey(internalFormat) >= 0;
} else if (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) {
return mDynamicDepthOutputFormats.indexOfKey(internalFormat) >= 0;
} else if (dataspace == HAL_DATASPACE_HEIF) {
return mHeicOutputFormats.indexOfKey(internalFormat) >= 0;
} else {
return getFormatsMap(/*output*/true).indexOfKey(internalFormat) >= 0;
}
@@ -479,6 +560,7 @@ public final class StreamConfigurationMap {
StreamConfiguration[] configs =
surfaceDataspace == HAL_DATASPACE_DEPTH ? mDepthConfigurations :
surfaceDataspace == HAL_DATASPACE_DYNAMIC_DEPTH ? mDynamicDepthConfigurations :
surfaceDataspace == HAL_DATASPACE_HEIF ? mHeicConfigurations :
mConfigurations;
for (StreamConfiguration config : configs) {
if (config.getFormat() == surfaceFormat && config.isOutput()) {
@@ -512,9 +594,10 @@ public final class StreamConfigurationMap {
int dataspace = imageFormatToDataspace(format);
StreamConfiguration[] configs =
dataspace == HAL_DATASPACE_DEPTH ? mDepthConfigurations :
dataspace == HAL_DATASPACE_DYNAMIC_DEPTH ? mDynamicDepthConfigurations :
mConfigurations;
dataspace == HAL_DATASPACE_DEPTH ? mDepthConfigurations :
dataspace == HAL_DATASPACE_DYNAMIC_DEPTH ? mDynamicDepthConfigurations :
dataspace == HAL_DATASPACE_HEIF ? mHeicConfigurations :
mConfigurations;
for (StreamConfiguration config : configs) {
if ((config.getFormat() == internalFormat) && config.isOutput() &&
config.getSize().equals(size)) {
@@ -1033,6 +1116,9 @@ public final class StreamConfigurationMap {
Arrays.equals(mDynamicDepthMinFrameDurations,
other.mDynamicDepthMinFrameDurations) &&
Arrays.equals(mDynamicDepthStallDurations, other.mDynamicDepthStallDurations) &&
Arrays.equals(mHeicConfigurations, other.mHeicConfigurations) &&
Arrays.equals(mHeicMinFrameDurations, other.mHeicMinFrameDurations) &&
Arrays.equals(mHeicStallDurations, other.mHeicStallDurations) &&
Arrays.equals(mHighSpeedVideoConfigurations,
other.mHighSpeedVideoConfigurations);
}
@@ -1049,7 +1135,9 @@ public final class StreamConfigurationMap {
mConfigurations, mMinFrameDurations, mStallDurations,
mDepthConfigurations, mDepthMinFrameDurations, mDepthStallDurations,
mDynamicDepthConfigurations, mDynamicDepthMinFrameDurations,
mDynamicDepthStallDurations, mHighSpeedVideoConfigurations);
mDynamicDepthStallDurations, mHeicConfigurations,
mHeicMinFrameDurations, mHeicStallDurations,
mHighSpeedVideoConfigurations);
}
// Check that the argument is supported by #getOutputFormats or #getInputFormats
@@ -1068,6 +1156,10 @@ public final class StreamConfigurationMap {
if (mDynamicDepthOutputFormats.indexOfKey(internalFormat) >= 0) {
return format;
}
} else if (internalDataspace == HAL_DATASPACE_HEIF) {
if (mHeicOutputFormats.indexOfKey(internalFormat) >= 0) {
return format;
}
} else {
if (mAllOutputFormats.indexOfKey(internalFormat) >= 0) {
return format;
@@ -1108,8 +1200,9 @@ public final class StreamConfigurationMap {
case HAL_PIXEL_FORMAT_Y16:
return format;
case ImageFormat.JPEG:
case ImageFormat.HEIC:
throw new IllegalArgumentException(
"ImageFormat.JPEG is an unknown internal format");
"An unknown internal format: " + format);
default:
return checkArgumentFormat(format);
}
@@ -1267,6 +1360,8 @@ public final class StreamConfigurationMap {
* <ul>
* <li>ImageFormat.JPEG => HAL_PIXEL_FORMAT_BLOB
* <li>ImageFormat.DEPTH_POINT_CLOUD => HAL_PIXEL_FORMAT_BLOB
* <li>ImageFormat.DEPTH_JPEG => HAL_PIXEL_FORMAT_BLOB
* <li>ImageFormat.HEIC => HAL_PIXEL_FORMAT_BLOB
* <li>ImageFormat.DEPTH16 => HAL_PIXEL_FORMAT_Y16
* </ul>
* </p>
@@ -1292,6 +1387,7 @@ public final class StreamConfigurationMap {
case ImageFormat.JPEG:
case ImageFormat.DEPTH_POINT_CLOUD:
case ImageFormat.DEPTH_JPEG:
case ImageFormat.HEIC:
return HAL_PIXEL_FORMAT_BLOB;
case ImageFormat.DEPTH16:
return HAL_PIXEL_FORMAT_Y16;
@@ -1312,6 +1408,7 @@ public final class StreamConfigurationMap {
* <li>ImageFormat.DEPTH_POINT_CLOUD => HAL_DATASPACE_DEPTH
* <li>ImageFormat.DEPTH16 => HAL_DATASPACE_DEPTH
* <li>ImageFormat.DEPTH_JPEG => HAL_DATASPACE_DYNAMIC_DEPTH
* <li>ImageFormat.HEIC => HAL_DATASPACE_HEIF
* <li>others => HAL_DATASPACE_UNKNOWN
* </ul>
* </p>
@@ -1343,6 +1440,8 @@ public final class StreamConfigurationMap {
return HAL_DATASPACE_DEPTH;
case ImageFormat.DEPTH_JPEG:
return HAL_DATASPACE_DYNAMIC_DEPTH;
case ImageFormat.HEIC:
return HAL_DATASPACE_HEIF;
default:
return HAL_DATASPACE_UNKNOWN;
}
@@ -1394,14 +1493,17 @@ public final class StreamConfigurationMap {
!output ? mInputFormats :
dataspace == HAL_DATASPACE_DEPTH ? mDepthOutputFormats :
dataspace == HAL_DATASPACE_DYNAMIC_DEPTH ? mDynamicDepthOutputFormats :
dataspace == HAL_DATASPACE_HEIF ? mHeicOutputFormats :
highRes ? mHighResOutputFormats :
mOutputFormats;
int sizesCount = formatsMap.get(format);
if ( ((!output || (dataspace == HAL_DATASPACE_DEPTH ||
dataspace == HAL_DATASPACE_DYNAMIC_DEPTH)) && sizesCount == 0) ||
dataspace == HAL_DATASPACE_DYNAMIC_DEPTH ||
dataspace == HAL_DATASPACE_HEIF)) && sizesCount == 0) ||
(output && (dataspace != HAL_DATASPACE_DEPTH &&
dataspace != HAL_DATASPACE_DYNAMIC_DEPTH) &&
dataspace != HAL_DATASPACE_DYNAMIC_DEPTH &&
dataspace != HAL_DATASPACE_HEIF) &&
mAllOutputFormats.get(format) == 0)) {
// Only throw if this is really not supported at all
throw new IllegalArgumentException("format not available");
@@ -1413,10 +1515,12 @@ public final class StreamConfigurationMap {
StreamConfiguration[] configurations =
(dataspace == HAL_DATASPACE_DEPTH) ? mDepthConfigurations :
(dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthConfigurations :
(dataspace == HAL_DATASPACE_HEIF) ? mHeicConfigurations :
mConfigurations;
StreamConfigurationDuration[] minFrameDurations =
(dataspace == HAL_DATASPACE_DEPTH) ? mDepthMinFrameDurations :
(dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthMinFrameDurations :
(dataspace == HAL_DATASPACE_HEIF) ? mHeicMinFrameDurations :
mMinFrameDurations;
for (StreamConfiguration config : configurations) {
@@ -1445,7 +1549,8 @@ public final class StreamConfigurationMap {
}
// Dynamic depth streams can have both fast and also high res modes.
if ((sizeIndex != sizesCount) && (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH)) {
if ((sizeIndex != sizesCount) && (dataspace == HAL_DATASPACE_DYNAMIC_DEPTH ||
dataspace == HAL_DATASPACE_HEIF)) {
if (sizeIndex > sizesCount) {
throw new AssertionError(
@@ -1485,6 +1590,9 @@ public final class StreamConfigurationMap {
// Only one publicly dynamic depth format is available.
formats[i++] = ImageFormat.DEPTH_JPEG;
}
if (mHeicOutputFormats.size() > 0) {
formats[i++] = ImageFormat.HEIC;
}
}
if (formats.length != i) {
throw new AssertionError("Too few formats " + i + ", expected " + formats.length);
@@ -1529,10 +1637,14 @@ public final class StreamConfigurationMap {
case DURATION_MIN_FRAME:
return (dataspace == HAL_DATASPACE_DEPTH) ? mDepthMinFrameDurations :
(dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ?
mDynamicDepthMinFrameDurations : mMinFrameDurations;
mDynamicDepthMinFrameDurations :
(dataspace == HAL_DATASPACE_HEIF) ? mHeicMinFrameDurations :
mMinFrameDurations;
case DURATION_STALL:
return (dataspace == HAL_DATASPACE_DEPTH) ? mDepthStallDurations :
(dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthStallDurations :
(dataspace == HAL_DATASPACE_HEIF) ? mHeicStallDurations :
mStallDurations;
default:
throw new IllegalArgumentException("duration was invalid");
@@ -1546,6 +1658,7 @@ public final class StreamConfigurationMap {
if (output) {
size += mDepthOutputFormats.size();
size += mDynamicDepthOutputFormats.size();
size += mHeicOutputFormats.size();
}
return size;
@@ -1569,6 +1682,7 @@ public final class StreamConfigurationMap {
StreamConfiguration[] configurations =
(dataspace == HAL_DATASPACE_DEPTH) ? mDepthConfigurations :
(dataspace == HAL_DATASPACE_DYNAMIC_DEPTH) ? mDynamicDepthConfigurations :
(dataspace == HAL_DATASPACE_HEIF) ? mHeicConfigurations :
mConfigurations;
for (int i = 0; i < configurations.length; i++) {
@@ -1767,6 +1881,8 @@ public final class StreamConfigurationMap {
return "RAW_DEPTH";
case ImageFormat.PRIVATE:
return "PRIVATE";
case ImageFormat.HEIC:
return "HEIC";
default:
return "UNKNOWN";
}
@@ -1795,7 +1911,7 @@ public final class StreamConfigurationMap {
private static final int HAL_DATASPACE_DEPTH = 0x1000;
private static final int HAL_DATASPACE_DYNAMIC_DEPTH = 0x1002;
private static final int HAL_DATASPACE_HEIF = 0x1003;
private static final long DURATION_20FPS_NS = 50000000L;
/**
* @see #getDurations(int, int)
@@ -1815,6 +1931,10 @@ public final class StreamConfigurationMap {
private final StreamConfigurationDuration[] mDynamicDepthMinFrameDurations;
private final StreamConfigurationDuration[] mDynamicDepthStallDurations;
private final StreamConfiguration[] mHeicConfigurations;
private final StreamConfigurationDuration[] mHeicMinFrameDurations;
private final StreamConfigurationDuration[] mHeicStallDurations;
private final HighSpeedVideoConfiguration[] mHighSpeedVideoConfigurations;
private final ReprocessFormatsMap mInputOutputFormatsMap;
@@ -1834,6 +1954,9 @@ public final class StreamConfigurationMap {
private final SparseIntArray mDepthOutputFormats = new SparseIntArray();
/** internal format -> num dynamic depth output sizes mapping, for HAL_DATASPACE_DYNAMIC_DEPTH */
private final SparseIntArray mDynamicDepthOutputFormats = new SparseIntArray();
/** internal format -> num heic output sizes mapping, for HAL_DATASPACE_HEIF */
private final SparseIntArray mHeicOutputFormats = new SparseIntArray();
/** High speed video Size -> FPS range count mapping*/
private final HashMap</*HighSpeedVideoSize*/Size, /*Count*/Integer> mHighSpeedVideoSizeMap =
new HashMap<Size, Integer>();

View File

@@ -58,6 +58,8 @@
namespace android {
using ui::Dataspace;
static const char* const OutOfResourcesException =
"android/view/Surface$OutOfResourcesException";
@@ -132,6 +134,7 @@ int android_view_Surface_mapPublicFormatToHalFormat(PublicFormat f) {
case PublicFormat::JPEG:
case PublicFormat::DEPTH_POINT_CLOUD:
case PublicFormat::DEPTH_JPEG:
case PublicFormat::HEIC:
return HAL_PIXEL_FORMAT_BLOB;
case PublicFormat::DEPTH16:
return HAL_PIXEL_FORMAT_Y16;
@@ -146,32 +149,44 @@ int android_view_Surface_mapPublicFormatToHalFormat(PublicFormat f) {
android_dataspace android_view_Surface_mapPublicFormatToHalDataspace(
PublicFormat f) {
Dataspace dataspace;
switch(f) {
case PublicFormat::JPEG:
return HAL_DATASPACE_V0_JFIF;
dataspace = Dataspace::V0_JFIF;
break;
case PublicFormat::DEPTH_POINT_CLOUD:
case PublicFormat::DEPTH16:
case PublicFormat::RAW_DEPTH:
return HAL_DATASPACE_DEPTH;
dataspace = Dataspace::DEPTH;
break;
case PublicFormat::RAW_SENSOR:
case PublicFormat::RAW_PRIVATE:
case PublicFormat::RAW10:
case PublicFormat::RAW12:
return HAL_DATASPACE_ARBITRARY;
dataspace = Dataspace::ARBITRARY;
break;
case PublicFormat::YUV_420_888:
case PublicFormat::NV21:
case PublicFormat::YV12:
return HAL_DATASPACE_V0_JFIF;
dataspace = Dataspace::V0_JFIF;
break;
case PublicFormat::DEPTH_JPEG:
return static_cast<android_dataspace> (HAL_DATASPACE_DYNAMIC_DEPTH);
dataspace = Dataspace::DYNAMIC_DEPTH;
break;
case PublicFormat::HEIC:
dataspace = Dataspace::HEIF;
break;
default:
// Most formats map to UNKNOWN
return HAL_DATASPACE_UNKNOWN;
dataspace = Dataspace::UNKNOWN;
break;
}
return static_cast<android_dataspace>(dataspace);
}
PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat(
int format, android_dataspace dataSpace) {
Dataspace ds = static_cast<Dataspace>(dataSpace);
switch(format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
@@ -187,8 +202,8 @@ PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat(
// Enums overlap in both name and value
return static_cast<PublicFormat>(format);
case HAL_PIXEL_FORMAT_RAW16:
switch (dataSpace) {
case HAL_DATASPACE_DEPTH:
switch (ds) {
case Dataspace::DEPTH:
return PublicFormat::RAW_DEPTH;
default:
return PublicFormat::RAW_SENSOR;
@@ -210,8 +225,8 @@ PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat(
return PublicFormat::PRIVATE;
case HAL_PIXEL_FORMAT_Y16:
// Dataspace-dependent
switch (dataSpace) {
case HAL_DATASPACE_DEPTH:
switch (ds) {
case Dataspace::DEPTH:
return PublicFormat::DEPTH16;
default:
// Assume non-depth Y16 is just Y16.
@@ -220,11 +235,13 @@ PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat(
break;
case HAL_PIXEL_FORMAT_BLOB:
// Dataspace-dependent
switch (dataSpace) {
case HAL_DATASPACE_DEPTH:
switch (ds) {
case Dataspace::DEPTH:
return PublicFormat::DEPTH_POINT_CLOUD;
case HAL_DATASPACE_V0_JFIF:
case Dataspace::V0_JFIF:
return PublicFormat::JPEG;
case Dataspace::HEIF:
return PublicFormat::HEIC;
default:
if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) {
return PublicFormat::DEPTH_JPEG;

View File

@@ -55,10 +55,11 @@ enum class PublicFormat {
DEPTH_POINT_CLOUD = 0x101,
RAW_DEPTH = 0x1002, // @hide
YV12 = 0x32315659,
Y8 = 0x20203859, // @hide
Y8 = 0x20203859,
Y16 = 0x20363159, // @hide
DEPTH16 = 0x44363159,
DEPTH_JPEG = 0x69656963,
HEIC = 0x48454946,
};
/* Gets the underlying ANativeWindow for a Surface. */

View File

@@ -715,6 +715,14 @@ public class ImageFormat {
*/
public static final int PRIVATE = 0x22;
/**
* Compressed HEIC format.
*
* <p>This format defines the HEIC brand of High Efficiency Image File
* Format as described in ISO/IEC 23008-12.</p>
*/
public static final int HEIC = 0x48454946;
/**
* Use this function to retrieve the number of bits per pixel of an
* ImageFormat.
@@ -796,6 +804,7 @@ public class ImageFormat {
case RAW_DEPTH:
case Y8:
case DEPTH_JPEG:
case HEIC:
return true;
}

View File

@@ -155,6 +155,13 @@ public abstract class Image implements AutoCloseable {
* UnSupportedOperationException being thrown.
* </td>
* </tr>
* <tr>
* <td>{@link android.graphics.ImageFormat#HEIC HEIC}</td>
* <td>1</td>
* <td>Compressed data, so row and pixel strides are 0. To uncompress, use
* {@link android.graphics.BitmapFactory#decodeByteArray BitmapFactory#decodeByteArray}.
* </td>
* </tr>
* </table>
*
* @see android.graphics.ImageFormat

View File

@@ -821,6 +821,7 @@ public class ImageReader implements AutoCloseable {
case ImageFormat.DEPTH_POINT_CLOUD:
case ImageFormat.RAW_PRIVATE:
case ImageFormat.DEPTH_JPEG:
case ImageFormat.HEIC:
width = ImageReader.this.getWidth();
break;
default:
@@ -838,6 +839,7 @@ public class ImageReader implements AutoCloseable {
case ImageFormat.DEPTH_POINT_CLOUD:
case ImageFormat.RAW_PRIVATE:
case ImageFormat.DEPTH_JPEG:
case ImageFormat.HEIC:
height = ImageReader.this.getHeight();
break;
default:

View File

@@ -36,8 +36,8 @@ class ImageUtils {
* {@link android.graphics.PixelFormat PixelFormat} are supported by
* ImageReader. When reading RGB data from a surface, the formats defined in
* {@link android.graphics.PixelFormat PixelFormat} can be used; when
* reading YUV, JPEG or raw sensor data (for example, from the camera or video
* decoder), formats from {@link android.graphics.ImageFormat ImageFormat}
* reading YUV, JPEG, HEIC or raw sensor data (for example, from the camera
* or video decoder), formats from {@link android.graphics.ImageFormat ImageFormat}
* are used.
*/
public static int getNumPlanesForFormat(int format) {
@@ -64,6 +64,7 @@ class ImageUtils {
case ImageFormat.DEPTH_POINT_CLOUD:
case ImageFormat.RAW_DEPTH:
case ImageFormat.DEPTH_JPEG:
case ImageFormat.HEIC:
return 1;
case ImageFormat.PRIVATE:
return 0;
@@ -194,6 +195,7 @@ class ImageUtils {
case ImageFormat.JPEG:
case ImageFormat.DEPTH_POINT_CLOUD:
case ImageFormat.DEPTH_JPEG:
case ImageFormat.HEIC:
estimatedBytePerPixel = 0.3;
break;
case ImageFormat.Y8:
@@ -262,6 +264,7 @@ class ImageUtils {
case ImageFormat.RAW10:
case ImageFormat.RAW12:
case ImageFormat.RAW_DEPTH:
case ImageFormat.HEIC:
return new Size(image.getWidth(), image.getHeight());
case ImageFormat.PRIVATE:
return new Size(0, 0);

View File

@@ -29,6 +29,9 @@
#define ALIGN(x, mask) ( ((x) + (mask) - 1) & ~((mask) - 1) )
// Must be in sync with the value in HeicCompositeStream.cpp
#define CAMERA3_HEIC_BLOB_ID 0x00FE
namespace android {
AssetStream::AssetStream(SkStream* stream)
@@ -609,34 +612,35 @@ bool isPossiblyYUV(PixelFormat format) {
}
}
uint32_t Image_getJpegSize(LockedImage* buffer, bool usingRGBAOverride) {
uint32_t Image_getBlobSize(LockedImage* buffer, bool usingRGBAOverride) {
ALOGV("%s", __FUNCTION__);
LOG_ALWAYS_FATAL_IF(buffer == NULL, "Input buffer is NULL!!!");
uint32_t size = 0;
uint32_t width = buffer->width;
uint8_t* jpegBuffer = buffer->data;
uint8_t* blobBuffer = buffer->data;
if (usingRGBAOverride) {
width = (buffer->width + buffer->stride * (buffer->height - 1)) * 4;
}
// First check for JPEG transport header at the end of the buffer
uint8_t* header = jpegBuffer + (width - sizeof(struct camera3_jpeg_blob));
// First check for BLOB transport header at the end of the buffer
uint8_t* header = blobBuffer + (width - sizeof(struct camera3_jpeg_blob));
struct camera3_jpeg_blob *blob = (struct camera3_jpeg_blob*)(header);
if (blob->jpeg_blob_id == CAMERA3_JPEG_BLOB_ID) {
if (blob->jpeg_blob_id == CAMERA3_JPEG_BLOB_ID ||
blob->jpeg_blob_id == CAMERA3_HEIC_BLOB_ID) {
size = blob->jpeg_size;
ALOGV("%s: Jpeg size = %d", __FUNCTION__, size);
ALOGV("%s: Jpeg/Heic size = %d", __FUNCTION__, size);
}
// failed to find size, default to whole buffer
if (size == 0) {
/*
* This is a problem because not including the JPEG header
* means that in certain rare situations a regular JPEG blob
* This is a problem because not including the JPEG/BLOB header
* means that in certain rare situations a regular JPEG/HEIC blob
* will be mis-identified as having a header, in which case
* we will get a garbage size value.
*/
ALOGW("%s: No JPEG header detected, defaulting to size=width=%d",
ALOGW("%s: No JPEG/HEIC header detected, defaulting to size=width=%d",
__FUNCTION__, width);
size = width;
}
@@ -760,7 +764,7 @@ status_t getLockedImageInfo(LockedImage* buffer, int idx,
pData = buffer->data;
dataSize = Image_getJpegSize(buffer, usingRGBAOverride);
dataSize = Image_getBlobSize(buffer, usingRGBAOverride);
pStride = 0;
rStride = 0;
break;

View File

@@ -119,7 +119,7 @@ bool usingRGBAToJpegOverride(int32_t imageFormat, int32_t containerFormat);
int32_t applyFormatOverrides(int32_t imageFormat, int32_t containerFormat);
uint32_t Image_getJpegSize(LockedImage* buffer, bool usingRGBAOverride);
uint32_t Image_getBlobSize(LockedImage* buffer, bool usingRGBAOverride);
bool isFormatOpaque(int format);