--- a/dom/media/ADTSDecoder.cpp
+++ b/dom/media/ADTSDecoder.cpp
@@ -20,17 +20,18 @@ ADTSDecoder::Clone(MediaDecoderInit& aIn
return nullptr;
return new ADTSDecoder(aInit);
}
MediaDecoderStateMachine*
ADTSDecoder::CreateStateMachine()
{
- mReader = new MediaFormatReader(this, new ADTSDemuxer(mResource));
+ MediaDecoderReaderInit init(this);
+ mReader = new MediaFormatReader(init, new ADTSDemuxer(mResource));
return new MediaDecoderStateMachine(this, mReader);
}
/* static */ bool
ADTSDecoder::IsEnabled()
{
RefPtr<PDMFactory> platform = new PDMFactory();
return platform->SupportsMimeType(NS_LITERAL_CSTRING("audio/mp4a-latm"),
--- a/dom/media/DecoderTraits.cpp
+++ b/dom/media/DecoderTraits.cpp
@@ -334,55 +334,56 @@ DecoderTraits::CreateDecoder(MediaDecode
{
MOZ_ASSERT(NS_IsMainThread());
return InstantiateDecoder(aInit, aDiagnostics);
}
/* static */
MediaDecoderReader*
DecoderTraits::CreateReader(const MediaContainerType& aType,
- AbstractMediaDecoder* aDecoder,
- MediaResource* aResource)
+ const MediaDecoderReaderInit& aInit)
{
MOZ_ASSERT(NS_IsMainThread());
MediaDecoderReader* decoderReader = nullptr;
- if (!aDecoder) {
+ if (!aInit.mDecoder) {
return decoderReader;
}
+ MediaResource* resource = aInit.mResource;
+
#ifdef MOZ_FMP4
if (MP4Decoder::IsSupportedType(aType,
/* DecoderDoctorDiagnostics* */ nullptr)) {
- decoderReader = new MediaFormatReader(aDecoder, new MP4Demuxer(aResource));
+ decoderReader = new MediaFormatReader(aInit, new MP4Demuxer(resource));
} else
#endif
if (MP3Decoder::IsSupportedType(aType)) {
- decoderReader = new MediaFormatReader(aDecoder, new MP3Demuxer(aResource));
+ decoderReader = new MediaFormatReader(aInit, new MP3Demuxer(resource));
} else
if (ADTSDecoder::IsSupportedType(aType)) {
- decoderReader = new MediaFormatReader(aDecoder, new ADTSDemuxer(aResource));
+ decoderReader = new MediaFormatReader(aInit, new ADTSDemuxer(resource));
} else
if (WaveDecoder::IsSupportedType(aType)) {
- decoderReader = new MediaFormatReader(aDecoder, new WAVDemuxer(aResource));
+ decoderReader = new MediaFormatReader(aInit, new WAVDemuxer(resource));
} else
if (FlacDecoder::IsSupportedType(aType)) {
- decoderReader = new MediaFormatReader(aDecoder, new FlacDemuxer(aResource));
+ decoderReader = new MediaFormatReader(aInit, new FlacDemuxer(resource));
} else
if (OggDecoder::IsSupportedType(aType)) {
- decoderReader = new MediaFormatReader(aDecoder, new OggDemuxer(aResource));
+ decoderReader = new MediaFormatReader(aInit, new OggDemuxer(resource));
} else
#ifdef MOZ_ANDROID_OMX
if (MediaDecoder::IsAndroidMediaPluginEnabled() &&
EnsureAndroidMediaPluginHost()->FindDecoder(aType, nullptr)) {
- decoderReader = new AndroidMediaReader(aDecoder, aType, aResource);
+ decoderReader = new AndroidMediaReader(aType, aInit);
} else
#endif
if (WebMDecoder::IsSupportedType(aType)) {
- decoderReader = new MediaFormatReader(aDecoder, new WebMDemuxer(aResource));
+ decoderReader = new MediaFormatReader(aInit, new WebMDemuxer(resource));
}
return decoderReader;
}
/* static */
bool DecoderTraits::IsSupportedInVideoDocument(const nsACString& aType)
{
--- a/dom/media/DecoderTraits.h
+++ b/dom/media/DecoderTraits.h
@@ -14,16 +14,17 @@ class nsACString;
namespace mozilla {
class AbstractMediaDecoder;
class ChannelMediaDecoder;
class DecoderDoctorDiagnostics;
class MediaContainerType;
struct MediaDecoderInit;
+struct MediaDecoderReaderInit;
class MediaDecoderOwner;
class MediaDecoderReader;
class MediaResource;
enum CanPlayStatus {
CANPLAY_NO,
CANPLAY_MAYBE,
CANPLAY_YES
@@ -46,18 +47,17 @@ public:
// were unable to create the decoder.
static already_AddRefed<ChannelMediaDecoder> CreateDecoder(
MediaDecoderInit& aInit,
DecoderDoctorDiagnostics* aDiagnostics);
// Create a reader for thew given MIME type aType. Returns null
// if we were unable to create the reader.
static MediaDecoderReader* CreateReader(const MediaContainerType& aType,
- AbstractMediaDecoder* aDecoder,
- MediaResource* aResource);
+ const MediaDecoderReaderInit& aInit);
// Returns true if MIME type aType is supported in video documents,
// or false otherwise. Not all platforms support all MIME types, and
// vice versa.
static bool IsSupportedInVideoDocument(const nsACString& aType);
// Convenience function that returns false if MOZ_FMP4 is not defined,
// otherwise defers to MP4Decoder::IsSupportedType().
--- a/dom/media/MediaDecoderReader.cpp
+++ b/dom/media/MediaDecoderReader.cpp
@@ -63,31 +63,30 @@ public:
const AudioData* audioData = static_cast<const AudioData*>(aObject);
mSize += audioData->SizeOfIncludingThis(MallocSizeOf);
return nullptr;
}
size_t mSize;
};
-MediaDecoderReader::MediaDecoderReader(AbstractMediaDecoder* aDecoder,
- MediaResource* aResource)
+MediaDecoderReader::MediaDecoderReader(const MediaDecoderReaderInit& aInit)
: mAudioCompactor(mAudioQueue)
- , mDecoder(aDecoder)
+ , mDecoder(aInit.mDecoder)
, mTaskQueue(new TaskQueue(
GetMediaThreadPool(MediaThreadType::PLAYBACK),
"MediaDecoderReader::mTaskQueue",
/* aSupportsTailDispatch = */ true))
, mWatchManager(this, mTaskQueue)
, mBuffered(mTaskQueue, TimeIntervals(), "MediaDecoderReader::mBuffered (Canonical)")
, mDuration(mTaskQueue, NullableTimeUnit(), "MediaDecoderReader::mDuration (Mirror)")
, mIgnoreAudioOutputFormat(false)
, mHitAudioDecodeError(false)
, mShutdown(false)
- , mResource(aResource)
+ , mResource(aInit.mResource)
{
MOZ_COUNT_CTOR(MediaDecoderReader);
MOZ_ASSERT(NS_IsMainThread());
}
nsresult
MediaDecoderReader::Init()
{
--- a/dom/media/MediaDecoderReader.h
+++ b/dom/media/MediaDecoderReader.h
@@ -21,16 +21,17 @@
#include "mozilla/MozPromise.h"
#include "nsAutoPtr.h"
namespace mozilla {
class CDMProxy;
class MediaDecoderReader;
class TaskQueue;
+class VideoFrameContainer;
struct WaitForDataRejectValue
{
enum Reason
{
SHUTDOWN,
CANCELED
};
@@ -56,16 +57,28 @@ struct SeekRejectValue
};
struct MetadataHolder
{
UniquePtr<MediaInfo> mInfo;
UniquePtr<MetadataTags> mTags;
};
+struct MOZ_STACK_CLASS MediaDecoderReaderInit
+{
+ AbstractMediaDecoder* const mDecoder;
+ MediaResource* mResource = nullptr;
+ VideoFrameContainer* mVideoFrameContainer = nullptr;
+
+ explicit MediaDecoderReaderInit(AbstractMediaDecoder* aDecoder)
+ : mDecoder(aDecoder)
+ {
+ }
+};
+
// Encapsulates the decoding and reading of media data. Reading can either
// synchronous and done on the calling "decode" thread, or asynchronous and
// performed on a background thread, with the result being returned by
// callback.
// Unless otherwise specified, methods and fields of this class can only
// be accessed on the decode task queue.
class MediaDecoderReader
{
@@ -92,18 +105,17 @@ public:
// for multiple WaitForData consumers, feel free to flip the exclusivity here.
using WaitForDataPromise =
MozPromise<MediaData::Type, WaitForDataRejectValue, IsExclusive>;
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDecoderReader)
// The caller must ensure that Shutdown() is called before aDecoder is
// destroyed.
- explicit MediaDecoderReader(AbstractMediaDecoder* aDecoder,
- MediaResource* aResource = nullptr);
+ explicit MediaDecoderReader(const MediaDecoderReaderInit& aInit);
// Initializes the reader, returns NS_OK on success, or NS_ERROR_FAILURE
// on failure.
nsresult Init();
// Called by MDSM in dormant state to release resources allocated by this
// reader. The reader can resume decoding by calling Seek() to a specific
// position.
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1089,43 +1089,42 @@ MediaFormatReader::DemuxerProxy::NotifyD
}
if (data->mVideoDemuxer) {
data->mVideoDemuxer->UpdateBuffered();
}
return NotifyDataArrivedPromise::CreateAndResolve(true, __func__);
});
}
-MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder,
- MediaDataDemuxer* aDemuxer,
- VideoFrameContainer* aVideoFrameContainer)
- : MediaDecoderReader(aDecoder)
+MediaFormatReader::MediaFormatReader(const MediaDecoderReaderInit& aInit,
+ MediaDataDemuxer* aDemuxer)
+ : MediaDecoderReader(aInit)
, mAudio(this, MediaData::AUDIO_DATA,
MediaPrefs::MaxAudioDecodeError())
, mVideo(this, MediaData::VIDEO_DATA,
MediaPrefs::MaxVideoDecodeError())
, mDemuxer(new DemuxerProxy(aDemuxer))
, mDemuxerInitDone(false)
, mPendingNotifyDataArrived(false)
, mLastReportedNumDecodedFrames(0)
, mPreviousDecodedKeyframeTime_us(sNoPreviousDecodedKeyframe)
, mInitDone(false)
, mTrackDemuxersMayBlock(false)
, mSeekScheduled(false)
- , mVideoFrameContainer(aVideoFrameContainer)
+ , mVideoFrameContainer(aInit.mVideoFrameContainer)
, mDecoderFactory(new DecoderFactory(this))
, mShutdownPromisePool(new ShutdownPromisePool())
{
MOZ_ASSERT(aDemuxer);
MOZ_COUNT_CTOR(MediaFormatReader);
- if (aDecoder && aDecoder->CompositorUpdatedEvent()) {
- mCompositorUpdatedListener =
- aDecoder->CompositorUpdatedEvent()->Connect(
- mTaskQueue, this, &MediaFormatReader::NotifyCompositorUpdated);
+ AbstractMediaDecoder* decoder = aInit.mDecoder;
+ if (decoder && decoder->CompositorUpdatedEvent()) {
+ mCompositorUpdatedListener = decoder->CompositorUpdatedEvent()->Connect(
+ mTaskQueue, this, &MediaFormatReader::NotifyCompositorUpdated);
}
mOnTrackWaitingForKeyListener = OnTrackWaitingForKey().Connect(
mTaskQueue, this, &MediaFormatReader::NotifyWaitingForKey);
}
MediaFormatReader::~MediaFormatReader()
{
MOZ_COUNT_DTOR(MediaFormatReader);
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -24,19 +24,17 @@ namespace mozilla {
class CDMProxy;
class MediaFormatReader final : public MediaDecoderReader
{
typedef TrackInfo::TrackType TrackType;
typedef MozPromise<bool, MediaResult, /* IsExclusive = */ true> NotifyDataArrivedPromise;
public:
- MediaFormatReader(AbstractMediaDecoder* aDecoder,
- MediaDataDemuxer* aDemuxer,
- VideoFrameContainer* aVideoFrameContainer = nullptr);
+ MediaFormatReader(const MediaDecoderReaderInit& aInit, MediaDataDemuxer* aDemuxer);
virtual ~MediaFormatReader();
size_t SizeOfVideoQueueInFrames() override;
size_t SizeOfAudioQueueInFrames() override;
RefPtr<VideoDataPromise>
RequestVideoData(const media::TimeUnit& aTimeThreshold) override;
--- a/dom/media/android/AndroidMediaDecoder.cpp
+++ b/dom/media/android/AndroidMediaDecoder.cpp
@@ -14,14 +14,16 @@ AndroidMediaDecoder::AndroidMediaDecoder
const MediaContainerType& aType)
: ChannelMediaDecoder(aInit)
, mType(aType)
{
}
MediaDecoderStateMachine* AndroidMediaDecoder::CreateStateMachine()
{
- mReader = new AndroidMediaReader(this, mType, mResource);
+ MediaDecoderReaderInit init(this);
+ init.mResource = mResource;
+ mReader = new AndroidMediaReader(mType, init);
return new MediaDecoderStateMachine(this, mReader);
}
} // namespace mozilla
--- a/dom/media/android/AndroidMediaReader.cpp
+++ b/dom/media/android/AndroidMediaReader.cpp
@@ -20,20 +20,19 @@
namespace mozilla {
using namespace mozilla::gfx;
using namespace mozilla::media;
typedef mozilla::layers::Image Image;
typedef mozilla::layers::PlanarYCbCrImage PlanarYCbCrImage;
-AndroidMediaReader::AndroidMediaReader(AbstractMediaDecoder *aDecoder,
- const MediaContainerType& aContainerType,
- MediaResource* aResource) :
- MediaDecoderReader(aDecoder, aResource),
+AndroidMediaReader::AndroidMediaReader(const MediaContainerType& aContainerType,
+ const MediaDecoderReaderInit& aInit) :
+ MediaDecoderReader(aInit),
mType(aContainerType),
mPlugin(nullptr),
mHasAudio(false),
mHasVideo(false),
mVideoSeekTimeUs(-1),
mAudioSeekTimeUs(-1)
{
}
--- a/dom/media/android/AndroidMediaReader.h
+++ b/dom/media/android/AndroidMediaReader.h
@@ -32,19 +32,18 @@ class AndroidMediaReader : public MediaD
nsIntRect mPicture;
nsIntSize mInitialFrame;
int64_t mVideoSeekTimeUs;
int64_t mAudioSeekTimeUs;
RefPtr<VideoData> mLastVideoFrame;
MozPromiseHolder<MediaDecoderReader::SeekPromise> mSeekPromise;
MozPromiseRequestHolder<MediaDecoderReader::VideoDataPromise> mSeekRequest;
public:
- AndroidMediaReader(AbstractMediaDecoder* aDecoder,
- const MediaContainerType& aContainerType,
- MediaResource* aResource);
+ AndroidMediaReader(const MediaContainerType& aContainerType,
+ const MediaDecoderReaderInit& aInit);
nsresult ResetDecode(TrackSet aTracks = TrackSet(TrackInfo::kAudioTrack,
TrackInfo::kVideoTrack)) override;
bool DecodeAudioData() override;
bool DecodeVideoFrame(bool& aKeyframeSkip,
const media::TimeUnit& aTimeThreshold) override;
--- a/dom/media/flac/FlacDecoder.cpp
+++ b/dom/media/flac/FlacDecoder.cpp
@@ -21,17 +21,18 @@ FlacDecoder::Clone(MediaDecoderInit& aIn
}
return new FlacDecoder(aInit);
}
MediaDecoderStateMachine*
FlacDecoder::CreateStateMachine()
{
- mReader = new MediaFormatReader(this, new FlacDemuxer(mResource));
+ MediaDecoderReaderInit init(this);
+ mReader = new MediaFormatReader(init, new FlacDemuxer(mResource));
return new MediaDecoderStateMachine(this, mReader);
}
/* static */ bool
FlacDecoder::IsEnabled()
{
#ifdef MOZ_FFVPX
return MediaPrefs::FlacEnabled();
--- a/dom/media/fmp4/MP4Decoder.cpp
+++ b/dom/media/fmp4/MP4Decoder.cpp
@@ -27,19 +27,19 @@ namespace mozilla {
MP4Decoder::MP4Decoder(MediaDecoderInit& aInit)
: ChannelMediaDecoder(aInit)
{
}
MediaDecoderStateMachine* MP4Decoder::CreateStateMachine()
{
- mReader = new MediaFormatReader(
- this, new MP4Demuxer(mResource), GetVideoFrameContainer());
-
+ MediaDecoderReaderInit init(this);
+ init.mVideoFrameContainer = GetVideoFrameContainer();
+ mReader = new MediaFormatReader(init, new MP4Demuxer(mResource));
return new MediaDecoderStateMachine(this, mReader);
}
static bool
IsWhitelistedH264Codec(const nsAString& aCodec)
{
int16_t profile = 0, level = 0;
--- a/dom/media/hls/HLSDecoder.cpp
+++ b/dom/media/hls/HLSDecoder.cpp
@@ -23,20 +23,20 @@ MediaDecoderStateMachine*
HLSDecoder::CreateStateMachine()
{
MOZ_ASSERT(NS_IsMainThread());
MediaResource* resource = GetResource();
MOZ_ASSERT(resource);
auto resourceWrapper = static_cast<HLSResource*>(resource)->GetResourceWrapper();
MOZ_ASSERT(resourceWrapper);
+ MediaDecoderReaderInit init(this);
+ init.mVideoFrameContainer = GetVideoFrameContainer();
mReader =
- new MediaFormatReader(this,
- new HLSDemuxer(resourceWrapper->GetPlayerId()),
- GetVideoFrameContainer());
+ new MediaFormatReader(init, new HLSDemuxer(resourceWrapper->GetPlayerId()));
return new MediaDecoderStateMachine(this, mReader);
}
ChannelMediaDecoder*
HLSDecoder::Clone(MediaDecoderInit& aInit)
{
MOZ_CRASH("Clone is not supported");
--- a/dom/media/mediasource/MediaSourceDecoder.cpp
+++ b/dom/media/mediasource/MediaSourceDecoder.cpp
@@ -34,17 +34,19 @@ MediaSourceDecoder::MediaSourceDecoder(M
mExplicitDuration.Set(Some(UnspecifiedNaN<double>()));
}
MediaDecoderStateMachine*
MediaSourceDecoder::CreateStateMachine()
{
MOZ_ASSERT(NS_IsMainThread());
mDemuxer = new MediaSourceDemuxer(AbstractMainThread());
- mReader = new MediaFormatReader(this, mDemuxer, GetVideoFrameContainer());
+ MediaDecoderReaderInit init(this);
+ init.mVideoFrameContainer = GetVideoFrameContainer();
+ mReader = new MediaFormatReader(init, mDemuxer);
return new MediaDecoderStateMachine(this, mReader);
}
nsresult
MediaSourceDecoder::Load(nsIPrincipal* aPrincipal)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(!GetStateMachine());
--- a/dom/media/mp3/MP3Decoder.cpp
+++ b/dom/media/mp3/MP3Decoder.cpp
@@ -21,17 +21,18 @@ MP3Decoder::Clone(MediaDecoderInit& aIni
if (!IsEnabled()) {
return nullptr;
}
return new MP3Decoder(aInit);
}
MediaDecoderStateMachine*
MP3Decoder::CreateStateMachine() {
- mReader = new MediaFormatReader(this, new MP3Demuxer(mResource));
+ MediaDecoderReaderInit init(this);
+ mReader = new MediaFormatReader(init, new MP3Demuxer(mResource));
return new MediaDecoderStateMachine(this, mReader);
}
/* static */
bool
MP3Decoder::IsEnabled() {
RefPtr<PDMFactory> platform = new PDMFactory();
return platform->SupportsMimeType(NS_LITERAL_CSTRING("audio/mpeg"),
--- a/dom/media/ogg/OggDecoder.cpp
+++ b/dom/media/ogg/OggDecoder.cpp
@@ -11,17 +11,19 @@
#include "OggDemuxer.h"
#include "OggDecoder.h"
namespace mozilla {
MediaDecoderStateMachine* OggDecoder::CreateStateMachine()
{
RefPtr<OggDemuxer> demuxer = new OggDemuxer(mResource);
- mReader = new MediaFormatReader(this, demuxer, GetVideoFrameContainer());
+ MediaDecoderReaderInit init(this);
+ init.mVideoFrameContainer = GetVideoFrameContainer();
+ mReader = new MediaFormatReader(init, demuxer);
demuxer->SetChainingEvents(&mReader->TimedMetadataProducer(),
&mReader->MediaNotSeekableProducer());
return new MediaDecoderStateMachine(this, mReader);
}
/* static */
bool
OggDecoder::IsSupportedType(const MediaContainerType& aContainerType)
--- a/dom/media/wave/WaveDecoder.cpp
+++ b/dom/media/wave/WaveDecoder.cpp
@@ -17,17 +17,18 @@ ChannelMediaDecoder*
WaveDecoder::Clone(MediaDecoderInit& aInit)
{
return new WaveDecoder(aInit);
}
MediaDecoderStateMachine*
WaveDecoder::CreateStateMachine()
{
- mReader = new MediaFormatReader(this, new WAVDemuxer(mResource));
+ MediaDecoderReaderInit init(this);
+ mReader = new MediaFormatReader(init, new WAVDemuxer(mResource));
return new MediaDecoderStateMachine(this, mReader);
}
/* static */ bool
WaveDecoder::IsSupportedType(const MediaContainerType& aContainerType)
{
if (!IsWaveEnabled()) {
return false;
--- a/dom/media/webaudio/MediaBufferDecoder.cpp
+++ b/dom/media/webaudio/MediaBufferDecoder.cpp
@@ -188,18 +188,19 @@ MediaDecodeTask::CreateReader()
MOZ_ASSERT(!mBufferDecoder);
mMainThread =
mDecodeJob.mContext->GetOwnerGlobal()->AbstractMainThreadFor(TaskCategory::Other);
mBufferDecoder = new BufferDecoder(resource, mMainThread);
// If you change this list to add support for new decoders, please consider
// updating HTMLMediaElement::CreateDecoder as well.
- mDecoderReader =
- DecoderTraits::CreateReader(mContainerType, mBufferDecoder, resource);
+ MediaDecoderReaderInit init(mBufferDecoder);
+ init.mResource = resource;
+ mDecoderReader = DecoderTraits::CreateReader(mContainerType, init);
if (!mDecoderReader) {
return false;
}
nsresult rv = mDecoderReader->Init();
if (NS_FAILED(rv)) {
return false;
--- a/dom/media/webm/WebMDecoder.cpp
+++ b/dom/media/webm/WebMDecoder.cpp
@@ -13,18 +13,19 @@
#include "WebMDemuxer.h"
#include "WebMDecoder.h"
#include "VideoUtils.h"
namespace mozilla {
MediaDecoderStateMachine* WebMDecoder::CreateStateMachine()
{
- mReader = new MediaFormatReader(
- this, new WebMDemuxer(mResource), GetVideoFrameContainer());
+ MediaDecoderReaderInit init(this);
+ init.mVideoFrameContainer = GetVideoFrameContainer();
+ mReader = new MediaFormatReader(init, new WebMDemuxer(mResource));
return new MediaDecoderStateMachine(this, mReader);
}
/* static */
bool
WebMDecoder::IsSupportedType(const MediaContainerType& aContainerType)
{
if (!Preferences::GetBool("media.webm.enabled")) {