diff options
author | Andreas Huber <andih@google.com> | 2009-11-23 14:03:32 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2009-11-23 14:06:42 -0800 |
commit | 738c4315859395bfeeaae3d4c9d6fb9f414778f1 (patch) | |
tree | 914b3e3eb6702df6b62191ca96819f31ee20e1a1 /media | |
parent | bfa6b2d7a1be1832ac40ed90aece1834f720b5c6 (diff) | |
download | frameworks_av-738c4315859395bfeeaae3d4c9d6fb9f414778f1.zip frameworks_av-738c4315859395bfeeaae3d4c9d6fb9f414778f1.tar.gz frameworks_av-738c4315859395bfeeaae3d4c9d6fb9f414778f1.tar.bz2 |
Make sure the decoder's input buffers are large enough to hold the largest input data. Verify that the setting actually sticks.
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 20 | ||||
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 10 |
2 files changed, 20 insertions, 10 deletions
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 9d17064..7969710 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -635,6 +635,15 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) { return err; } + size_t max_size; + CHECK_EQ(mLastTrack->sampleTable->getMaxSampleSize(&max_size), OK); + + // Assume that a given buffer only contains at most 10 fragments, + // each fragment originally prefixed with a 2 byte length will + // have a 4 byte header (0x00 0x00 0x00 0x01) after conversion, + // and thus will grow by 2 bytes per fragment. + mLastTrack->meta->setInt32(kKeyMaxInputSize, max_size + 10 * 2); + *offset += chunk_size; break; } @@ -792,15 +801,10 @@ status_t MPEG4Source::start(MetaData *params) { mGroup = new MediaBufferGroup; - size_t max_size; - status_t err = mSampleTable->getMaxSampleSize(&max_size); - CHECK_EQ(err, OK); + int32_t max_size; + CHECK(mFormat->findInt32(kKeyMaxInputSize, &max_size)); - // Assume that a given buffer only contains at most 10 fragments, - // each fragment originally prefixed with a 2 byte length will - // have a 4 byte header (0x00 0x00 0x00 0x01) after conversion, - // and thus will grow by 2 bytes per fragment. - mGroup->add_buffer(new MediaBuffer(max_size + 10 * 2)); + mGroup->add_buffer(new MediaBuffer(max_size)); mSrcBuffer = new uint8_t[max_size]; diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 9297aff..10a4986 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -462,7 +462,7 @@ sp<OMXCodec> OMXCodec::Create( } int32_t maxInputSize; - if (createEncoder && meta->findInt32(kKeyMaxInputSize, &maxInputSize)) { + if (meta->findInt32(kKeyMaxInputSize, &maxInputSize)) { codec->setMinBufferSize(kPortIndexInput, (OMX_U32)maxInputSize); } @@ -487,12 +487,18 @@ void OMXCodec::setMinBufferSize(OMX_U32 portIndex, OMX_U32 size) { if (def.nBufferSize < size) { def.nBufferSize = size; - } err = mOMX->setParameter( mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); CHECK_EQ(err, OK); + + err = mOMX->getParameter( + mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); + CHECK_EQ(err, OK); + + // Make sure the setting actually stuck. + CHECK(def.nBufferSize >= size); } status_t OMXCodec::setVideoPortFormatType( |