Bug 1343437 - TBM::OnDemuxer{Init,Reset}Done forward non-NS_OK MediaResult to HTMLMediaElement::DecodeWarning - r?jya
Similarly to the MediaFormatReader, TrackBuffersManager can forward warnings
from the demuxer initialization to the associated HTMLMediaElement.
Note that errors (sent to OnDemuxerInitFailed) are currently *not* forwarded
to the HTMLMediaElement by design. In the future, we may want to add this
feature so that mediasource errors can also be reported to webcompat.
MozReview-Commit-ID: GjluZbpmC9q
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -849,24 +849,33 @@ TrackBuffersManager::ResetDemuxingState(
->Then(GetTaskQueue(), __func__,
this,
&TrackBuffersManager::OnDemuxerResetDone,
&TrackBuffersManager::OnDemuxerInitFailed)
->Track(mDemuxerInitRequest);
}
void
-TrackBuffersManager::OnDemuxerResetDone(nsresult)
+TrackBuffersManager::OnDemuxerResetDone(const MediaResult& aResult)
{
MOZ_ASSERT(OnTaskQueue());
mDemuxerInitRequest.Complete();
// mInputDemuxer shouldn't have been destroyed while a demuxer init/reset
// request was being processed. See bug 1239983.
MOZ_DIAGNOSTIC_ASSERT(mInputDemuxer);
+ if (aResult != NS_OK && mParentDecoder) {
+ RefPtr<TrackBuffersManager> self = this;
+ mAbstractMainThread->Dispatch(NS_NewRunnableFunction([self, aResult] () {
+ if (self->mParentDecoder && self->mParentDecoder->GetOwner()) {
+ self->mParentDecoder->GetOwner()->DecodeWarning(aResult);
+ }
+ }));
+ }
+
// Recreate track demuxers.
uint32_t numVideos = mInputDemuxer->GetNumberTracks(TrackInfo::kVideoTrack);
if (numVideos) {
// We currently only handle the first video track.
mVideoTracks.mDemuxer =
mInputDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
MOZ_ASSERT(mVideoTracks.mDemuxer);
}
@@ -935,17 +944,17 @@ TrackBuffersManager::InitializationSegme
->Then(GetTaskQueue(), __func__,
this,
&TrackBuffersManager::OnDemuxerInitDone,
&TrackBuffersManager::OnDemuxerInitFailed)
->Track(mDemuxerInitRequest);
}
void
-TrackBuffersManager::OnDemuxerInitDone(nsresult)
+TrackBuffersManager::OnDemuxerInitDone(const MediaResult& aResult)
{
MOZ_ASSERT(OnTaskQueue());
MOZ_DIAGNOSTIC_ASSERT(mInputDemuxer, "mInputDemuxer has been destroyed");
mDemuxerInitRequest.Complete();
MediaInfo info;
@@ -1127,16 +1136,25 @@ TrackBuffersManager::OnDemuxerInitDone(n
mCurrentInputBuffer->EvictAll();
mInputDemuxer->NotifyDataRemoved();
RecreateParser(true);
// 4. Set append state to WAITING_FOR_SEGMENT.
SetAppendState(AppendState::WAITING_FOR_SEGMENT);
// 5. Jump to the loop top step above.
ScheduleSegmentParserLoop();
+
+ if (aResult != NS_OK && mParentDecoder) {
+ RefPtr<TrackBuffersManager> self = this;
+ mAbstractMainThread->Dispatch(NS_NewRunnableFunction([self, aResult] () {
+ if (self->mParentDecoder && self->mParentDecoder->GetOwner()) {
+ self->mParentDecoder->GetOwner()->DecodeWarning(aResult);
+ }
+ }));
+ }
}
void
TrackBuffersManager::OnDemuxerInitFailed(const MediaResult& aError)
{
MOZ_ASSERT(aError != NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
mDemuxerInitRequest.Complete();
--- a/dom/media/mediasource/TrackBuffersManager.h
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -232,19 +232,19 @@ private:
// detected.
RefPtr<MediaByteBuffer> mPendingInputBuffer;
RefPtr<SourceBufferResource> mCurrentInputBuffer;
RefPtr<MediaDataDemuxer> mInputDemuxer;
// Length already processed in current media segment.
uint64_t mProcessedInput;
Maybe<media::TimeUnit> mLastParsedEndTime;
- void OnDemuxerInitDone(nsresult);
+ void OnDemuxerInitDone(const MediaResult& aResult);
void OnDemuxerInitFailed(const MediaResult& aFailure);
- void OnDemuxerResetDone(nsresult);
+ void OnDemuxerResetDone(const MediaResult& aResult);
MozPromiseRequestHolder<MediaDataDemuxer::InitPromise> mDemuxerInitRequest;
void OnDemuxFailed(TrackType aTrack, const MediaResult& aError);
void DoDemuxVideo();
void OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
void OnVideoDemuxFailed(const MediaResult& aError)
{
mVideoTracks.mDemuxRequest.Complete();