Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c056dde authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: Enable DEPTH_JPEG extension capture output" into main

parents 0993041f 81cb0857
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -1066,6 +1066,7 @@ public final class CameraExtensionCharacteristics {
                    case ImageFormat.YUV_420_888:
                    case ImageFormat.JPEG:
                    case ImageFormat.JPEG_R:
                    case ImageFormat.DEPTH_JPEG:
                    case ImageFormat.YCBCR_P010:
                        break;
                    default:
@@ -1096,9 +1097,10 @@ public final class CameraExtensionCharacteristics {
                    // processed YUV_420 buffers.
                    return getSupportedSizes(
                            extenders.second.getSupportedPostviewResolutions(sz), format);
                }  else if (format == ImageFormat.JPEG_R || format == ImageFormat.YCBCR_P010) {
                    // Jpeg_R/UltraHDR + YCBCR_P010 is currently not supported in the basic
                    // extension case
                }  else if (format == ImageFormat.JPEG_R || format == ImageFormat.YCBCR_P010 ||
                        (Flags.depthJpegExtensions() && (format == ImageFormat.DEPTH_JPEG))) {
                    // DepthJpeg/Jpeg_R/UltraHDR + YCBCR_P010 is currently not supported in the
                    // basic extension case
                    return new ArrayList<>();
                } else {
                    throw new IllegalArgumentException("Unsupported format: " + format);
@@ -1194,8 +1196,8 @@ public final class CameraExtensionCharacteristics {
     *
     * <p>Device-specific extensions currently support at most three
     * multi-frame capture surface formats. ImageFormat.JPEG will be supported by all
     * extensions while ImageFormat.YUV_420_888, ImageFormat.JPEG_R, or ImageFormat.YCBCR_P010
     * may or may not be supported.</p>
     * extensions while ImageFormat.YUV_420_888, ImageFormat.JPEG_R, ImageFormat.YCBCR_P010 or
     * ImageFormat.DEPTH_JPEG may or may not be supported.</p>
     *
     * @param extension the extension type
     * @param format    device-specific extension output format
@@ -1203,7 +1205,8 @@ public final class CameraExtensionCharacteristics {
     * supported.
     * @throws IllegalArgumentException in case of format different from ImageFormat.JPEG,
     *                                  ImageFormat.YUV_420_888, ImageFormat.JPEG_R,
     *                                  ImageFormat.YCBCR_P010; or unsupported extension.
     *                                  ImageFormat.DEPTH_JPEG, ImageFormat.YCBCR_P010; or
     *                                  unsupported extension.
     */
    public @NonNull
    List<Size> getExtensionSupportedSizes(@Extension int extension, int format) {
@@ -1227,6 +1230,7 @@ public final class CameraExtensionCharacteristics {
                        case ImageFormat.YUV_420_888:
                        case ImageFormat.JPEG:
                        case ImageFormat.JPEG_R:
                        case ImageFormat.DEPTH_JPEG:
                        case ImageFormat.YCBCR_P010:
                            break;
                        default:
@@ -1260,8 +1264,9 @@ public final class CameraExtensionCharacteristics {
                        } else {
                            return generateSupportedSizes(null, format, streamMap);
                        }
                    } else if (format == ImageFormat.JPEG_R || format == ImageFormat.YCBCR_P010) {
                        // Jpeg_R/UltraHDR + YCBCR_P010 is currently not supported in the
                    } else if (format == ImageFormat.JPEG_R || format == ImageFormat.YCBCR_P010 ||
                            (Flags.depthJpegExtensions() && (format == ImageFormat.DEPTH_JPEG))) {
                        // DepthJpeg/Jpeg_R/UltraHDR + YCBCR_P010 is currently not supported in the
                        // basic extension case
                        return new ArrayList<>();
                    } else {
@@ -1292,7 +1297,8 @@ public final class CameraExtensionCharacteristics {
     * or null if no capture latency info can be provided
     * @throws IllegalArgumentException in case of format different from {@link ImageFormat#JPEG},
     *                                  {@link ImageFormat#YUV_420_888}, {@link ImageFormat#JPEG_R}
     *                                  {@link ImageFormat#YCBCR_P010};
     *                                  {@link ImageFormat#YCBCR_P010},
     *                                  {@link ImageFormat#DEPTH_JPEG};
     *                                  or unsupported extension.
     */
    public @Nullable Range<Long> getEstimatedCaptureLatencyRangeMillis(@Extension int extension,
@@ -1301,6 +1307,7 @@ public final class CameraExtensionCharacteristics {
            case ImageFormat.YUV_420_888:
            case ImageFormat.JPEG:
            case ImageFormat.JPEG_R:
            case ImageFormat.DEPTH_JPEG:
            case ImageFormat.YCBCR_P010:
                //No op
                break;
@@ -1349,8 +1356,9 @@ public final class CameraExtensionCharacteristics {
                    // specific and cannot be estimated accurately enough.
                    return  null;
                }
                if (format == ImageFormat.JPEG_R || format == ImageFormat.YCBCR_P010) {
                    // JpegR/UltraHDR + YCBCR_P010 is not supported for basic extensions
                if (format == ImageFormat.JPEG_R || format == ImageFormat.YCBCR_P010 ||
                        (Flags.depthJpegExtensions() && (format == ImageFormat.DEPTH_JPEG))) {
                    // DepthJpeg/JpegR/UltraHDR + YCBCR_P010 is not supported for basic extensions
                    return null;
                }

+7 −7
Original line number Diff line number Diff line
@@ -186,12 +186,12 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes

        HashMap<Integer, List<Size>> supportedCaptureSizes = new HashMap<>();

        IntArray supportedCaptureOutputFormats =
                new IntArray(CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.length);
        supportedCaptureOutputFormats.addAll(
                CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS);
        supportedCaptureOutputFormats.add(ImageFormat.YCBCR_P010);
        for (int format : supportedCaptureOutputFormats.toArray()) {
        Integer[] supportedCaptureOutputFormats =
                new Integer[CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.size()];
        supportedCaptureOutputFormats =
                CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.toArray(
                        supportedCaptureOutputFormats);
        for (int format : supportedCaptureOutputFormats) {
            List<Size> supportedSizes = extensionChars.getExtensionSupportedSizes(
                    config.getExtension(), format);
            if (supportedSizes != null) {
@@ -230,7 +230,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
            Size burstCaptureSurfaceSize =
                    new Size(burstCaptureSurfaceInfo.mWidth, burstCaptureSurfaceInfo.mHeight);
            HashMap<Integer, List<Size>> supportedPostviewSizes = new HashMap<>();
            for (int format : supportedCaptureOutputFormats.toArray()) {
            for (int format : supportedCaptureOutputFormats) {
                List<Size> supportedSizesPostview = extensionChars.getPostviewSupportedSizes(
                        config.getExtension(), burstCaptureSurfaceSize, format);
                if (supportedSizesPostview != null) {
+7 −7
Original line number Diff line number Diff line
@@ -186,12 +186,12 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
        }

        HashMap<Integer, List<Size>> supportedCaptureSizes = new HashMap<>();
        IntArray supportedCaptureOutputFormats =
                new IntArray(CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.length);
        supportedCaptureOutputFormats.addAll(
                CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS);
        supportedCaptureOutputFormats.add(ImageFormat.YCBCR_P010);
        for (int format : supportedCaptureOutputFormats.toArray()) {
        Integer[] supportedCaptureOutputFormats =
                new Integer[CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.size()];
        supportedCaptureOutputFormats =
                CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.toArray(
                        supportedCaptureOutputFormats);
        for (int format : supportedCaptureOutputFormats) {
            List<Size> supportedSizes = extensionChars.getExtensionSupportedSizes(
                    config.getExtension(), format);
            if (supportedSizes != null) {
@@ -223,7 +223,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
            Size burstCaptureSurfaceSize =
                    new Size(burstCaptureSurfaceInfo.mWidth, burstCaptureSurfaceInfo.mHeight);
            HashMap<Integer, List<Size>> supportedPostviewSizes = new HashMap<>();
            for (int format : supportedCaptureOutputFormats.toArray()) {
            for (int format : supportedCaptureOutputFormats) {
                List<Size> supportedSizesPostview = extensionChars.getPostviewSupportedSizes(
                        config.getExtension(), burstCaptureSurfaceSize, format);
                if (supportedSizesPostview != null) {
+26 −11
Original line number Diff line number Diff line
@@ -32,11 +32,14 @@ import android.os.Handler;
import android.util.IntArray;
import android.util.Log;
import android.util.Size;
import android.util.SparseIntArray;
import android.view.Surface;

import com.android.internal.camera.flags.Flags;

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
@@ -48,11 +51,16 @@ public final class CameraExtensionUtils {
    public final static int JPEG_DEFAULT_QUALITY = 100;
    public final static int JPEG_DEFAULT_ROTATION = 0;

    public static final int[] SUPPORTED_CAPTURE_OUTPUT_FORMATS = {
            CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT,
            ImageFormat.JPEG,
            ImageFormat.JPEG_R
    };
    public static HashSet<Integer> SUPPORTED_CAPTURE_OUTPUT_FORMATS = new HashSet<>();

    static {
        SUPPORTED_CAPTURE_OUTPUT_FORMATS.addAll(Arrays.asList(
                CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT, ImageFormat.JPEG,
                ImageFormat.YCBCR_P010, ImageFormat.JPEG_R ));
        if (Flags.depthJpegExtensions()) {
            SUPPORTED_CAPTURE_OUTPUT_FORMATS.add(ImageFormat.DEPTH_JPEG);
        }
    }

    public static class SurfaceInfo {
        public int mWidth = 0;
@@ -101,6 +109,13 @@ public final class CameraExtensionUtils {
            surfaceInfo.mFormat = ImageFormat.JPEG_R;
            return surfaceInfo;
        }
        if (Flags.depthJpegExtensions()) {
            if ((nativeFormat == StreamConfigurationMap.HAL_PIXEL_FORMAT_BLOB)
                    && (dataspace == StreamConfigurationMap.HAL_DATASPACE_DYNAMIC_DEPTH)) {
                surfaceInfo.mFormat = ImageFormat.DEPTH_JPEG;
                return surfaceInfo;
            }
        }

        return surfaceInfo;
    }
@@ -125,14 +140,14 @@ public final class CameraExtensionUtils {
    public static Surface getBurstCaptureSurface(
            @NonNull List<OutputConfiguration> outputConfigs,
            @NonNull HashMap<Integer, List<Size>> supportedCaptureSizes) {
        IntArray supportedCaptureOutputFormats =
                new IntArray(CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.length);
        supportedCaptureOutputFormats.addAll(
                CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS);
        supportedCaptureOutputFormats.add(ImageFormat.YCBCR_P010);
        Integer[] supportedCaptureOutputFormats =
                new Integer[CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.size()];
        supportedCaptureOutputFormats =
                CameraExtensionUtils.SUPPORTED_CAPTURE_OUTPUT_FORMATS.toArray(
                        supportedCaptureOutputFormats);
        for (OutputConfiguration config : outputConfigs) {
            SurfaceInfo surfaceInfo = querySurface(config.getSurface());
            for (int supportedFormat : supportedCaptureOutputFormats.toArray()) {
            for (int supportedFormat : supportedCaptureOutputFormats) {
                if (surfaceInfo.mFormat == supportedFormat) {
                    Size captureSize = new Size(surfaceInfo.mWidth, surfaceInfo.mHeight);
                    if (supportedCaptureSizes.containsKey(supportedFormat)) {