Bug 1272422 - Part 3: Don't reset audio queue. r?jya
When resuming from suspended video, don't reset the audio queues or
audio demuxing state in MFR.
Extracted the code from ResetDemuxers() and inlined it at calling sites
as recommended by jya.
MozReview-Commit-ID: 3wpH075RrKW
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1293,48 +1293,37 @@ MediaFormatReader::ResetDecode(TargetQue
// Do the same for any data wait promises.
mAudio.mWaitingPromise.RejectIfExists(WaitForDataRejectValue(MediaData::AUDIO_DATA, WaitForDataRejectValue::CANCELED), __func__);
mVideo.mWaitingPromise.RejectIfExists(WaitForDataRejectValue(MediaData::VIDEO_DATA, WaitForDataRejectValue::CANCELED), __func__);
// Reset miscellaneous seeking state.
mPendingSeekTime.reset();
- ResetDemuxers();
-
if (HasVideo()) {
+ mVideo.ResetDemuxer();
+ mVideo.ResetState();
Reset(TrackInfo::kVideoTrack);
if (mVideo.HasPromise()) {
mVideo.RejectPromise(CANCELED, __func__);
}
}
if (HasAudio() && aQueues == AUDIO_VIDEO) {
+ mAudio.ResetDemuxer();
+ mAudio.ResetState();
Reset(TrackInfo::kAudioTrack);
if (mAudio.HasPromise()) {
mAudio.RejectPromise(CANCELED, __func__);
}
}
return MediaDecoderReader::ResetDecode(aQueues);
}
void
-MediaFormatReader::ResetDemuxers()
-{
- if (HasVideo()) {
- mVideo.ResetDemuxer();
- mVideo.ResetState();
- }
- if (HasAudio()) {
- mAudio.ResetDemuxer();
- mAudio.ResetState();
- }
-}
-
-void
MediaFormatReader::Output(TrackType aTrack, MediaData* aSample)
{
LOGV("Decoded %s sample time=%lld timecode=%lld kf=%d dur=%lld",
TrackTypeToStr(aTrack), aSample->mTime, aSample->mTimecode,
aSample->mKeyframe, aSample->mDuration);
if (!aSample) {
NS_WARNING("MediaFormatReader::Output() passed a null sample");
@@ -1527,17 +1516,30 @@ MediaFormatReader::AttemptSeek()
{
MOZ_ASSERT(OnTaskQueue());
mSeekScheduled = false;
if (mPendingSeekTime.isNothing()) {
return;
}
- ResetDemuxers();
+
+ if (HasVideo()) {
+ mVideo.ResetDemuxer();
+ mVideo.ResetState();
+ }
+
+ // Don't reset the audio demuxer not state when seeking video only
+ // as it will cause the audio to seek back to the beginning
+ // resulting in out-of-sync audio from video.
+ if (HasAudio() && !mOriginalSeekTarget->IsVideoOnly()) {
+ mAudio.ResetDemuxer();
+ mAudio.ResetState();
+ }
+
if (HasVideo()) {
DoVideoSeek();
} else if (HasAudio()) {
DoAudioSeek();
} else {
MOZ_CRASH();
}
}
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -169,17 +169,16 @@ private:
// functions.
void Output(TrackType aType, MediaData* aSample);
void InputExhausted(TrackType aTrack);
void Error(TrackType aTrack);
void Reset(TrackType aTrack);
void DrainComplete(TrackType aTrack);
bool ShouldSkip(bool aSkipToNextKeyframe, media::TimeUnit aTimeThreshold);
- void ResetDemuxers();
size_t SizeOfQueue(TrackType aTrack);
RefPtr<PDMFactory> mPlatform;
class DecoderCallback : public MediaDataDecoderCallback {
public:
DecoderCallback(MediaFormatReader* aReader, TrackType aType)