Bug 1299072: P19. Pass errors when we failed to create a decoder. r?gerald
MozReview-Commit-ID: 7eMfaCQiH5r
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -377,38 +377,36 @@ MediaFormatReader::OnDemuxerInitDone(nsr
void
MediaFormatReader::OnDemuxerInitFailed(const MediaResult& aError)
{
mDemuxerInitRequest.Complete();
mMetadataPromise.Reject(aError, __func__);
}
-bool
+MediaResult
MediaFormatReader::EnsureDecoderCreated(TrackType aTrack)
{
MOZ_ASSERT(OnTaskQueue());
MOZ_DIAGNOSTIC_ASSERT(!IsSuspended());
auto& decoder = GetDecoderData(aTrack);
if (decoder.mDecoder) {
- return true;
+ return NS_OK;
}
if (!mPlatform) {
mPlatform = new PDMFactory();
- NS_ENSURE_TRUE(mPlatform, false);
if (IsEncrypted()) {
#ifdef MOZ_EME
MOZ_ASSERT(mCDMProxy);
mPlatform->SetCDMProxy(mCDMProxy);
#else
- // EME not supported.
- return false;
+ return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "EME not supported");
#endif
}
}
decoder.mDecoderInitialized = false;
MonitorAutoLock mon(decoder.mMonitor);
@@ -438,20 +436,20 @@ MediaFormatReader::EnsureDecoderCreated(
});
break;
}
default:
break;
}
if (decoder.mDecoder ) {
decoder.mDescription = decoder.mDecoder->GetDescriptionName();
- } else {
- decoder.mDescription = "error creating decoder";
+ return NS_OK;
}
- return decoder.mDecoder != nullptr;
+ decoder.mDescription = "error creating decoder";
+ return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "error creating decoder");
}
bool
MediaFormatReader::EnsureDecoderInitialized(TrackType aTrack)
{
MOZ_ASSERT(OnTaskQueue());
MOZ_DIAGNOSTIC_ASSERT(!IsSuspended());
@@ -929,19 +927,20 @@ MediaFormatReader::HandleDemuxedSamples(
}
auto& decoder = GetDecoderData(aTrack);
if (decoder.mQueuedSamples.IsEmpty()) {
return;
}
- if (!EnsureDecoderCreated(aTrack)) {
+ MediaResult rv = EnsureDecoderCreated(aTrack);
+ if (NS_FAILED(rv)) {
NS_WARNING("Error constructing decoders");
- NotifyError(aTrack);
+ NotifyError(aTrack, rv);
return;
}
if (!EnsureDecoderInitialized(aTrack)) {
return;
}
if (!ForceZeroStartTime() && decoder.mFirstDemuxedSampleTime.isNothing()) {
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -112,17 +112,17 @@ private:
bool InitDemuxer();
// Notify the demuxer that new data has been received.
// The next queued task calling GetBuffered() is guaranteed to have up to date
// buffered ranges.
void NotifyDemuxer();
void ReturnOutput(MediaData* aData, TrackType aTrack);
- bool EnsureDecoderCreated(TrackType aTrack);
+ MediaResult EnsureDecoderCreated(TrackType aTrack);
bool EnsureDecoderInitialized(TrackType aTrack);
// Enqueues a task to call Update(aTrack) on the decoder task queue.
// Lock for corresponding track must be held.
void ScheduleUpdate(TrackType aTrack);
void Update(TrackType aTrack);
// Handle actions should more data be received.
// Returns true if no more action is required.
@@ -161,18 +161,17 @@ private:
// the first sample past the target will be dropped.
void InternalSeek(TrackType aTrack, const InternalSeekTarget& aTarget);
// Drain the current decoder.
void DrainDecoder(TrackType aTrack);
void NotifyNewOutput(TrackType aTrack, MediaData* aSample);
void NotifyInputExhausted(TrackType aTrack);
void NotifyDrainComplete(TrackType aTrack);
- void NotifyError(TrackType aTrack,
- const MediaResult& aError = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR));
+ void NotifyError(TrackType aTrack, const MediaResult& aError);
void NotifyWaitingForData(TrackType aTrack);
void NotifyEndOfStream(TrackType aTrack);
void ExtractCryptoInitData(nsTArray<uint8_t>& aInitData);
// Initializes mLayersBackendType if possible.
void InitLayersBackendType();