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

Commit 711fc045 authored by Manisha Jajoo's avatar Manisha Jajoo Committed by Cherrypicker Worker
Browse files

Mpeg4Extractor: Fix flac parsing in mp4

Flac in mp4 can have multiple metadata tags.
Added handling for the same.

Bug: 227296847
Test: stagefright -ao flac.mp4
Test: atest ExtractorUnitTest -- --enable-module-dynamic-download=true
Test: atest android.mediav2.cts

Change-Id: I3b8c4d374073c5dfd32f5f1b15d162103a7d6f5c
(cherry picked from commit 2039d4fb)
Merged-In: I3b8c4d374073c5dfd32f5f1b15d162103a7d6f5c
parent 42bafe99
Loading
Loading
Loading
Loading
+30 −19
Original line number Diff line number Diff line
@@ -1969,26 +1969,8 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
            }

            if (chunk_type == FOURCC("fLaC")) {

                // From https://github.com/xiph/flac/blob/master/doc/isoflac.txt
                // 4 for mime, 4 for blockType and BlockLen, 34 for metadata
                uint8_t flacInfo[4 + 4 + 34];
                // skipping dFla, version
                data_offset += sizeof(buffer) + 12;
                size_t flacOffset = 4;
                // Add flaC header mime type to CSD
                strncpy((char *)flacInfo, "fLaC", 4);
                if (mDataSource->readAt(
                        data_offset, flacInfo + flacOffset, sizeof(flacInfo) - flacOffset) <
                        (ssize_t)sizeof(flacInfo) - flacOffset) {
                    return ERROR_IO;
                }
                data_offset += sizeof(flacInfo) - flacOffset;

                AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_CSD_0, flacInfo,
                                       sizeof(flacInfo));
                data_offset += sizeof(buffer);
                *offset = data_offset;
                CHECK_EQ(*offset, stop_offset);
            }

            while (*offset < stop_offset) {
@@ -2521,6 +2503,35 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
            break;
        }

        case FOURCC("dfLa"):
        {
            *offset += chunk_size;

            // From https://github.com/xiph/flac/blob/master/doc/isoflac.txt
            // 4 for mediaType, 4 for blockType and BlockLen, 34 for metadata
            uint8_t flacInfo[4 + 4 + 34];

            if (chunk_data_size != sizeof(flacInfo)) {
                return ERROR_MALFORMED;
            }

            data_offset += 4;
            size_t flacOffset = 4;
            // Add flaC header mediaType to CSD
            strncpy((char *)flacInfo, "fLaC", 4);

            ssize_t bytesToRead = sizeof(flacInfo) - flacOffset;
            if (mDataSource->readAt(
                    data_offset, flacInfo + flacOffset, bytesToRead) < bytesToRead) {
                return ERROR_IO;
            }

            data_offset += bytesToRead;
            AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_CSD_0, flacInfo,
                                    sizeof(flacInfo));
            break;
        }

        case FOURCC("avcC"):
        {
            *offset += chunk_size;