From: Andreas Huber Date: Thu, 4 Aug 2011 22:05:17 +0000 (-0700) Subject: Eliminate superfluous memcpys by wrapping an ABuffer in a MediaBuffer X-Git-Tag: android-x86-4.4-r1~1579^2~600 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=f89d780df70b7fbb8465bce4913c46cca019721f;p=android-x86%2Fframeworks-av.git Eliminate superfluous memcpys by wrapping an ABuffer in a MediaBuffer Change-Id: I1313f117cd7cdfaf7d6ec25413a0b4b8ea495037 related-to-bug: 5122973 --- diff --git a/include/media/stagefright/MediaBuffer.h b/include/media/stagefright/MediaBuffer.h index c1c4f9498a..3d79596f3f 100644 --- a/include/media/stagefright/MediaBuffer.h +++ b/include/media/stagefright/MediaBuffer.h @@ -25,6 +25,7 @@ namespace android { +struct ABuffer; class GraphicBuffer; class MediaBuffer; class MediaBufferObserver; @@ -51,6 +52,8 @@ public: MediaBuffer(const sp& graphicBuffer); + MediaBuffer(const sp &buffer); + // Decrements the reference count and returns the buffer to its // associated MediaBufferGroup if the reference count drops to 0. void release(); @@ -100,6 +103,7 @@ private: void *mData; size_t mSize, mRangeOffset, mRangeLength; sp mGraphicBuffer; + sp mBuffer; bool mOwnsData; diff --git a/media/libstagefright/MediaBuffer.cpp b/media/libstagefright/MediaBuffer.cpp index a8fadf2c3a..0b14f1ecfb 100644 --- a/media/libstagefright/MediaBuffer.cpp +++ b/media/libstagefright/MediaBuffer.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -70,6 +71,20 @@ MediaBuffer::MediaBuffer(const sp& graphicBuffer) mOriginal(NULL) { } +MediaBuffer::MediaBuffer(const sp &buffer) + : mObserver(NULL), + mNextBuffer(NULL), + mRefCount(0), + mData(buffer->data()), + mSize(buffer->size()), + mRangeOffset(0), + mRangeLength(mSize), + mBuffer(buffer), + mOwnsData(false), + mMetaData(new MetaData), + mOriginal(NULL) { +} + void MediaBuffer::release() { if (mObserver == NULL) { CHECK_EQ(mRefCount, 0); diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp index 59de17eb7b..2e66a2cf1d 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -105,12 +105,10 @@ status_t AnotherPacketSource::read( int64_t timeUs; CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); - MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size()); - mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); + MediaBuffer *mediaBuffer = new MediaBuffer(buffer); - // hexdump(buffer->data(), buffer->size()); + mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); - memcpy(mediaBuffer->data(), buffer->data(), buffer->size()); *out = mediaBuffer; return OK; } diff --git a/media/libstagefright/rtsp/APacketSource.cpp b/media/libstagefright/rtsp/APacketSource.cpp index a02591f709..4ecb92f02c 100644 --- a/media/libstagefright/rtsp/APacketSource.cpp +++ b/media/libstagefright/rtsp/APacketSource.cpp @@ -628,14 +628,12 @@ status_t APacketSource::read( updateNormalPlayTime_l(buffer); - MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size()); - int64_t timeUs; CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); + MediaBuffer *mediaBuffer = new MediaBuffer(buffer); mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); - memcpy(mediaBuffer->data(), buffer->data(), buffer->size()); *out = mediaBuffer; mBuffers.erase(mBuffers.begin());