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

Commit 44a5a202 authored by Chong Zhang's avatar Chong Zhang Committed by Android (Google) Code Review
Browse files

Merge "cache up to 200K bytes (instead of 10 buffers) in DecoderPassThrough" into lmp-dev

parents 47bf8d8f de01afbb
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);