diff options
author | Lajos Molnar <lajos@google.com> | 2013-11-13 14:11:41 -0800 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2013-11-13 14:57:40 -0800 |
commit | f40cde132d14a260f4f7e08ae2bf29d8c55848ae (patch) | |
tree | 6ea444dcf701b25937f0017c0f459492c0ac2aa3 /media/libstagefright/MPEG4Extractor.cpp | |
parent | 5595f6de606f51ec61fbf40a269b52312507aded (diff) | |
download | frameworks_av-f40cde132d14a260f4f7e08ae2bf29d8c55848ae.zip frameworks_av-f40cde132d14a260f4f7e08ae2bf29d8c55848ae.tar.gz frameworks_av-f40cde132d14a260f4f7e08ae2bf29d8c55848ae.tar.bz2 |
stagefright: limit default max-input-size for AVC
AVC has a compression ratio of at least 2. Account for this, as
some codecs refuse exorbitant max-input-size requests.
Change-Id: Ib68b485879ba33a12a486f2ce18fe100be977699
Signed-off-by: Lajos Molnar <lajos@google.com>
Bug: 11599364
Diffstat (limited to 'media/libstagefright/MPEG4Extractor.cpp')
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index ad985ee..b8988e6 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -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; |