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

Commit de01afbb authored by Chong Zhang's avatar Chong Zhang
Browse files

cache up to 200K bytes (instead of 10 buffers) in DecoderPassThrough

Bug: 16892521
Change-Id: I0e2da4134a37e632f9f2c29d1d27d8fded7a7863
parent e6e18e8d
Loading
Loading
Loading
Loading
+13 −3
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@
namespace android {
namespace android {


static const int kMaxPendingBuffers = 10;
static const int kMaxPendingBuffers = 10;
static const int kMaxCachedBytes = 200000;


NuPlayer::DecoderPassThrough::DecoderPassThrough(
NuPlayer::DecoderPassThrough::DecoderPassThrough(
        const sp<AMessage> &notify)
        const sp<AMessage> &notify)
@@ -39,6 +40,7 @@ NuPlayer::DecoderPassThrough::DecoderPassThrough(
      mBufferGeneration(0),
      mBufferGeneration(0),
      mReachedEOS(true),
      mReachedEOS(true),
      mPendingBuffers(0),
      mPendingBuffers(0),
      mCachedBytes(0),
      mComponentName("pass through decoder") {
      mComponentName("pass through decoder") {
    mDecoderLooper = new ALooper;
    mDecoderLooper = new ALooper;
    mDecoderLooper->setName("NuPlayerDecoderPassThrough");
    mDecoderLooper->setName("NuPlayerDecoderPassThrough");
@@ -78,6 +80,7 @@ bool NuPlayer::DecoderPassThrough::supportsSeamlessFormatChange(
void NuPlayer::DecoderPassThrough::onConfigure(const sp<AMessage> &format) {
void NuPlayer::DecoderPassThrough::onConfigure(const sp<AMessage> &format) {
    ALOGV("[%s] onConfigure", mComponentName.c_str());
    ALOGV("[%s] onConfigure", mComponentName.c_str());
    mPendingBuffers = 0;
    mPendingBuffers = 0;
    mCachedBytes = 0;
    mReachedEOS = false;
    mReachedEOS = false;
    ++mBufferGeneration;
    ++mBufferGeneration;


@@ -96,7 +99,7 @@ bool NuPlayer::DecoderPassThrough::isStaleReply(const sp<AMessage> &msg) {
}
}


void NuPlayer::DecoderPassThrough::requestABuffer() {
void NuPlayer::DecoderPassThrough::requestABuffer() {
    if (mPendingBuffers >= kMaxPendingBuffers || mReachedEOS) {
    if (mCachedBytes >= kMaxCachedBytes || mReachedEOS) {
        ALOGV("[%s] mReachedEOS=%d, max pending buffers(%d:%d)",
        ALOGV("[%s] mReachedEOS=%d, max pending buffers(%d:%d)",
                mComponentName.c_str(), (mReachedEOS ? 1 : 0),
                mComponentName.c_str(), (mReachedEOS ? 1 : 0),
                mPendingBuffers, kMaxPendingBuffers);
                mPendingBuffers, kMaxPendingBuffers);
@@ -136,8 +139,11 @@ void android::NuPlayer::DecoderPassThrough::onInputBufferFilled(
        return;
        return;
    }
    }


    mCachedBytes += buffer->size();

    sp<AMessage> reply = new AMessage(kWhatBufferConsumed, id());
    sp<AMessage> reply = new AMessage(kWhatBufferConsumed, id());
    reply->setInt32("generation", mBufferGeneration);
    reply->setInt32("generation", mBufferGeneration);
    reply->setInt32("size", buffer->size());


    sp<AMessage> notify = mNotify->dup();
    sp<AMessage> notify = mNotify->dup();
    notify->setInt32("what", kWhatDrainThisBuffer);
    notify->setInt32("what", kWhatDrainThisBuffer);
@@ -146,8 +152,9 @@ void android::NuPlayer::DecoderPassThrough::onInputBufferFilled(
    notify->post();
    notify->post();
}
}


void NuPlayer::DecoderPassThrough::onBufferConsumed() {
void NuPlayer::DecoderPassThrough::onBufferConsumed(int32_t size) {
    mPendingBuffers--;
    mPendingBuffers--;
    mCachedBytes -= size;
    sp<AMessage> message = new AMessage(kWhatRequestABuffer, id());
    sp<AMessage> message = new AMessage(kWhatRequestABuffer, id());
    message->setInt32("generation", mBufferGeneration);
    message->setInt32("generation", mBufferGeneration);
    message->post();
    message->post();
@@ -160,6 +167,7 @@ void NuPlayer::DecoderPassThrough::onFlush() {
    notify->setInt32("what", kWhatFlushCompleted);
    notify->setInt32("what", kWhatFlushCompleted);
    notify->post();
    notify->post();
    mPendingBuffers = 0;
    mPendingBuffers = 0;
    mCachedBytes = 0;
    mReachedEOS = false;
    mReachedEOS = false;
}
}


@@ -205,7 +213,9 @@ void NuPlayer::DecoderPassThrough::onMessageReceived(const sp<AMessage> &msg) {
        case kWhatBufferConsumed:
        case kWhatBufferConsumed:
        {
        {
            if (!isStaleReply(msg)) {
            if (!isStaleReply(msg)) {
                onBufferConsumed();
                int32_t size;
                CHECK(msg->findInt32("size", &size));
                onBufferConsumed(size);
            }
            }
            break;
            break;
        }
        }
+2 −1
Original line number Original line Diff line number Diff line
@@ -61,12 +61,13 @@ private:
    void onConfigure(const sp<AMessage> &format);
    void onConfigure(const sp<AMessage> &format);
    void onFlush();
    void onFlush();
    void onInputBufferFilled(const sp<AMessage> &msg);
    void onInputBufferFilled(const sp<AMessage> &msg);
    void onBufferConsumed();
    void onBufferConsumed(int32_t size);
    void onShutdown();
    void onShutdown();


    int32_t mBufferGeneration;
    int32_t mBufferGeneration;
    bool mReachedEOS;
    bool mReachedEOS;
    int32_t mPendingBuffers;
    int32_t mPendingBuffers;
    int32_t mCachedBytes;
    AString mComponentName;
    AString mComponentName;


    DISALLOW_EVIL_CONSTRUCTORS(DecoderPassThrough);
    DISALLOW_EVIL_CONSTRUCTORS(DecoderPassThrough);