Bug 1352319. P6 - let AudioEndTime/VideoEndTime return a TimeUnit.
MozReview-Commit-ID: 6yyVl2RDrPm
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1853,21 +1853,20 @@ public:
return;
}
// StopPlayback in order to reset the IsPlaying() state so audio
// is restarted correctly.
mMaster->StopPlayback();
if (!mSentPlaybackEndedEvent) {
- int64_t clockTime =
+ auto clockTime =
std::max(mMaster->AudioEndTime(), mMaster->VideoEndTime());
- clockTime = std::max(
- int64_t(0), std::max(clockTime, mMaster->Duration().ToMicroseconds()));
- mMaster->UpdatePlaybackPosition(clockTime);
+ clockTime = std::max(clockTime, mMaster->Duration());
+ mMaster->UpdatePlaybackPosition(clockTime.ToMicroseconds());
// Ensure readyState is updated before firing the 'ended' event.
mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE);
mMaster->mOnPlaybackEvent.Notify(MediaEventType::PlaybackEnded);
mSentPlaybackEndedEvent = true;
@@ -3514,27 +3513,28 @@ MediaDecoderStateMachine::UpdatePlayback
if (!IsPlaying()) {
return;
}
// Cap the current time to the larger of the audio and video end time.
// This ensures that if we're running off the system clock, we don't
// advance the clock to after the media end time.
- if (VideoEndTime() > 0 || AudioEndTime() > 0) {
+ if (VideoEndTime() > TimeUnit::Zero() || AudioEndTime() > TimeUnit::Zero()) {
const int64_t clockTime = GetClock();
// Skip frames up to the frame at the playback position, and figure out
// the time remaining until it's time to display the next frame and drop
// the current frame.
NS_ASSERTION(clockTime >= 0, "Should have positive clock time.");
// These will be non -1 if we've displayed a video frame, or played an audio
// frame.
- int64_t t = std::min(clockTime, std::max(VideoEndTime(), AudioEndTime()));
+ auto maxEndTime = std::max(VideoEndTime(), AudioEndTime());
+ int64_t t = std::min(clockTime, maxEndTime.ToMicroseconds());
// FIXME: Bug 1091422 - chained ogg files hit this assertion.
//MOZ_ASSERT(t >= GetMediaTime());
if (t > GetMediaTime()) {
UpdatePlaybackPosition(t);
}
}
// Note we have to update playback position before releasing the monitor.
// Otherwise, MediaDecoder::AddOutputStream could kick in when we are outside
@@ -3666,34 +3666,34 @@ void MediaDecoderStateMachine::Preserves
bool
MediaDecoderStateMachine::IsShutdown() const
{
MOZ_ASSERT(OnTaskQueue());
return mIsShutdown;
}
-int64_t
+TimeUnit
MediaDecoderStateMachine::AudioEndTime() const
{
MOZ_ASSERT(OnTaskQueue());
if (mMediaSink->IsStarted()) {
- return mMediaSink->GetEndTime(TrackInfo::kAudioTrack).ToMicroseconds();
+ return mMediaSink->GetEndTime(TrackInfo::kAudioTrack);
}
- return 0;
+ return TimeUnit::Zero();
}
-int64_t
+TimeUnit
MediaDecoderStateMachine::VideoEndTime() const
{
MOZ_ASSERT(OnTaskQueue());
if (mMediaSink->IsStarted()) {
- return mMediaSink->GetEndTime(TrackInfo::kVideoTrack).ToMicroseconds();
+ return mMediaSink->GetEndTime(TrackInfo::kVideoTrack);
}
- return 0;
+ return TimeUnit::Zero();
}
void
MediaDecoderStateMachine::OnMediaSinkVideoComplete()
{
MOZ_ASSERT(OnTaskQueue());
MOZ_ASSERT(HasVideo());
LOG("[%s]", __func__);
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -548,21 +548,21 @@ private:
// The media sink resource. Used on the state machine thread.
RefPtr<media::MediaSink> mMediaSink;
const RefPtr<MediaDecoderReaderWrapper> mReader;
// The end time of the last audio frame that's been pushed onto the media sink
// in microseconds. This will approximately be the end time
// of the audio stream, unless another frame is pushed to the hardware.
- int64_t AudioEndTime() const;
+ media::TimeUnit AudioEndTime() const;
// The end time of the last rendered video frame that's been sent to
// compositor.
- int64_t VideoEndTime() const;
+ media::TimeUnit VideoEndTime() const;
// The end time of the last decoded audio frame. This signifies the end of
// decoded audio data. Used to check if we are low in decoded data.
int64_t mDecodedAudioEndTime;
// The end time of the last decoded video frame. Used to check if we are low
// on decoded video data.
int64_t mDecodedVideoEndTime;