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

Commit 326166eb authored by Arun Johnson's avatar Arun Johnson
Browse files

prepareInitialInputBuffer : retry buffers

During flush, if all input buffers are still with component,
We retry to get buffers to proceed.

Bug: 291241758
Bug: 296988490

Test: atest android.media.decoder.cts.AdaptivePlaybackTest
Test: atest android.media.cts.MediaCodecTest
Test: atest android.mediav2.cts.CodecDecoderTest
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ef235a9a63e1b20f7de24d900db5e834f24e1ddb)
Merged-In: I6326c4c8542844cf7edb4c22054cc16a596c0af2
Change-Id: I6326c4c8542844cf7edb4c22054cc16a596c0af2
parent 1ac56eac
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -2137,7 +2137,7 @@ void CCodec::signalResume() {
    }

    std::map<size_t, sp<MediaCodecBuffer>> clientInputBuffers;
    status_t err = mChannel->prepareInitialInputBuffers(&clientInputBuffers);
    status_t err = mChannel->prepareInitialInputBuffers(&clientInputBuffers, true);
    if (err != OK) {
        if (err == NO_MEMORY) {
            // NO_MEMORY happens here when all the buffers are still
@@ -2160,7 +2160,6 @@ void CCodec::signalResume() {
        const std::unique_ptr<Config> &config = *configLocked;
        return config->mBuffersBoundToCodec;
    }());

    {
        Mutexed<State>::Locked state(mState);
        if (state->get() != RESUMING) {
+21 −10
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@
#include <atomic>
#include <list>
#include <numeric>
#include <thread>
#include <chrono>

#include <C2AllocatorGralloc.h>
#include <C2PlatformSupport.h>
@@ -1614,13 +1616,14 @@ status_t CCodecBufferChannel::start(
}

status_t CCodecBufferChannel::prepareInitialInputBuffers(
        std::map<size_t, sp<MediaCodecBuffer>> *clientInputBuffers) {
        std::map<size_t, sp<MediaCodecBuffer>> *clientInputBuffers, bool retry) {
    if (mInputSurface) {
        return OK;
    }

    size_t numInputSlots = mInput.lock()->numSlots;

    int retryCount = 1;
    for (; clientInputBuffers->empty() && retryCount >= 0; retryCount--) {
        {
            Mutexed<Input>::Locked input(mInput);
            while (clientInputBuffers->size() < numInputSlots) {
@@ -1632,6 +1635,14 @@ status_t CCodecBufferChannel::prepareInitialInputBuffers(
                clientInputBuffers->emplace(index, buffer);
            }
        }
        if (!retry || (retryCount <= 0)) {
            break;
        }
        if (clientInputBuffers->empty()) {
            // wait: buffer may be in transit from component.
            std::this_thread::sleep_for(std::chrono::milliseconds(4));
        }
    }
    if (clientInputBuffers->empty()) {
        ALOGW("[%s] start: cannot allocate memory at all", mName);
        return NO_MEMORY;
+2 −1
Original line number Diff line number Diff line
@@ -140,7 +140,8 @@ public:
     *                                  initial input buffers.
     */
    status_t prepareInitialInputBuffers(
            std::map<size_t, sp<MediaCodecBuffer>> *clientInputBuffers);
            std::map<size_t, sp<MediaCodecBuffer>> *clientInputBuffers,
            bool retry = false);

    /**
     * Request initial input buffers as prepared in clientInputBuffers.