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

Commit 92092b39 authored by Lajos Molnar's avatar Lajos Molnar Committed by Android (Google) Code Review
Browse files

Merge "stagefright: limit default max-input-size for AVC" into klp-dev

parents 069bcc50 f40cde13
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -1368,6 +1368,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
                return err;
            }

            const char *mime;
            CHECK(mLastTrack->meta->findCString(kKeyMIMEType, &mime));

            if (max_size != 0) {
                // Assume that a given buffer only contains at most 10 chunks,
                // each chunk originally prefixed with a 2 byte length will
@@ -1377,19 +1380,27 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
            } else {
                // No size was specified. Pick a conservatively large size.
                int32_t width, height;
                if (mLastTrack->meta->findInt32(kKeyWidth, &width) &&
                        mLastTrack->meta->findInt32(kKeyHeight, &height)) {
                    mLastTrack->meta->setInt32(kKeyMaxInputSize, width * height * 3 / 2);
                } else {
                if (!mLastTrack->meta->findInt32(kKeyWidth, &width) ||
                    !mLastTrack->meta->findInt32(kKeyHeight, &height)) {
                    ALOGE("No width or height, assuming worst case 1080p");
                    mLastTrack->meta->setInt32(kKeyMaxInputSize, 3110400);
                    width = 1920;
                    height = 1080;
                }

                if (!strcmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
                    // AVC requires compression ratio of at least 2, and uses
                    // macroblocks
                    max_size = ((width + 15) / 16) * ((height + 15) / 16) * 192;
                } else {
                    // For all other formats there is no minimum compression
                    // ratio. Use compression ratio of 1.
                    max_size = width * height * 3 / 2;
                }
                mLastTrack->meta->setInt32(kKeyMaxInputSize, max_size);
            }
            *offset += chunk_size;

            // Calculate average frame rate.
            const char *mime;
            CHECK(mLastTrack->meta->findCString(kKeyMIMEType, &mime));
            if (!strncasecmp("video/", mime, 6)) {
                size_t nSamples = mLastTrack->sampleTable->countSamples();
                int64_t durationUs;