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

Commit 5790aaca authored by Vignesh Venkatasubramanian's avatar Vignesh Venkatasubramanian
Browse files

media, non-mainline: Add basic AVIF decoding support

This CL contains files that are not part of mainline.

Parse the AVIF boxes and pass the data along to a compatible AV1
decoder (similar to how HEIC frames are passed to the HEVC
decoder).

Test: BitmapFactory.decodeByteArray() is now able to decode valid AVIF images.
Test: HEIF related CTS tests still pass.

CTS tests to come in a different CL.

Bug: 141654151
Change-Id: I4b84ae825232bb34f357725247a4531b87b3e029
parent b79b20f8
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -214,6 +214,10 @@ sp<IMemory> StagefrightMetadataRetriever::getImageInternal(
        mime = MEDIA_MIMETYPE_VIDEO_HEVC;
        trackMeta = new MetaData(*trackMeta);
        trackMeta->setCString(kKeyMIMEType, mime);
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_AVIF)) {
        mime = MEDIA_MIMETYPE_VIDEO_AV1;
        trackMeta = new MetaData(*trackMeta);
        trackMeta->setCString(kKeyMIMEType, mime);
    }

    bool preferhw = property_get_bool(
+2 −1
Original line number Diff line number Diff line
@@ -1900,7 +1900,8 @@ void convertMessageToMetaData(const sp<AMessage> &msg, sp<MetaData> &meta) {
            std::vector<uint8_t> hvcc(csd0size + 1024);
            size_t outsize = reassembleHVCC(csd0, hvcc.data(), hvcc.size(), 4);
            meta->setData(kKeyHVCC, kTypeHVCC, hvcc.data(), outsize);
        } else if (mime == MEDIA_MIMETYPE_VIDEO_AV1) {
        } else if (mime == MEDIA_MIMETYPE_VIDEO_AV1 ||
                   mime == MEDIA_MIMETYPE_IMAGE_AVIF) {
            meta->setData(kKeyAV1C, 0, csd0->data(), csd0->size());
        } else if (mime == MEDIA_MIMETYPE_VIDEO_DOLBY_VISION) {
            if (msg->findBuffer("csd-2", &csd2)) {
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ namespace android {

const char *MEDIA_MIMETYPE_IMAGE_JPEG = "image/jpeg";
const char *MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC = "image/vnd.android.heic";
const char *MEDIA_MIMETYPE_IMAGE_AVIF = "image/avif";

const char *MEDIA_MIMETYPE_VIDEO_VP8 = "video/x-vnd.on2.vp8";
const char *MEDIA_MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ namespace android {

extern const char *MEDIA_MIMETYPE_IMAGE_JPEG;
extern const char *MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC;
extern const char *MEDIA_MIMETYPE_IMAGE_AVIF;

extern const char *MEDIA_MIMETYPE_VIDEO_VP8;
extern const char *MEDIA_MIMETYPE_VIDEO_VP9;
+2 −0
Original line number Diff line number Diff line
@@ -172,6 +172,8 @@ const char *GetComponentRole(bool isEncoder, const char *mime) {
            "audio_decoder.ac4", "audio_encoder.ac4" },
        { MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC,
            "image_decoder.heic", "image_encoder.heic" },
        { MEDIA_MIMETYPE_IMAGE_AVIF,
            "image_decoder.avif", "image_encoder.avif" },
    };

    static const size_t kNumMimeToRole =