Loading media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +25 −0 Original line number Original line Diff line number Diff line Loading @@ -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> Loading Loading @@ -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() { Loading Loading @@ -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() { Loading Loading @@ -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) { Loading media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h +7 −0 Original line number Original line Diff line number Diff line Loading @@ -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> Loading Loading @@ -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); Loading Loading
media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +25 −0 Original line number Original line Diff line number Diff line Loading @@ -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> Loading Loading @@ -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() { Loading Loading @@ -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() { Loading Loading @@ -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) { Loading
media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h +7 −0 Original line number Original line Diff line number Diff line Loading @@ -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> Loading Loading @@ -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); Loading