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

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

Merge "Camera: Extend HEIC output support" into main

parents c193a690 0a2f9338
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
package: "com.android.internal.camera.flags"
container: "system"

flag {
    namespace: "camera_platform"
    name: "camera_heif_gainmap"
    is_exported: true
    description: "Extend HEIC/HEIF still capture with HDR gainmap"
    bug: "362608343"
}

flag {
    namespace: "camera_platform"
    name: "camera_hsum_permission"
+159 −0
Original line number Diff line number Diff line
@@ -7959,6 +7959,145 @@ typedef enum acamera_metadata_tag {
    ACAMERA_HEIC_AVAILABLE_HEIC_STALL_DURATIONS_MAXIMUM_RESOLUTION = 
                                                                // int64[4*n]
            ACAMERA_HEIC_START + 5,
    /**
     * <p>The available HEIC (ISO/IEC 23008-12/24) UltraHDR stream
     * configurations that this camera device supports
     * (i.e. format, width, height, output/input stream).</p>
     *
     * <p>Type: int32[n*4] (acamera_metadata_enum_android_heic_available_heic_ultra_hdr_stream_configurations_t)</p>
     *
     * <p>This tag may appear in:
     * <ul>
     *   <li>ACameraMetadata from ACameraManager_getCameraCharacteristics</li>
     * </ul></p>
     *
     * <p>The configurations are listed as <code>(format, width, height, input?)</code> tuples.</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>All the configuration tuples <code>(format, width, height, input?)</code> will contain
     * AIMAGE_FORMAT_HEIC format as OUTPUT only.</p>
     */
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS = 
                                                                // int32[n*4] (acamera_metadata_enum_android_heic_available_heic_ultra_hdr_stream_configurations_t)
            ACAMERA_HEIC_START + 6,
    /**
     * <p>This lists the minimum frame duration for each
     * format/size combination for HEIC UltraHDR output formats.</p>
     *
     * <p>Type: int64[4*n]</p>
     *
     * <p>This tag may appear in:
     * <ul>
     *   <li>ACameraMetadata from ACameraManager_getCameraCharacteristics</li>
     * </ul></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 ACAMERA_SENSOR_FRAME_DURATION and
     * ACAMERA_SCALER_AVAILABLE_STALL_DURATIONS for more details about
     * calculating the max frame rate.</p>
     *
     * @see ACAMERA_SCALER_AVAILABLE_STALL_DURATIONS
     * @see ACAMERA_SENSOR_FRAME_DURATION
     */
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_MIN_FRAME_DURATIONS = // int64[4*n]
            ACAMERA_HEIC_START + 7,
    /**
     * <p>This lists the maximum stall duration for each
     * output format/size combination for HEIC UltraHDR streams.</p>
     *
     * <p>Type: int64[4*n]</p>
     *
     * <p>This tag may appear in:
     * <ul>
     *   <li>ACameraMetadata from ACameraManager_getCameraCharacteristics</li>
     * </ul></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
     * ACAMERA_SCALER_AVAILABLE_STALL_DURATIONS for HEIC UltraHDR
     * streams.</p>
     * <p>All HEIC output stream formats may have a nonzero stall
     * duration.</p>
     *
     * @see ACAMERA_SCALER_AVAILABLE_STALL_DURATIONS
     */
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STALL_DURATIONS =     // int64[4*n]
            ACAMERA_HEIC_START + 8,
    /**
     * <p>The available HEIC (ISO/IEC 23008-12/24) UltraHDR stream
     * configurations that this camera device supports
     * (i.e. format, width, height, output/input stream) for CaptureRequests where
     * ACAMERA_SENSOR_PIXEL_MODE is set to
     * <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION">CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION</a>.</p>
     *
     * @see ACAMERA_SENSOR_PIXEL_MODE
     *
     * <p>Type: int32[n*4] (acamera_metadata_enum_android_heic_available_heic_ultra_hdr_stream_configurations_maximum_resolution_t)</p>
     *
     * <p>This tag may appear in:
     * <ul>
     *   <li>ACameraMetadata from ACameraManager_getCameraCharacteristics</li>
     * </ul></p>
     *
     * <p>Refer to ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS for details.</p>
     * <p>All the configuration tuples <code>(format, width, height, input?)</code> will contain
     * AIMAGE_FORMAT_HEIC format as OUTPUT only.</p>
     *
     * @see ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS
     */
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION = 
                                                                // int32[n*4] (acamera_metadata_enum_android_heic_available_heic_ultra_hdr_stream_configurations_maximum_resolution_t)
            ACAMERA_HEIC_START + 9,
    /**
     * <p>This lists the minimum frame duration for each
     * format/size combination for HEIC UltraHDR output formats for CaptureRequests where
     * ACAMERA_SENSOR_PIXEL_MODE is set to
     * <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION">CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION</a>.</p>
     *
     * @see ACAMERA_SENSOR_PIXEL_MODE
     *
     * <p>Type: int64[4*n]</p>
     *
     * <p>This tag may appear in:
     * <ul>
     *   <li>ACameraMetadata from ACameraManager_getCameraCharacteristics</li>
     * </ul></p>
     *
     * <p>Refer to ACAMERA_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS for details.</p>
     *
     * @see ACAMERA_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS
     */
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_MIN_FRAME_DURATIONS_MAXIMUM_RESOLUTION = 
                                                                // int64[4*n]
            ACAMERA_HEIC_START + 10,
    /**
     * <p>This lists the maximum stall duration for each
     * output format/size combination for HEIC UltraHDR streams for CaptureRequests where
     * ACAMERA_SENSOR_PIXEL_MODE is set to
     * <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION">CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION</a>.</p>
     *
     * @see ACAMERA_SENSOR_PIXEL_MODE
     *
     * <p>Type: int64[4*n]</p>
     *
     * <p>This tag may appear in:
     * <ul>
     *   <li>ACameraMetadata from ACameraManager_getCameraCharacteristics</li>
     * </ul></p>
     *
     * <p>Refer to ACAMERA_HEIC_AVAILABLE_HEIC_STALL_DURATIONS for details.</p>
     *
     * @see ACAMERA_HEIC_AVAILABLE_HEIC_STALL_DURATIONS
     */
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STALL_DURATIONS_MAXIMUM_RESOLUTION = 
                                                                // int64[4*n]
            ACAMERA_HEIC_START + 11,
    ACAMERA_HEIC_END,
    /**
@@ -11526,6 +11665,26 @@ typedef enum acamera_metadata_enum_acamera_heic_available_heic_stream_configurat
} acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t;
// ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS
typedef enum acamera_metadata_enum_acamera_heic_available_heic_ultra_hdr_stream_configurations {
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_OUTPUT
                                                                      = 0,
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_INPUT
                                                                      = 1,
} acamera_metadata_enum_android_heic_available_heic_ultra_hdr_stream_configurations_t;
// ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION
typedef enum acamera_metadata_enum_acamera_heic_available_heic_ultra_hdr_stream_configurations_maximum_resolution {
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_OUTPUT
                                                                      = 0,
    ACAMERA_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT
                                                                      = 1,
} acamera_metadata_enum_android_heic_available_heic_ultra_hdr_stream_configurations_maximum_resolution_t;
// ACAMERA_AUTOMOTIVE_LOCATION
+1 −0
Original line number Diff line number Diff line
@@ -317,6 +317,7 @@ cc_library {
        "server_configurable_flags",
        "libaconfig_storage_read_api_cc",
        "aconfig_mediacodec_flags_c_lib",
        "camera_platform_flags_c_lib",
    ],

    static_libs: [
+322 −43

File changed.

Preview size limit exceeded, changes collapsed.

+23 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@

#include "webm/WebmWriter.h"

#include <com_android_internal_camera_flags.h>

#include <utils/Log.h>

#include <media/stagefright/MediaMuxer.h>
@@ -38,6 +40,8 @@
#include <media/stagefright/OggWriter.h>
#include <media/stagefright/Utils.h>

namespace flags_camera = com::android::internal::camera::flags;

namespace android {

static bool isMp4Format(MediaMuxer::OutputFormat format) {
@@ -270,6 +274,25 @@ status_t MediaMuxer::writeSampleData(const sp<ABuffer> &buffer, size_t trackInde
        sampleMetaData.setInt64(kKeyLastSampleIndexInChunk, val64);
    }

    if (flags_camera::camera_heif_gainmap()) {
        int32_t val32;
        if (bufMeta->findInt32("color-primaries", &val32)) {
            sampleMetaData.setInt32(kKeyColorPrimaries, val32);
        }
        if (bufMeta->findInt32("color-transfer", &val32)) {
            sampleMetaData.setInt32(kKeyTransferFunction, val32);
        }
        if (bufMeta->findInt32("color-matrix", &val32)) {
            sampleMetaData.setInt32(kKeyColorMatrix, val32);
        }
        if (bufMeta->findInt32("color-range", &val32)) {
            sampleMetaData.setInt32(kKeyColorRange, val32);
        }
        if (bufMeta->findInt32(KEY_COLOR_FORMAT, &val32)) {
            sampleMetaData.setInt32(kKeyColorFormat, val32);
        }
    }

    sp<MediaAdapter> currentTrack = mTrackList[trackIndex];
    // This pushBuffer will wait until the mediaBuffer is consumed.
    return currentTrack->pushBuffer(mediaBuffer);
Loading