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

Commit 7e34bf5a authored by Wonsik Kim's avatar Wonsik Kim
Browse files

MediaCodec refactoring part 1-a: buffers become separate class

MediaCodecBuffer is meant to replace ABuffer and MediaBuffer in
communication between framework components. As the first step, replace
use of ABuffer in MediaCodec with MediaCodecBuffer, and adjust related
classes accordingly.

MediaCodec.getBuffer() and related APIs now returns MediaCodecBuffers;
thus change MediaCodec clients to use MediaCodecBuffer accordingly.

Test: manually tested for key use cases (Camera, YouTube and Play Movies)
Change-Id: Iba7ce131645e75ce5ddbf497fb793ab38b7f245b
parent 616445ea
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaMuxer.h>
#include <media/ICrypto.h>
#include <media/MediaCodecBuffer.h>

#include "screenrecord.h"
#include "Overlay.h"
@@ -328,7 +329,7 @@ static status_t runEncoder(const sp<MediaCodec>& encoder,

    assert((rawFp == NULL && muxer != NULL) || (rawFp != NULL && muxer == NULL));

    Vector<sp<ABuffer> > buffers;
    Vector<sp<MediaCodecBuffer> > buffers;
    err = encoder->getOutputBuffers(&buffers);
    if (err != NO_ERROR) {
        fprintf(stderr, "Unable to get output buffers (err=%d)\n", err);
@@ -411,7 +412,10 @@ static status_t runEncoder(const sp<MediaCodec>& encoder,
                    // want to queue these up and do them on a different thread.
                    ATRACE_NAME("write sample");
                    assert(trackIdx != -1);
                    err = muxer->writeSampleData(buffers[bufIndex], trackIdx,
                    // TODO
                    sp<ABuffer> buffer = new ABuffer(
                            buffers[bufIndex]->data(), buffers[bufIndex]->size());
                    err = muxer->writeSampleData(buffer, trackIdx,
                            ptsUsec, flags);
                    if (err != NO_ERROR) {
                        fprintf(stderr,
+8 −5
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <media/AudioTrack.h>
#include <media/ICrypto.h>
#include <media/IMediaHTTPService.h>
#include <media/MediaCodecBuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -355,7 +356,7 @@ status_t SimplePlayer::onPrepare() {
            err = state->mCodec->dequeueInputBuffer(&index, -1ll);
            CHECK_EQ(err, (status_t)OK);

            const sp<ABuffer> &dstBuffer = state->mBuffers[0].itemAt(index);
            const sp<MediaCodecBuffer> &dstBuffer = state->mBuffers[0].itemAt(index);

            CHECK_LE(srcBuffer->size(), dstBuffer->capacity());
            dstBuffer->setRange(0, srcBuffer->size());
@@ -482,11 +483,13 @@ status_t SimplePlayer::onDoMoreStuff() {
            state->mAvailInputBufferIndices.erase(
                    state->mAvailInputBufferIndices.begin());

            const sp<ABuffer> &dstBuffer =
            const sp<MediaCodecBuffer> &dstBuffer =
                state->mBuffers[0].itemAt(index);
            sp<ABuffer> abuffer = new ABuffer(dstBuffer->base(), dstBuffer->capacity());

            err = mExtractor->readSampleData(dstBuffer);
            err = mExtractor->readSampleData(abuffer);
            CHECK_EQ(err, (status_t)OK);
            dstBuffer->setRange(abuffer->offset(), abuffer->size());

            int64_t timeUs;
            CHECK_EQ(mExtractor->getSampleTime(&timeUs), (status_t)OK);
@@ -530,7 +533,7 @@ status_t SimplePlayer::onDoMoreStuff() {
                    state->mCodec->releaseOutputBuffer(info->mIndex);
                } else {
                    if (state->mAudioTrack != NULL) {
                        const sp<ABuffer> &srcBuffer =
                        const sp<MediaCodecBuffer> &srcBuffer =
                            state->mBuffers[1].itemAt(info->mIndex);

                        renderAudio(state, info, srcBuffer);
@@ -597,7 +600,7 @@ status_t SimplePlayer::onOutputFormatChanged(
}

void SimplePlayer::renderAudio(
        CodecState *state, BufferInfo *info, const sp<ABuffer> &buffer) {
        CodecState *state, BufferInfo *info, const sp<MediaCodecBuffer> &buffer) {
    CHECK(state->mAudioTrack != NULL);

    if (state->mAudioTrack->stopped()) {
+3 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ struct ALooper;
struct AudioTrack;
class IGraphicBufferProducer;
struct MediaCodec;
class MediaCodecBuffer;
struct NuMediaExtractor;
class Surface;

@@ -73,7 +74,7 @@ private:
    {
        sp<MediaCodec> mCodec;
        Vector<sp<ABuffer> > mCSD;
        Vector<sp<ABuffer> > mBuffers[2];
        Vector<sp<MediaCodecBuffer> > mBuffers[2];

        List<size_t> mAvailInputBufferIndices;
        List<BufferInfo> mAvailOutputBufferInfos;
@@ -101,7 +102,7 @@ private:
    status_t onOutputFormatChanged(size_t trackIndex, CodecState *state);

    void renderAudio(
            CodecState *state, BufferInfo *info, const sp<ABuffer> &buffer);
            CodecState *state, BufferInfo *info, const sp<MediaCodecBuffer> &buffer);

    DISALLOW_EVIL_CONSTRUCTORS(SimplePlayer);
};
+7 −4
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <media/ICrypto.h>
#include <media/IMediaHTTPService.h>
#include <media/IMediaPlayerService.h>
#include <media/MediaCodecBuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ALooper.h>
@@ -56,8 +57,8 @@ namespace android {

struct CodecState {
    sp<MediaCodec> mCodec;
    Vector<sp<ABuffer> > mInBuffers;
    Vector<sp<ABuffer> > mOutBuffers;
    Vector<sp<MediaCodecBuffer> > mInBuffers;
    Vector<sp<MediaCodecBuffer> > mOutBuffers;
    bool mSignalledInputEOS;
    bool mSawOutputEOS;
    int64_t mNumBuffersDecoded;
@@ -174,10 +175,12 @@ static int decode(
                if (err == OK) {
                    ALOGV("filling input buffer %zu", index);

                    const sp<ABuffer> &buffer = state->mInBuffers.itemAt(index);
                    const sp<MediaCodecBuffer> &buffer = state->mInBuffers.itemAt(index);
                    sp<ABuffer> abuffer = new ABuffer(buffer->base(), buffer->capacity());

                    err = extractor->readSampleData(buffer);
                    err = extractor->readSampleData(abuffer);
                    CHECK_EQ(err, (status_t)OK);
                    buffer->setRange(abuffer->offset(), abuffer->size());

                    int64_t timeUs;
                    err = extractor->getSampleTime(&timeUs);
+9 −6
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <gui/Surface.h>
#include <media/ICrypto.h>
#include <media/IMediaHTTPService.h>
#include <media/MediaCodecBuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -131,8 +132,8 @@ private:

struct CodecState {
    sp<MediaCodec> mCodec;
    Vector<sp<ABuffer> > mInBuffers;
    Vector<sp<ABuffer> > mOutBuffers;
    Vector<sp<MediaCodecBuffer> > mInBuffers;
    Vector<sp<MediaCodecBuffer> > mOutBuffers;
    bool mSignalledInputEOS;
    bool mSawOutputEOS;
    int64_t mNumBuffersDecoded;
@@ -183,9 +184,9 @@ void tryCopyDecodedBuffer(
    }
    size_t outIndex = frame.index;

    const sp<ABuffer> &srcBuffer =
    const sp<MediaCodecBuffer> &srcBuffer =
        vidState->mOutBuffers.itemAt(outIndex);
    const sp<ABuffer> &destBuffer =
    const sp<MediaCodecBuffer> &destBuffer =
        filterState->mInBuffers.itemAt(filterIndex);

    sp<AMessage> srcFormat, destFormat;
@@ -532,10 +533,12 @@ static int decode(
                if (err == OK) {
                    ALOGV("filling input buffer %zu", index);

                    const sp<ABuffer> &buffer = state->mInBuffers.itemAt(index);
                    const sp<MediaCodecBuffer> &buffer = state->mInBuffers.itemAt(index);
                    sp<ABuffer> abuffer = new ABuffer(buffer->base(), buffer->capacity());

                    err = extractor->readSampleData(buffer);
                    err = extractor->readSampleData(abuffer);
                    CHECK(err == OK);
                    buffer->setRange(abuffer->offset(), abuffer->size());

                    int64_t timeUs;
                    err = extractor->getSampleTime(&timeUs);
Loading