Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e38a2cba authored by Andreas Huber's avatar Andreas Huber
Browse files

Eliminate superfluous memcpys by wrapping an ABuffer in a MediaBuffer

Change-Id: I1313f117cd7cdfaf7d6ec25413a0b4b8ea495037
related-to-bug: 5122973
parent e30d6f15
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;

+15 −0
Original line number Diff line number Diff line
@@ -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);
+2 −4
Original line number Diff line number Diff line
@@ -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;
        }
+1 −3
Original line number Diff line number Diff line
@@ -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());