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

Commit 6fd72fbf authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "nuplayer: wait for sync point at renderer flush"

parents f540a8b1 ee8116b0
Loading
Loading
Loading
Loading
+25 −0
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@
#include <media/stagefright/Utils.h>
#include <media/stagefright/Utils.h>
#include <media/stagefright/VideoFrameScheduler.h>
#include <media/stagefright/VideoFrameScheduler.h>
#include <media/MediaCodecBuffer.h>
#include <media/MediaCodecBuffer.h>
#include <utils/SystemClock.h>


#include <inttypes.h>
#include <inttypes.h>


@@ -156,6 +157,7 @@ NuPlayer::Renderer::Renderer(
    CHECK(mediaClock != NULL);
    CHECK(mediaClock != NULL);
    mPlaybackRate = mPlaybackSettings.mSpeed;
    mPlaybackRate = mPlaybackSettings.mSpeed;
    mMediaClock->setPlaybackRate(mPlaybackRate);
    mMediaClock->setPlaybackRate(mPlaybackRate);
    (void)mSyncFlag.test_and_set();
}
}


NuPlayer::Renderer::~Renderer() {
NuPlayer::Renderer::~Renderer() {
@@ -326,9 +328,27 @@ void NuPlayer::Renderer::flush(bool audio, bool notifyComplete) {
        mSyncQueues = false;
        mSyncQueues = false;
    }
    }


    // Wait until the current job in the message queue is done, to make sure
    // buffer processing from the old generation is finished. After the current
    // job is finished, access to buffers are protected by generation.
    Mutex::Autolock syncLock(mSyncLock);
    int64_t syncCount = mSyncCount;
    mSyncFlag.clear();

    // Make sure message queue is not empty after mSyncFlag is cleared.
    sp<AMessage> msg = new AMessage(kWhatFlush, this);
    sp<AMessage> msg = new AMessage(kWhatFlush, this);
    msg->setInt32("audio", static_cast<int32_t>(audio));
    msg->setInt32("audio", static_cast<int32_t>(audio));
    msg->post();
    msg->post();

    int64_t uptimeMs = uptimeMillis();
    while (mSyncCount == syncCount) {
        (void)mSyncCondition.waitRelative(mSyncLock, ms2ns(1000));
        if (uptimeMillis() - uptimeMs > 1000) {
            ALOGW("flush(): no wake-up from sync point for 1s; stop waiting to "
                  "prevent being stuck indefinitely.");
            break;
        }
    }
}
}


void NuPlayer::Renderer::signalTimeDiscontinuity() {
void NuPlayer::Renderer::signalTimeDiscontinuity() {
@@ -781,6 +801,11 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
            TRESPASS();
            TRESPASS();
            break;
            break;
    }
    }
    if (!mSyncFlag.test_and_set()) {
        Mutex::Autolock syncLock(mSyncLock);
        ++mSyncCount;
        mSyncCondition.broadcast();
    }
}
}


void NuPlayer::Renderer::postDrainAudioQueue_l(int64_t delayUs) {
void NuPlayer::Renderer::postDrainAudioQueue_l(int64_t delayUs) {
+7 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,8 @@


#define NUPLAYER_RENDERER_H_
#define NUPLAYER_RENDERER_H_


#include <atomic>

#include <media/AudioResamplerPublic.h>
#include <media/AudioResamplerPublic.h>
#include <media/AVSyncSettings.h>
#include <media/AVSyncSettings.h>


@@ -220,6 +222,11 @@ private:


    sp<AWakeLock> mWakeLock;
    sp<AWakeLock> mWakeLock;


    std::atomic_flag mSyncFlag = ATOMIC_FLAG_INIT;
    Mutex mSyncLock;
    Condition mSyncCondition;
    int64_t mSyncCount{0};

    status_t getCurrentPositionOnLooper(int64_t *mediaUs);
    status_t getCurrentPositionOnLooper(int64_t *mediaUs);
    status_t getCurrentPositionOnLooper(
    status_t getCurrentPositionOnLooper(
            int64_t *mediaUs, int64_t nowUs, bool allowPastQueuedVideo = false);
            int64_t *mediaUs, int64_t nowUs, bool allowPastQueuedVideo = false);