Bug 1316211. P4 - remove CheckSlowDecoding() and friends since IsAsync() now always returns true.
MozReview-Commit-ID: 3dOa0aUQ0kM
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -87,28 +87,20 @@ using namespace mozilla::media;
// scale factors on a per-decoder basis. We want to make sure to avoid using these
// constants directly, so we put them in a namespace.
namespace detail {
// Resume a suspended video decoder to the current playback position plus this
// time premium for compensating the seeking delay.
static constexpr auto RESUME_VIDEO_PREMIUM = TimeUnit::FromMicroseconds(125000);
-// If audio queue has less than this much decoded audio, we won't risk
-// trying to decode the video, we'll skip decoding video up to the next
-// keyframe. We may increase this value for an individual decoder if we
-// encounter video frames which take a long time to decode.
-static constexpr auto LOW_AUDIO_THRESHOLD = TimeUnit::FromMicroseconds(300000);
-
static const int64_t AMPLE_AUDIO_USECS = 2000000;
// If more than this much decoded audio is queued, we'll hold off
-// decoding more audio. If we increase the low audio threshold (see
-// LOW_AUDIO_THRESHOLD above) we'll also increase this value to ensure it's not
-// less than the low audio threshold.
+// decoding more audio.
static constexpr auto AMPLE_AUDIO_THRESHOLD = TimeUnit::FromMicroseconds(AMPLE_AUDIO_USECS);
} // namespace detail
// If we have fewer than LOW_VIDEO_FRAMES decoded frames, and
// we're not "prerolling video", we'll skip the video up to the next keyframe
// which is at or after the current playback position.
static const uint32_t LOW_VIDEO_FRAMES = 2;
@@ -117,22 +109,16 @@ static const uint32_t LOW_VIDEO_FRAMES =
// If the last video frame's end time |mDecodedVideoEndTime| is more than
// |LOW_VIDEO_THRESHOLD*mPlaybackRate| after the current clock in
// Advanceframe(), the video decode is lagging, and we skip to next keyframe.
static constexpr auto LOW_VIDEO_THRESHOLD = TimeUnit::FromMicroseconds(60000);
// Arbitrary "frame duration" when playing only audio.
static const int AUDIO_DURATION_USECS = 40000;
-// If we increase our "low audio threshold" (see LOW_AUDIO_THRESHOLD above), we
-// use this as a factor in all our calculations. Increasing this will cause
-// us to be more likely to increase our low audio threshold, and to
-// increase it by more.
-static const int THRESHOLD_FACTOR = 2;
-
namespace detail {
// If we have less than this much buffered data available, we'll consider
// ourselves to be running low on buffered data. We determine how much
// buffered data we have remaining using the reader's GetBuffered()
// implementation.
static const int64_t LOW_BUFFER_THRESHOLD_USECS = 5000000;
@@ -726,17 +712,16 @@ public:
MaybeStopPrerolling();
}
void HandleVideoDecoded(VideoData* aVideo, TimeStamp aDecodeStart) override
{
mMaster->PushVideo(aVideo);
DispatchDecodeTasksIfNeeded();
MaybeStopPrerolling();
- CheckSlowDecoding(aDecodeStart);
}
void HandleAudioCanceled() override
{
mMaster->RequestAudioData();
}
void HandleVideoCanceled() override
@@ -810,47 +795,16 @@ public:
}
private:
void DispatchDecodeTasksIfNeeded();
void EnsureAudioDecodeTaskQueued();
void EnsureVideoDecodeTaskQueued();
void MaybeStartBuffering();
- void CheckSlowDecoding(TimeStamp aDecodeStart)
- {
- // For non async readers, if the requested video sample was slow to
- // arrive, increase the amount of audio we buffer to ensure that we
- // don't run out of audio. This is unnecessary for async readers,
- // since they decode audio and video on different threads so they
- // are unlikely to run out of decoded audio.
- if (Reader()->IsAsync()) {
- return;
- }
-
- TimeDuration decodeTime = TimeStamp::Now() - aDecodeStart;
- auto adjusted = TimeUnit::FromTimeDuration(decodeTime * THRESHOLD_FACTOR);
- if (adjusted > mMaster->mLowAudioThreshold
- && !mMaster->HasLowBufferedData())
- {
- mMaster->mLowAudioThreshold = std::min(
- adjusted, mMaster->mAmpleAudioThreshold);
-
- mMaster->mAmpleAudioThreshold = std::max(
- mMaster->mLowAudioThreshold * THRESHOLD_FACTOR,
- mMaster->mAmpleAudioThreshold);
-
- SLOG("Slow video decode, set "
- "mLowAudioThreshold=%" PRId64
- " mAmpleAudioThreshold=%" PRId64,
- mMaster->mLowAudioThreshold.ToMicroseconds(),
- mMaster->mAmpleAudioThreshold.ToMicroseconds());
- }
- }
-
// At the start of decoding we want to "preroll" the decode until we've
// got a few frames decoded before we consider whether decode is falling
// behind. Otherwise our "we're falling behind" logic will trigger
// unnecessarily if we start playing as soon as the first sample is
// decoded. These two fields store how many video frames and audio
// samples we must consume before are considered to be finished prerolling.
TimeUnit AudioPrerollThreshold() const
{
@@ -2766,17 +2720,16 @@ MediaDecoderStateMachine::MediaDecoderSt
"MDSM::mTaskQueue", /* aSupportsTailDispatch = */ true)),
mWatchManager(this, mTaskQueue),
mDispatchedStateMachine(false),
mDelayedScheduler(mTaskQueue),
mCurrentFrameID(0),
INIT_WATCHABLE(mObservedDuration, TimeUnit()),
mReader(new MediaDecoderReaderWrapper(mTaskQueue, aReader)),
mPlaybackRate(1.0),
- mLowAudioThreshold(detail::LOW_AUDIO_THRESHOLD),
mAmpleAudioThreshold(detail::AMPLE_AUDIO_THRESHOLD),
mAudioCaptured(false),
mMinimizePreroll(aDecoder->GetMinimizePreroll()),
mSentFirstFrameLoadedEvent(false),
mVideoDecodeSuspended(false),
mVideoDecodeSuspendTimer(mTaskQueue),
mOutputStreamManager(new OutputStreamManager()),
mResource(aDecoder->GetResource()),
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -571,31 +571,18 @@ private:
double mPlaybackRate;
// If we've got more than this number of decoded video frames waiting in
// the video queue, we will not decode any more video frames until some have
// been consumed by the play state machine thread.
// Must hold monitor.
uint32_t GetAmpleVideoFrames() const;
- // Low audio threshold. If we've decoded less than this much audio we
- // consider our audio decode "behind", and we may skip video decoding
- // in order to allow our audio decoding to catch up. We favour audio
- // decoding over video. We increase this threshold if we're slow to
- // decode video frames, in order to reduce the chance of audio underruns.
- // Note that we don't ever reset this threshold, it only ever grows as
- // we detect that the decode can't keep up with rendering.
- media::TimeUnit mLowAudioThreshold;
-
// Our "ample" audio threshold. Once we've this much audio decoded, we
- // pause decoding. If we increase mLowAudioThreshold, we'll also
- // increase this too appropriately (we don't want mLowAudioThreshold
- // to be greater than mAmpleAudioThreshold, else we'd stop decoding!).
- // Note that we don't ever reset this threshold, it only ever grows as
- // we detect that the decode can't keep up with rendering.
+ // pause decoding.
media::TimeUnit mAmpleAudioThreshold;
// Only one of a given pair of ({Audio,Video}DataPromise, WaitForDataPromise)
// should exist at any given moment.
using AudioDataPromise = MediaDecoderReader::AudioDataPromise;
using VideoDataPromise = MediaDecoderReader::VideoDataPromise;
using WaitForDataPromise = MediaDecoderReader::WaitForDataPromise;
MozPromiseRequestHolder<AudioDataPromise> mAudioDataRequest;