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

Commit 231406d5 authored by Wei Jia's avatar Wei Jia
Browse files

NuPlayerRenderer: return current real time as render time for video frame when paused.

This allows video to display immediately during seeking in paused state.
Also fix some racing condition.

Bug: 19153026
Change-Id: I0d7a8981ca3c121f5dbc430c2c6d8b7522edc24a
parent 64c496c8
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -424,7 +424,8 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {

            onDrainVideoQueue();

            postDrainVideoQueue();
            Mutex::Autolock autoLock(mLock);
            postDrainVideoQueue_l();
            break;
        }

@@ -437,7 +438,8 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
            }

            mDrainVideoQueuePending = false;
            postDrainVideoQueue();
            Mutex::Autolock autoLock(mLock);
            postDrainVideoQueue_l();
            break;
        }

@@ -766,7 +768,7 @@ int64_t NuPlayer::Renderer::getPendingAudioPlayoutDurationUs(int64_t nowUs) {

int64_t NuPlayer::Renderer::getRealTimeUs(int64_t mediaTimeUs, int64_t nowUs) {
    int64_t currentPositionUs;
    if (getCurrentPositionOnLooper(
    if (mPaused || getCurrentPositionOnLooper(
            &currentPositionUs, nowUs, true /* allowPastQueuedVideo */) != OK) {
        // If failed to get current position, e.g. due to audio clock is not ready, then just
        // play out video immediately without delay.
@@ -787,7 +789,7 @@ void NuPlayer::Renderer::onNewAudioMediaTime(int64_t mediaTimeUs) {
            mediaTimeUs, nowUs + getPendingAudioPlayoutDurationUs(nowUs), mNumFramesWritten);
}

void NuPlayer::Renderer::postDrainVideoQueue() {
void NuPlayer::Renderer::postDrainVideoQueue_l() {
    if (mDrainVideoQueuePending
            || mSyncQueues
            || (mPaused && mVideoSampleReceived)) {
@@ -823,6 +825,7 @@ void NuPlayer::Renderer::postDrainVideoQueue() {

        if (mAnchorTimeMediaUs < 0) {
            setAnchorTime(mediaTimeUs, nowUs);
            mPausePositionMediaTimeUs = mediaTimeUs;
            mAnchorMaxMediaUs = mediaTimeUs;
            realTimeUs = nowUs;
        } else {
@@ -986,16 +989,15 @@ void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) {
    entry.mFinalResult = OK;
    entry.mBufferOrdinal = ++mTotalBuffersQueued;

    if (audio) {
    Mutex::Autolock autoLock(mLock);
    if (audio) {
        mAudioQueue.push_back(entry);
        postDrainAudioQueue_l();
    } else {
        mVideoQueue.push_back(entry);
        postDrainVideoQueue();
        postDrainVideoQueue_l();
    }

    Mutex::Autolock autoLock(mLock);
    if (!mSyncQueues || mAudioQueue.empty() || mVideoQueue.empty()) {
        return;
    }
@@ -1044,7 +1046,7 @@ void NuPlayer::Renderer::syncQueuesDone_l() {
    }

    if (!mVideoQueue.empty()) {
        postDrainVideoQueue();
        postDrainVideoQueue_l();
    }
}

@@ -1063,8 +1065,8 @@ void NuPlayer::Renderer::onQueueEOS(const sp<AMessage> &msg) {
    entry.mOffset = 0;
    entry.mFinalResult = finalResult;

    if (audio) {
    Mutex::Autolock autoLock(mLock);
    if (audio) {
        if (mAudioQueue.empty() && mSyncQueues) {
            syncQueuesDone_l();
        }
@@ -1072,11 +1074,10 @@ void NuPlayer::Renderer::onQueueEOS(const sp<AMessage> &msg) {
        postDrainAudioQueue_l();
    } else {
        if (mVideoQueue.empty() && mSyncQueues) {
            Mutex::Autolock autoLock(mLock);
            syncQueuesDone_l();
        }
        mVideoQueue.push_back(entry);
        postDrainVideoQueue();
        postDrainVideoQueue_l();
    }
}

@@ -1229,18 +1230,20 @@ void NuPlayer::Renderer::onPause() {
        return;
    }
    int64_t currentPositionUs;
    int64_t pausePositionMediaTimeUs;
    if (getCurrentPositionFromAnchor(
            &currentPositionUs, ALooper::GetNowUs()) == OK) {
        mPausePositionMediaTimeUs = currentPositionUs;
        pausePositionMediaTimeUs = currentPositionUs;
    } else {
        // Set paused position to -1 (unavailabe) if we don't have anchor time
        // This could happen if client does a seekTo() immediately followed by
        // pause(). Renderer will be flushed with anchor time cleared. We don't
        // want to leave stale value in mPausePositionMediaTimeUs.
        mPausePositionMediaTimeUs = -1;
        pausePositionMediaTimeUs = -1;
    }
    {
        Mutex::Autolock autoLock(mLock);
        mPausePositionMediaTimeUs = pausePositionMediaTimeUs;
        ++mAudioQueueGeneration;
        ++mVideoQueueGeneration;
        prepareForMediaRenderingStart();
@@ -1284,7 +1287,7 @@ void NuPlayer::Renderer::onResume() {
    }

    if (!mVideoQueue.empty()) {
        postDrainVideoQueue();
        postDrainVideoQueue_l();
    }
}

+1 −1
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ private:
    int64_t getRealTimeUs(int64_t mediaTimeUs, int64_t nowUs);

    void onDrainVideoQueue();
    void postDrainVideoQueue();
    void postDrainVideoQueue_l();

    void prepareForMediaRenderingStart();
    void notifyIfMediaRenderingStarted();