diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2013-12-05 12:38:14 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2013-12-05 12:38:14 -0800 |
commit | e2d617f5ba7fb90f27b03e2593666b2c927e4dc9 (patch) | |
tree | 187992f0c2d4bc565ca24b34aa0ee78e359a3f68 /media/libstagefright/MPEG4Extractor.cpp | |
parent | 92630351d265a61faae2dfe006a8bb330283aa7b (diff) | |
parent | 2381f06f374ee0cb8bca0edf5388394432b00e6d (diff) | |
download | frameworks_av-e2d617f5ba7fb90f27b03e2593666b2c927e4dc9.zip frameworks_av-e2d617f5ba7fb90f27b03e2593666b2c927e4dc9.tar.gz frameworks_av-e2d617f5ba7fb90f27b03e2593666b2c927e4dc9.tar.bz2 |
Merge commit '2381f06f374ee0cb8bca0edf5388394432b00e6d' into HEAD
Diffstat (limited to 'media/libstagefright/MPEG4Extractor.cpp')
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 13e22d6..9b36b6a 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -1386,19 +1386,33 @@ 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; + } + + const char *mime; + CHECK(mLastTrack->meta->findCString(kKeyMIMEType, &mime)); + 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. + // NOTE: setting another piece of metadata invalidates any pointers (such as the + // mimetype) previously obtained, so don't cache them. const char *mime; CHECK(mLastTrack->meta->findCString(kKeyMIMEType, &mime)); + // Calculate average frame rate. if (!strncasecmp("video/", mime, 6)) { size_t nSamples = mLastTrack->sampleTable->countSamples(); int64_t durationUs; |