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

Commit ffb2516c authored by Shuzhen Wang's avatar Shuzhen Wang Committed by Android (Google) Code Review
Browse files

Merge "Camera: Add HEIC support"

parents 0d223d49 68ac7ada
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYP
        filterDurations(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
        filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS);
        filterDurations(ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
        filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS);
        filterDurations(ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS);
    }
    // TODO: filter request/result keys
}
@@ -174,6 +176,16 @@ ACameraMetadata::filterDurations(uint32_t tag) {
                    filteredDurations.push_back(duration);
                }
                break;
            case ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS:
            case ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS:
                if (format == HAL_PIXEL_FORMAT_BLOB) {
                    format = AIMAGE_FORMAT_HEIC;
                    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);
@@ -247,6 +259,31 @@ ACameraMetadata::filterStreamConfigurations() {
        filteredDepthStreamConfigs.push_back(isInput);
    }
    mData.update(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, filteredDepthStreamConfigs);

    entry = mData.find(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS);
    Vector<int32_t> filteredHeicStreamConfigs;
    filteredHeicStreamConfigs.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_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT) {
            // Hide input streams
            continue;
        }
        // Translate HAL formats to NDK format
        if (format == HAL_PIXEL_FORMAT_BLOB) {
            format = AIMAGE_FORMAT_HEIC;
        }

        filteredHeicStreamConfigs.push_back(format);
        filteredHeicStreamConfigs.push_back(width);
        filteredHeicStreamConfigs.push_back(height);
        filteredHeicStreamConfigs.push_back(isInput);
    }
    mData.update(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, filteredHeicStreamConfigs);
}

bool
@@ -485,6 +522,8 @@ std::unordered_set<uint32_t> ACameraMetadata::sSystemTags ({
    ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
    ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION,
    ANDROID_DEPTH_MAX_DEPTH_SAMPLES,
    ANDROID_HEIC_INFO_SUPPORTED,
    ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT,
});

/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
+103 −1
Original line number Diff line number Diff line
@@ -71,6 +71,8 @@ typedef enum acamera_metadata_section {
    ACAMERA_DEPTH,
    ACAMERA_LOGICAL_MULTI_CAMERA,
    ACAMERA_DISTORTION_CORRECTION,
    ACAMERA_HEIC,
    ACAMERA_HEIC_INFO,
    ACAMERA_SECTION_COUNT,

    ACAMERA_VENDOR = 0x8000
@@ -112,6 +114,8 @@ typedef enum acamera_metadata_section_start {
    ACAMERA_DISTORTION_CORRECTION_START
                                   = ACAMERA_DISTORTION_CORRECTION
                                                                << 16,
    ACAMERA_HEIC_START             = ACAMERA_HEIC              << 16,
    ACAMERA_HEIC_INFO_START        = ACAMERA_HEIC_INFO         << 16,
    ACAMERA_VENDOR_START           = ACAMERA_VENDOR            << 16
} acamera_metadata_section_start_t;

@@ -1912,6 +1916,7 @@ typedef enum acamera_metadata_tag {
     *   <li>ACaptureRequest</li>
     * </ul></p>
     *
     * <p>This tag is also used for HEIC image capture.</p>
     */
    ACAMERA_JPEG_GPS_COORDINATES =                              // double[3]
            ACAMERA_JPEG_START,
@@ -1927,6 +1932,7 @@ typedef enum acamera_metadata_tag {
     *   <li>ACaptureRequest</li>
     * </ul></p>
     *
     * <p>This tag is also used for HEIC image capture.</p>
     */
    ACAMERA_JPEG_GPS_PROCESSING_METHOD =                        // byte
            ACAMERA_JPEG_START + 1,
@@ -1942,6 +1948,7 @@ typedef enum acamera_metadata_tag {
     *   <li>ACaptureRequest</li>
     * </ul></p>
     *
     * <p>This tag is also used for HEIC image capture.</p>
     */
    ACAMERA_JPEG_GPS_TIMESTAMP =                                // int64
            ACAMERA_JPEG_START + 2,
@@ -1986,6 +1993,10 @@ typedef enum acamera_metadata_tag {
     * </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
     * <a href="https://developer.android.com/reference/android/media/ExifInterface.html#TAG_ORIENTATION">EXIF orientation flag</a>, and not by
     * rotating the image data itself.</p>
     *
     * @see ACAMERA_SENSOR_ORIENTATION
     */
@@ -2003,7 +2014,8 @@ typedef enum acamera_metadata_tag {
     *   <li>ACaptureRequest</li>
     * </ul></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>
     */
    ACAMERA_JPEG_QUALITY =                                      // byte
            ACAMERA_JPEG_START + 4,
@@ -2019,6 +2031,7 @@ typedef enum acamera_metadata_tag {
     *   <li>ACaptureRequest</li>
     * </ul></p>
     *
     * <p>This tag is also used to describe the quality of the HEIC image capture.</p>
     */
    ACAMERA_JPEG_THUMBNAIL_QUALITY =                            // byte
            ACAMERA_JPEG_START + 5,
@@ -2055,6 +2068,10 @@ typedef enum acamera_metadata_tag {
     *   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
     * <a href="https://developer.android.com/reference/android/media/ExifInterface.html#TAG_ORIENTATION">EXIF orientation flag</a>, and not by
     * rotating the thumbnail data itself.</p>
     *
     * @see ACAMERA_JPEG_ORIENTATION
     */
@@ -2088,6 +2105,7 @@ typedef enum acamera_metadata_tag {
     * and vice versa.</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>
     *
     * @see ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS
     */
@@ -5757,6 +5775,80 @@ typedef enum acamera_metadata_tag {
            ACAMERA_DISTORTION_CORRECTION_START + 1,
    ACAMERA_DISTORTION_CORRECTION_END,

    /**
     * <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>Type: int32[n*4] (acamera_metadata_enum_android_heic_available_heic_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>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>All the configuration tuples <code>(format, width, height, input?)</code> will contain
     * AIMAGE_FORMAT_HEIC format as OUTPUT only.</p>
     */
    ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS =         // int32[n*4] (acamera_metadata_enum_android_heic_available_heic_stream_configurations_t)
            ACAMERA_HEIC_START,
    /**
     * <p>This lists the minimum frame duration for each
     * format/size combination for HEIC 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_MIN_FRAME_DURATIONS =           // int64[4*n]
            ACAMERA_HEIC_START + 1,
    /**
     * <p>This lists the maximum stall duration for each
     * output format/size combination for HEIC 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
     * 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_STALL_DURATIONS =               // int64[4*n]
            ACAMERA_HEIC_START + 2,
    ACAMERA_HEIC_END,

} acamera_metadata_tag_t;

/**
@@ -8373,6 +8465,16 @@ typedef enum acamera_metadata_enum_acamera_distortion_correction_mode {
} acamera_metadata_enum_android_distortion_correction_mode_t;


// ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS
typedef enum acamera_metadata_enum_acamera_heic_available_heic_stream_configurations {
    ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_OUTPUT         = 0,

    ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT          = 1,

} acamera_metadata_enum_android_heic_available_heic_stream_configurations_t;



#endif /* __ANDROID_API__ >= 24 */

__END_DECLS
+2 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ AImageReader::isSupportedFormatAndUsage(int32_t format, uint64_t usage) {
        case AIMAGE_FORMAT_DEPTH16:
        case AIMAGE_FORMAT_DEPTH_POINT_CLOUD:
        case AIMAGE_FORMAT_Y8:
        case AIMAGE_FORMAT_HEIC:
            return true;
        case AIMAGE_FORMAT_PRIVATE:
            // For private format, cpu usage is prohibited.
@@ -96,6 +97,7 @@ AImageReader::getNumPlanesForFormat(int32_t format) {
        case AIMAGE_FORMAT_DEPTH16:
        case AIMAGE_FORMAT_DEPTH_POINT_CLOUD:
        case AIMAGE_FORMAT_Y8:
        case AIMAGE_FORMAT_HEIC:
            return 1;
        case AIMAGE_FORMAT_PRIVATE:
            return 0;
+9 −1
Original line number Diff line number Diff line
@@ -526,7 +526,15 @@ enum AIMAGE_FORMATS {
     * (in bytes) between adjacent rows.</p>
     *
     */
    AIMAGE_FORMAT_Y8 = 0x20203859
    AIMAGE_FORMAT_Y8 = 0x20203859,

    /**
     * Compressed HEIC format.
     *
     * <p>This format defines the HEIC brand of High Efficiency Image File
     * Format as described in ISO/IEC 23008-12.</p>
     */
    AIMAGE_FORMAT_HEIC = 0x48454946,
};

/**
+6 −0
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ cc_library_shared {
        "api2/CameraDeviceClient.cpp",
        "api2/CompositeStream.cpp",
        "api2/DepthCompositeStream.cpp",
        "api2/HeicEncoderInfoManager.cpp",
        "api2/HeicCompositeStream.cpp",
        "device1/CameraHardwareInterface.cpp",
        "device3/Camera3Device.cpp",
        "device3/Camera3Stream.cpp",
@@ -62,12 +64,14 @@ cc_library_shared {
        "hidl/HidlCameraService.cpp",
        "utils/CameraTraces.cpp",
        "utils/AutoConditionLock.cpp",
        "utils/ExifUtils.cpp",
        "utils/TagMonitor.cpp",
        "utils/LatencyHistogram.cpp",
    ],

    shared_libs: [
        "libdl",
        "libexif",
        "libui",
        "liblog",
        "libutilscallstack",
@@ -85,8 +89,10 @@ cc_library_shared {
        "libhidlbase",
        "libhidltransport",
        "libjpeg",
        "libmedia_omx",
        "libmemunreachable",
        "libsensorprivacy",
        "libstagefright",
        "libstagefright_foundation",
        "android.frameworks.cameraservice.common@2.0",
        "android.frameworks.cameraservice.service@2.0",
Loading