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

Commit 671e757d authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "nuplayer: ensure using video ts as anchor when really has no audio and...

Merge "nuplayer: ensure using video ts as anchor when really has no audio and clearAnchor must be followed by updateAnchor in video only case" am: ad28198c am: 9bca604e am: 5162739c

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/2363620



Change-Id: Id7d6179f41eb8e2983e2f4c4006d2bf331054086
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents bca89375 5162739c
Loading
Loading
Loading
Loading
+24 −3
Original line number Original line Diff line number Diff line
@@ -157,7 +157,8 @@ NuPlayer::Renderer::Renderer(
      mTotalBuffersQueued(0),
      mTotalBuffersQueued(0),
      mLastAudioBufferDrained(0),
      mLastAudioBufferDrained(0),
      mUseAudioCallback(false),
      mUseAudioCallback(false),
      mWakeLock(new AWakeLock()) {
      mWakeLock(new AWakeLock()),
      mNeedVideoClearAnchor(false) {
    CHECK(mediaClock != NULL);
    CHECK(mediaClock != NULL);
    mPlaybackRate = mPlaybackSettings.mSpeed;
    mPlaybackRate = mPlaybackSettings.mSpeed;
    mMediaClock->setPlaybackRate(mPlaybackRate);
    mMediaClock->setPlaybackRate(mPlaybackRate);
@@ -234,6 +235,10 @@ status_t NuPlayer::Renderer::onConfigPlayback(const AudioPlaybackRate &rate /* s
            return err;
            return err;
        }
        }
    }
    }

    if (!mHasAudio && mHasVideo) {
        mNeedVideoClearAnchor = true;
    }
    mPlaybackSettings = rate;
    mPlaybackSettings = rate;
    mPlaybackRate = rate.mSpeed;
    mPlaybackRate = rate.mSpeed;
    mMediaClock->setPlaybackRate(mPlaybackRate);
    mMediaClock->setPlaybackRate(mPlaybackRate);
@@ -327,7 +332,6 @@ void NuPlayer::Renderer::flush(bool audio, bool notifyComplete) {
            mNextVideoTimeMediaUs = -1;
            mNextVideoTimeMediaUs = -1;
        }
        }


        mMediaClock->clearAnchor();
        mVideoLateByUs = 0;
        mVideoLateByUs = 0;
        mSyncQueues = false;
        mSyncQueues = false;
    }
    }
@@ -1371,6 +1375,10 @@ void NuPlayer::Renderer::postDrainVideoQueue() {


    {
    {
        Mutex::Autolock autoLock(mLock);
        Mutex::Autolock autoLock(mLock);
        if (mNeedVideoClearAnchor && !mHasAudio) {
            mNeedVideoClearAnchor = false;
            clearAnchorTime();
        }
        if (mAnchorTimeMediaUs < 0) {
        if (mAnchorTimeMediaUs < 0) {
            mMediaClock->updateAnchor(mediaTimeUs, nowUs, mediaTimeUs);
            mMediaClock->updateAnchor(mediaTimeUs, nowUs, mediaTimeUs);
            mAnchorTimeMediaUs = mediaTimeUs;
            mAnchorTimeMediaUs = mediaTimeUs;
@@ -1525,6 +1533,8 @@ void NuPlayer::Renderer::notifyEOS_l(bool audio, status_t finalResult, int64_t d
                        mNextVideoTimeMediaUs + kDefaultVideoFrameIntervalUs);
                        mNextVideoTimeMediaUs + kDefaultVideoFrameIntervalUs);
            }
            }
        }
        }
    } else {
        mHasVideo = false;
    }
    }
}
}


@@ -1686,6 +1696,7 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) {
        } else {
        } else {
            notifyComplete = mNotifyCompleteVideo;
            notifyComplete = mNotifyCompleteVideo;
            mNotifyCompleteVideo = false;
            mNotifyCompleteVideo = false;
            mHasVideo = false;
        }
        }


        // If we're currently syncing the queues, i.e. dropping audio while
        // If we're currently syncing the queues, i.e. dropping audio while
@@ -1698,7 +1709,17 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) {
        // is flushed.
        // is flushed.
        syncQueuesDone_l();
        syncQueuesDone_l();
    }
    }

    if (audio && mDrainVideoQueuePending) {
        // Audio should not clear anchor(MediaClock) directly, because video
        // postDrainVideoQueue sets msg kWhatDrainVideoQueue into MediaClock
        // timer, clear anchor without update immediately may block msg posting.
        // So, postpone clear action to video to ensure anchor can be updated
        // immediately after clear
        mNeedVideoClearAnchor = true;
    } else {
        clearAnchorTime();
        clearAnchorTime();
    }


    ALOGV("flushing %s", audio ? "audio" : "video");
    ALOGV("flushing %s", audio ? "audio" : "video");
    if (audio) {
    if (audio) {
+3 −0
Original line number Original line Diff line number Diff line
@@ -332,6 +332,9 @@ private:
    int64_t getDurationUsIfPlayedAtSampleRate(uint32_t numFrames);
    int64_t getDurationUsIfPlayedAtSampleRate(uint32_t numFrames);


    DISALLOW_EVIL_CONSTRUCTORS(Renderer);
    DISALLOW_EVIL_CONSTRUCTORS(Renderer);

private:
    bool mNeedVideoClearAnchor;
};
};


} // namespace android
} // namespace android