summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDandawate Saket <dsaket@ti.com>2011-04-11 19:35:59 +0530
committerDandawate Saket <dsaket@ti.com>2011-04-11 19:35:59 +0530
commit2e7868fb878595b491920e505d1db2d1a42f659c (patch)
treec7fc3cd299a6d1d9116496681c10f41fa5f986ef
parent2a4a074ab4f3842d53c576c75481bebca9a6acaa (diff)
downloadbase-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-xmedia/libstagefright/MPEG4Extractor.cpp39
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);