Bug 1401922 - P1. Ensure an error is returned when no decoder could be created. r?alwu
PDMFactory::CreateDecoder may not always modify CreateDecoderParams::mError as not all PDM handle this optional return value.
MozReview-Commit-ID: K8WFA0o778U
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -691,16 +691,17 @@ MediaFormatReader::DecoderFactory::RunSt
MOZ_ASSERT(!aData.mDecoder);
MOZ_ASSERT(!aData.mInitRequest.Exists());
MediaResult rv = DoCreateDecoder(aData);
if (NS_FAILED(rv)) {
NS_WARNING("Error constructing decoders");
aData.mToken = nullptr;
aData.mStage = Stage::None;
+ aData.mOwnerData.mDescription = rv.Description();
mOwner->NotifyError(aData.mTrack, rv);
return;
}
aData.mDecoder = new Wrapper(aData.mDecoder.forget(), aData.mToken.forget());
DoInitDecoder(aData);
aData.mStage = Stage::WaitForInit;
break;
@@ -722,17 +723,22 @@ MediaFormatReader::DecoderFactory::DoCre
if (!mOwner->mPlatform) {
mOwner->mPlatform = new PDMFactory();
if (mOwner->IsEncrypted()) {
MOZ_ASSERT(mOwner->mCDMProxy);
mOwner->mPlatform->SetCDMProxy(mOwner->mCDMProxy);
}
}
- MediaResult result(NS_OK);
+ // result may not be updated by PDMFactory::CreateDecoder, as such it must be
+ // initialized to a fatal error by default.
+ MediaResult result = MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ nsPrintfCString("error creating %s decoder", TrackTypeToStr(aData.mTrack)));
+
switch (aData.mTrack) {
case TrackInfo::kAudioTrack: {
aData.mDecoder = mOwner->mPlatform->CreateDecoder({
ownerData.mInfo
? *ownerData.mInfo->GetAsAudioInfo()
: *ownerData.mOriginalInfo->GetAsAudioInfo(),
ownerData.mTaskQueue,
mOwner->mCrashHelper,
@@ -765,19 +771,17 @@ MediaFormatReader::DecoderFactory::DoCre
default:
break;
}
if (aData.mDecoder) {
return NS_OK;
}
- if (NS_FAILED(result)) {
- ownerData.mDescription = result.Description();
- }
+ MOZ_RELEASE_ASSERT(NS_FAILED(result), "PDM returned an invalid error code");
return result;
}
void
MediaFormatReader::DecoderFactory::DoInitDecoder(Data& aData)
{
auto& ownerData = aData.mOwnerData;