From d446cbd1e5135955e2fd2c4f2eb43b5747c16c68 Mon Sep 17 00:00:00 2001 From: Matthew Gregan Date: Tue, 22 Jul 2014 20:20:00 +1200 Subject: [PATCH] Bug 1041919 - Always use MP4Reader/PDM in MediaSourceDecoder. r=cpearce --- .../media/mediasource/MediaSourceDecoder.cpp | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/content/media/mediasource/MediaSourceDecoder.cpp b/content/media/mediasource/MediaSourceDecoder.cpp index 14958690cf4d..3abd0fb8f95a 100644 --- a/content/media/mediasource/MediaSourceDecoder.cpp +++ b/content/media/mediasource/MediaSourceDecoder.cpp @@ -24,6 +24,11 @@ #include "SourceBufferList.h" #include "VideoUtils.h" +#ifdef MOZ_FMP4 +#include "MP4Decoder.h" +#include "MP4Reader.h" +#endif + #ifdef PR_LOGGING extern PRLogModuleInfo* gMediaSourceLog; #define MSE_DEBUG(...) PR_LOG(gMediaSourceLog, PR_LOG_DEBUG, (__VA_ARGS__)) @@ -418,6 +423,23 @@ MediaSourceReader::InitializePendingDecoders() mDecoder->NotifyWaitingForResourcesStatusChanged(); } +MediaDecoderReader* +CreateReaderForType(const nsACString& aType, AbstractMediaDecoder* aDecoder) +{ +#ifdef MOZ_FMP4 + // The MP4Reader that supports fragmented MP4 and uses + // PlatformDecoderModules is hidden behind prefs for regular video + // elements, but we always want to use it for MSE, so instantiate it + // directly here. + if ((aType.LowerCaseEqualsLiteral("video/mp4") || + aType.LowerCaseEqualsLiteral("audio/mp4")) && + MP4Decoder::IsEnabled()) { + return new MP4Reader(aDecoder); + } +#endif + return DecoderTraits::CreateReader(aType, aDecoder); +} + already_AddRefed MediaSourceReader::CreateSubDecoder(const nsACString& aType, MediaSourceDecoder* aParentDecoder, @@ -426,7 +448,7 @@ MediaSourceReader::CreateSubDecoder(const nsACString& aType, // XXX: Why/when is mDecoder null here, since it should be equal to aParentDecoder?! nsRefPtr decoder = new SubBufferDecoder(new SourceBufferResource(nullptr, aType), aParentDecoder); - nsRefPtr reader(DecoderTraits::CreateReader(aType, decoder)); + nsRefPtr reader(CreateReaderForType(aType, decoder)); if (!reader) { return nullptr; }