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

Commit a2798e25 authored by Andreas Huber's avatar Andreas Huber
Browse files

Be more greedy when it comes to gathering input and output buffers.

Change-Id: I54c4f608e5155917ca35eba5655b4c06357fb112
parent 05e8074e
Loading
Loading
Loading
Loading
+48 −25
Original line number Diff line number Diff line
@@ -259,7 +259,7 @@ void SimplePlayer::onMessageReceived(const sp<AMessage> &msg) {
            status_t err = onDoMoreStuff();

            if (err == OK) {
                msg->post(5000ll);
                msg->post(10000ll);
            }
            break;
        }
@@ -411,16 +411,27 @@ status_t SimplePlayer::onReset() {
}

status_t SimplePlayer::onDoMoreStuff() {
    ALOGV("onDoMoreStuff");
    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
        CodecState *state = &mStateByTrackIndex.editValueAt(i);

        status_t err;
        do {
            size_t index;
        status_t err = state->mCodec->dequeueInputBuffer(&index);
            err = state->mCodec->dequeueInputBuffer(&index);

            if (err == OK) {
                ALOGV("dequeued input buffer on track %d",
                      mStateByTrackIndex.keyAt(i));

                state->mAvailInputBufferIndices.push_back(index);
            } else {
                ALOGV("dequeueInputBuffer on track %d returned %d",
                      mStateByTrackIndex.keyAt(i), err);
            }
        } while (err == OK);

        do {
            BufferInfo info;
            err = state->mCodec->dequeueOutputBuffer(
                    &info.mIndex,
@@ -430,6 +441,9 @@ status_t SimplePlayer::onDoMoreStuff() {
                    &info.mFlags);

            if (err == OK) {
                ALOGV("dequeued output buffer on track %d",
                      mStateByTrackIndex.keyAt(i));

                state->mAvailOutputBufferInfos.push_back(info);
            } else if (err == INFO_FORMAT_CHANGED) {
                err = onOutputFormatChanged(mStateByTrackIndex.keyAt(i), state);
@@ -437,7 +451,13 @@ status_t SimplePlayer::onDoMoreStuff() {
            } else if (err == INFO_OUTPUT_BUFFERS_CHANGED) {
                err = state->mCodec->getOutputBuffers(&state->mBuffers[1]);
                CHECK_EQ(err, (status_t)OK);
            } else {
                ALOGV("dequeueOutputBuffer on track %d returned %d",
                      mStateByTrackIndex.keyAt(i), err);
            }
        } while (err == OK
                || err == INFO_FORMAT_CHANGED
                || err == INFO_OUTPUT_BUFFERS_CHANGED);
    }

    for (;;) {
@@ -475,6 +495,8 @@ status_t SimplePlayer::onDoMoreStuff() {
                    0);
            CHECK_EQ(err, (status_t)OK);

            ALOGV("enqueued input data on track %d", trackIndex);

            err = mExtractor->advance();
            CHECK_EQ(err, (status_t)OK);
        }
@@ -500,7 +522,7 @@ status_t SimplePlayer::onDoMoreStuff() {

                if (lateByUs > 30000ll) {
                    ALOGI("track %d buffer late by %lld us, dropping.",
                          i, lateByUs);
                          mStateByTrackIndex.keyAt(i), lateByUs);
                    state->mCodec->releaseOutputBuffer(info->mIndex);
                } else {
                    if (state->mAudioTrack != NULL) {
@@ -529,7 +551,8 @@ status_t SimplePlayer::onDoMoreStuff() {
                    break;
                }
            } else {
                ALOGV("track %d buffer early by %lld us.", i, -lateByUs);
                ALOGV("track %d buffer early by %lld us.",
                      mStateByTrackIndex.keyAt(i), -lateByUs);
                break;
            }
        }
+1 −1
Original line number Diff line number Diff line
@@ -394,7 +394,7 @@ int main(int argc, char **argv) {
        player->setDataSource(argv[0]);
        player->setSurface(surface->getSurfaceTexture());
        player->start();
        sleep(10);
        sleep(60);
        player->stop();
        player->reset();