OSDN Git Service

Eliminate superfluous memcpys by wrapping an ABuffer in a MediaBuffer
authorAndreas Huber <andih@google.com>
Thu, 4 Aug 2011 22:05:17 +0000 (15:05 -0700)
committerAndreas Huber <andih@google.com>
Thu, 4 Aug 2011 22:05:17 +0000 (15:05 -0700)
Change-Id: I1313f117cd7cdfaf7d6ec25413a0b4b8ea495037
related-to-bug: 5122973

include/media/stagefright/MediaBuffer.h
media/libstagefright/MediaBuffer.cpp
media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
media/libstagefright/rtsp/APacketSource.cpp

index c1c4f94..3d79596 100644 (file)
@@ -25,6 +25,7 @@
 
 namespace android {
 
+struct ABuffer;
 class GraphicBuffer;
 class MediaBuffer;
 class MediaBufferObserver;
@@ -51,6 +52,8 @@ public:
 
     MediaBuffer(const sp<GraphicBuffer>& graphicBuffer);
 
+    MediaBuffer(const sp<ABuffer> &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<GraphicBuffer> mGraphicBuffer;
+    sp<ABuffer> mBuffer;
 
     bool mOwnsData;
 
index a8fadf2..0b14f1e 100644 (file)
@@ -21,6 +21,7 @@
 #include <pthread.h>
 #include <stdlib.h>
 
+#include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/MediaBuffer.h>
 #include <media/stagefright/MediaDebug.h>
 #include <media/stagefright/MetaData.h>
@@ -70,6 +71,20 @@ MediaBuffer::MediaBuffer(const sp<GraphicBuffer>& graphicBuffer)
       mOriginal(NULL) {
 }
 
+MediaBuffer::MediaBuffer(const sp<ABuffer> &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);
index 59de17e..2e66a2c 100644 (file)
@@ -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;
         }
index a02591f..4ecb92f 100644 (file)
@@ -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());