diff options
author | Dandawate Saket <dsaket@ti.com> | 2011-04-11 19:35:59 +0530 |
---|---|---|
committer | Dandawate Saket <dsaket@ti.com> | 2011-04-11 19:35:59 +0530 |
commit | 2e7868fb878595b491920e505d1db2d1a42f659c (patch) | |
tree | c7fc3cd299a6d1d9116496681c10f41fa5f986ef | |
parent | 2a4a074ab4f3842d53c576c75481bebca9a6acaa (diff) | |
download | base-2e7868fb878595b491920e505d1db2d1a42f659c.tar.gz |
Reduce memcpy in mpeg4extractor for H264
Currently the file content is read into a source buffer and then
parsered for NAL unit size. Then the start code and nal unit is
dumped in destination buffer provided by application.
The code is optimized to put the data from file directly into
application buffer.
Defect ID: OMAPS00229223
Change-Id: Ie6411145fcd5bc1cac4d0d76efee2cb3c133185d
Signed-off-by: Dandawate Saket <dsaket@ti.com>
-rwxr-xr-x | media/libstagefright/MPEG4Extractor.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 232e2d473f25..b692f863a886 100755 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -2134,7 +2134,45 @@ status_t MPEG4Source::read( } else { // Whole NAL units are returned but each fragment is prefixed by // the start code (0x00 00 00 01). +#ifdef OMAP_ENHANCEMENT + uint8_t *dstData = (uint8_t *)mBuffer->data(); + size_t dstOffset = 0; + + while (dstOffset < size) { + CHECK(dstOffset + mNALLengthSize <= size); + ssize_t num_bytes_read = mDataSource->readAt(offset+dstOffset, mSrcBuffer, mNALLengthSize); + if (num_bytes_read < (ssize_t)mNALLengthSize) { + mBuffer->release(); + mBuffer = NULL; + return ERROR_IO; + } + size_t nalLength = parseNALSize(&mSrcBuffer[0]); + if (dstOffset + nalLength > size) { + mBuffer->release(); + mBuffer = NULL; + return ERROR_MALFORMED; + } + if (nalLength == 0) { + continue; + } + + CHECK(dstOffset + 4 <= mBuffer->size()); + + dstData[dstOffset++] = 0; + dstData[dstOffset++] = 0; + dstData[dstOffset++] = 0; + dstData[dstOffset++] = 1; + num_bytes_read = mDataSource->readAt(offset+dstOffset, &dstData[dstOffset], nalLength); + if (num_bytes_read < (ssize_t)nalLength) { + mBuffer->release(); + mBuffer = NULL; + return ERROR_IO; + } + dstOffset += nalLength; + } + CHECK_EQ(dstOffset, size); +#else ssize_t num_bytes_read = mDataSource->readAt(offset, mSrcBuffer, size); @@ -2176,6 +2214,7 @@ status_t MPEG4Source::read( dstOffset += nalLength; } CHECK_EQ(srcOffset, size); +#endif CHECK(mBuffer != NULL); mBuffer->set_range(0, dstOffset); |