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 Original line Diff line number Diff line
@@ -51,6 +51,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaMuxer.h>
#include <media/stagefright/MediaMuxer.h>
#include <media/ICrypto.h>
#include <media/ICrypto.h>
#include <media/MediaCodecBuffer.h>


#include "screenrecord.h"
#include "screenrecord.h"
#include "Overlay.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));
    assert((rawFp == NULL && muxer != NULL) || (rawFp != NULL && muxer == NULL));


    Vector<sp<ABuffer> > buffers;
    Vector<sp<MediaCodecBuffer> > buffers;
    err = encoder->getOutputBuffers(&buffers);
    err = encoder->getOutputBuffers(&buffers);
    if (err != NO_ERROR) {
    if (err != NO_ERROR) {
        fprintf(stderr, "Unable to get output buffers (err=%d)\n", err);
        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.
                    // want to queue these up and do them on a different thread.
                    ATRACE_NAME("write sample");
                    ATRACE_NAME("write sample");
                    assert(trackIdx != -1);
                    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);
                            ptsUsec, flags);
                    if (err != NO_ERROR) {
                    if (err != NO_ERROR) {
                        fprintf(stderr,
                        fprintf(stderr,
+8 −5
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@
#include <media/AudioTrack.h>
#include <media/AudioTrack.h>
#include <media/ICrypto.h>
#include <media/ICrypto.h>
#include <media/IMediaHTTPService.h>
#include <media/IMediaHTTPService.h>
#include <media/MediaCodecBuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -355,7 +356,7 @@ status_t SimplePlayer::onPrepare() {
            err = state->mCodec->dequeueInputBuffer(&index, -1ll);
            err = state->mCodec->dequeueInputBuffer(&index, -1ll);
            CHECK_EQ(err, (status_t)OK);
            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());
            CHECK_LE(srcBuffer->size(), dstBuffer->capacity());
            dstBuffer->setRange(0, srcBuffer->size());
            dstBuffer->setRange(0, srcBuffer->size());
@@ -482,11 +483,13 @@ status_t SimplePlayer::onDoMoreStuff() {
            state->mAvailInputBufferIndices.erase(
            state->mAvailInputBufferIndices.erase(
                    state->mAvailInputBufferIndices.begin());
                    state->mAvailInputBufferIndices.begin());


            const sp<ABuffer> &dstBuffer =
            const sp<MediaCodecBuffer> &dstBuffer =
                state->mBuffers[0].itemAt(index);
                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);
            CHECK_EQ(err, (status_t)OK);
            dstBuffer->setRange(abuffer->offset(), abuffer->size());


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


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


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


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


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


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


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


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


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


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


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


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


    sp<AMessage> srcFormat, destFormat;
    sp<AMessage> srcFormat, destFormat;
@@ -532,10 +533,12 @@ static int decode(
                if (err == OK) {
                if (err == OK) {
                    ALOGV("filling input buffer %zu", index);
                    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);
                    CHECK(err == OK);
                    buffer->setRange(abuffer->offset(), abuffer->size());


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