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

Commit dbe54ca6 authored by Dichen Zhang's avatar Dichen Zhang
Browse files

HEIF decoding: if tiled, check decoder supports tile dimensions instead

of the image dimensions.

Bug: b/205714066
Test: CTS BitmapFactoryTest
Change-Id: I53407c6740eecbc8c3c610827074c4cf10aa341e
parent 0fe05c41
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ sp<IMemory> StagefrightMetadataRetriever::getImageInternal(
    }

    const char *mime;
    bool isHeif = false;
    if (!trackMeta->findCString(kKeyMIMEType, &mime)) {
        ALOGE("image track has no mime type");
        return NULL;
@@ -215,6 +216,7 @@ sp<IMemory> StagefrightMetadataRetriever::getImageInternal(
        mime = MEDIA_MIMETYPE_VIDEO_HEVC;
        trackMeta = new MetaData(*trackMeta);
        trackMeta->setCString(kKeyMIMEType, mime);
        isHeif = true;
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_AVIF)) {
        mime = MEDIA_MIMETYPE_VIDEO_AV1;
        trackMeta = new MetaData(*trackMeta);
@@ -240,6 +242,16 @@ sp<IMemory> StagefrightMetadataRetriever::getImageInternal(
        format->setInt32("width", thumbWidth);
    }

    // If decoding tiled HEIF check decoder supports tile dimensions instead
    if (!thumbnail && isHeif && format != NULL) {
        int32_t tileWidth, tileHeight;
        if (trackMeta->findInt32(kKeyTileWidth, &tileWidth) && tileWidth > 0
                && trackMeta->findInt32(kKeyTileHeight, &tileHeight) && tileHeight > 0) {
            format->setInt32("height", tileHeight);
            format->setInt32("width", tileWidth);
        }
    }

    MediaCodecList::findMatchingCodecs(
            mime,
            false, /* encoder */