summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MPEG4Extractor.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2013-11-13 14:11:41 -0800
committerLajos Molnar <lajos@google.com>2013-11-13 14:57:40 -0800
commitf40cde132d14a260f4f7e08ae2bf29d8c55848ae (patch)
tree6ea444dcf701b25937f0017c0f459492c0ac2aa3 /media/libstagefright/MPEG4Extractor.cpp
parent5595f6de606f51ec61fbf40a269b52312507aded (diff)
downloadframeworks_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.cpp25
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;