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

Commit a9307bef authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "Eliminate superfluous memcpys by wrapping an ABuffer in a MediaBuffer"

parents e83af902 e38a2cba
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());