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

Commit 04bb3fcd authored by Ruchika Ashtankar's avatar Ruchika Ashtankar
Browse files

Add support for vp9 playback in mp4

Test: stagefright -S /sdcard/vp9.mp4

Bug: 135767694

Change-Id: I37b3766a6f47e234f6506d38d2d1defaafe22308
parent 888b01ab
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -351,6 +351,8 @@ static const char *FourCC2MIME(uint32_t fourcc) {
            return MEDIA_MIMETYPE_AUDIO_FLAC;
        case FOURCC("av01"):
            return MEDIA_MIMETYPE_VIDEO_AV1;
        case FOURCC("vp09"):
            return MEDIA_MIMETYPE_VIDEO_VP9;
        case FOURCC(".mp3"):
        case 0x6D730055: // "ms U" mp3 audio
            return MEDIA_MIMETYPE_AUDIO_MPEG;
@@ -1849,6 +1851,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
        case FOURCC("hvc1"):
        case FOURCC("hev1"):
        case FOURCC("av01"):
        case FOURCC("vp09"):
        {
            uint8_t buffer[78];
            if (chunk_data_size < (ssize_t)sizeof(buffer)) {
@@ -2310,6 +2313,8 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
            *offset += chunk_size;
            break;
        }

        case FOURCC("vpcC"):
        case FOURCC("av1C"):
        {
            auto buffer = heapbuffer<uint8_t>(chunk_data_size);
@@ -4157,6 +4162,18 @@ MediaTrackHelper *MPEG4Extractor::getTrack(size_t index) {
        if (size < 5 || ptr[0] != 0x81) {  // configurationVersion == 1
            return NULL;
        }
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_VP9)) {
        void *data;
        size_t size;
        if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_0, &data, &size)) {
            return NULL;
        }

        const uint8_t *ptr = (const uint8_t *)data;

        if (size < 5 || ptr[0] != 0x01) {  // configurationVersion == 1
            return NULL;
        }
    }

    if (track->has_elst and !strncasecmp("video/", mime, 6) and track->elst_media_time > 0) {
@@ -4194,6 +4211,10 @@ status_t MPEG4Extractor::verifyTrack(Track *track) {
        if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_0, &data, &size)) {
            return ERROR_MALFORMED;
        }
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_VP9)) {
        if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_0, &data, &size)) {
            return ERROR_MALFORMED;
        }
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4)
            || !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG2)
            || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
@@ -6359,6 +6380,7 @@ static bool isCompatibleBrand(uint32_t fourcc) {
        FOURCC("hvc1"),
        FOURCC("hev1"),
        FOURCC("av01"),
        FOURCC("vp09"),
        FOURCC("3gp4"),
        FOURCC("mp41"),
        FOURCC("mp42"),