Bug 1371200. P2 - add more fields to MediaDecoderInit.
Now we can init some members in the constructor and remove the setters
that are called only once.
MozReview-Commit-ID: 2hkrIA6pFlh
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -2461,17 +2461,25 @@ nsresult HTMLMediaElement::LoadResource(
ReportLoadError("MediaLoadInvalidURI", params, ArrayLength(params));
return rv;
}
SetupSrcMediaStreamPlayback(stream);
return NS_OK;
}
if (mMediaSource) {
- MediaDecoderInit decoderInit(this);
+ MediaDecoderInit decoderInit(
+ this,
+ mAudioChannel,
+ mMuted ? 0.0 : mVolume,
+ mPreservesPitch,
+ mPlaybackRate,
+ mPreloadAction == HTMLMediaElement::PRELOAD_METADATA,
+ mHasSuspendTaint);
+
RefPtr<MediaSourceDecoder> decoder = new MediaSourceDecoder(decoderInit);
if (!mMediaSource->Attach(decoder)) {
// TODO: Handle failure: run "If the media data cannot be fetched at
// all, due to network errors, causing the user agent to give up
// trying to fetch the resource" section of resource fetch algorithm.
decoder->Shutdown();
return NS_ERROR_FAILURE;
}
@@ -4591,17 +4599,25 @@ nsresult HTMLMediaElement::InitializeDec
{
NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set");
NS_ASSERTION(mDecoder == nullptr, "Shouldn't have a decoder");
MediaResource* originalResource = aOriginal->GetResource();
if (!originalResource)
return NS_ERROR_FAILURE;
- MediaDecoderInit decoderInit(this);
+ MediaDecoderInit decoderInit(
+ this,
+ mAudioChannel,
+ mMuted ? 0.0 : mVolume,
+ mPreservesPitch,
+ mPlaybackRate,
+ mPreloadAction == HTMLMediaElement::PRELOAD_METADATA,
+ mHasSuspendTaint);
+
RefPtr<MediaDecoder> decoder = aOriginal->Clone(decoderInit);
if (!decoder)
return NS_ERROR_FAILURE;
LOG(LogLevel::Debug, ("%p Cloned decoder %p from %p", this, decoder.get(), aOriginal));
RefPtr<MediaResource> resource =
originalResource->CloneData(decoder->GetResourceCallback());
@@ -4621,17 +4637,25 @@ nsresult HTMLMediaElement::InitializeDec
NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set");
nsAutoCString mimeType;
aChannel->GetContentType(mimeType);
NS_ASSERTION(!mimeType.IsEmpty(), "We should have the Content-Type.");
DecoderDoctorDiagnostics diagnostics;
- MediaDecoderInit decoderInit(this);
+ MediaDecoderInit decoderInit(
+ this,
+ mAudioChannel,
+ mMuted ? 0.0 : mVolume,
+ mPreservesPitch,
+ mPlaybackRate,
+ mPreloadAction == HTMLMediaElement::PRELOAD_METADATA,
+ mHasSuspendTaint);
+
RefPtr<MediaDecoder> decoder =
DecoderTraits::CreateDecoder(mimeType, decoderInit, &diagnostics);
diagnostics.StoreFormatDiagnostics(OwnerDoc(),
NS_ConvertASCIItoUTF16(mimeType),
decoder != nullptr,
__func__);
if (!decoder) {
nsAutoString src;
@@ -4672,25 +4696,16 @@ nsresult HTMLMediaElement::FinishDecoder
// Set mDecoder now so if methods like GetCurrentSrc get called between
// here and Load(), they work.
SetDecoder(aDecoder);
// Tell the decoder about its MediaResource now so things like principals are
// available immediately.
mDecoder->SetResource(aStream);
- mDecoder->SetAudioChannel(mAudioChannel);
- mDecoder->SetVolume(mMuted ? 0.0 : mVolume);
- mDecoder->SetPreservesPitch(mPreservesPitch);
- mDecoder->SetPlaybackRate(mPlaybackRate);
- if (mPreloadAction == HTMLMediaElement::PRELOAD_METADATA) {
- mDecoder->SetMinimizePrerollUntilPlaybackStarts();
- }
- // Notify the decoder of suspend taint.
- mDecoder->SetSuspendTaint(mHasSuspendTaint);
// Notify the decoder of the initial activity status.
NotifyDecoderActivityChanges();
// Update decoder principal before we start decoding, since it
// can affect how we feed data to MediaStreams
NotifyDecoderPrincipalChanged();
nsresult rv = aDecoder->Load(aListener);
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -378,32 +378,34 @@ MediaDecoder::MediaDecoder(MediaDecoderI
, mCDMProxyPromise(mCDMProxyPromiseHolder.Ensure(__func__))
, mIgnoreProgressData(false)
, mInfiniteStream(false)
, mOwner(aInit.mOwner)
, mAbstractMainThread(aInit.mOwner->AbstractMainThread())
, mFrameStats(new FrameStatistics())
, mVideoFrameContainer(aInit.mOwner->GetVideoFrameContainer())
, mPinnedForSeek(false)
- , mMinimizePreroll(false)
+ , mAudioChannel(aInit.mAudioChannel)
+ , mMinimizePreroll(aInit.mMinimizePreroll)
, mFiredMetadataLoaded(false)
, mIsDocumentVisible(false)
, mElementVisibility(Visibility::UNTRACKED)
, mIsElementInTree(false)
, mForcedHidden(false)
- , mHasSuspendTaint(false)
+ , mHasSuspendTaint(aInit.mHasSuspendTaint)
+ , mPlaybackRate(aInit.mPlaybackRate)
, INIT_MIRROR(mStateMachineIsShutdown, true)
, INIT_MIRROR(mBuffered, TimeIntervals())
, INIT_MIRROR(mNextFrameStatus, MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE)
, INIT_MIRROR(mCurrentPosition, TimeUnit::Zero())
, INIT_MIRROR(mStateMachineDuration, NullableTimeUnit())
, INIT_MIRROR(mPlaybackPosition, 0)
, INIT_MIRROR(mIsAudioDataAudible, false)
- , INIT_CANONICAL(mVolume, 0.0)
- , INIT_CANONICAL(mPreservesPitch, true)
+ , INIT_CANONICAL(mVolume, aInit.mVolume)
+ , INIT_CANONICAL(mPreservesPitch, aInit.mPreservesPitch)
, INIT_CANONICAL(mExplicitDuration, Maybe<double>())
, INIT_CANONICAL(mPlayState, PLAY_STATE_LOADING)
, INIT_CANONICAL(mNextState, PLAY_STATE_PAUSED)
, INIT_CANONICAL(mLogicallySeeking, false)
, INIT_CANONICAL(mSameOriginMedia, false)
, INIT_CANONICAL(mMediaPrincipalHandle, PRINCIPAL_HANDLE_NONE)
, INIT_CANONICAL(mPlaybackBytesPerSecond, 0.0)
, INIT_CANONICAL(mPlaybackRateReliable, true)
@@ -411,17 +413,16 @@ MediaDecoder::MediaDecoder(MediaDecoderI
, mTelemetryReported(false)
, mIsMediaElement(!!mOwner->GetMediaElement())
, mElement(mOwner->GetMediaElement())
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(mAbstractMainThread);
MediaMemoryTracker::AddMediaDecoder(this);
- mAudioChannel = AudioChannelService::GetDefaultAudioChannel();
mResourceCallback->Connect(this);
//
// Initialize watchers.
//
// mDuration
mWatchManager.Watch(mStateMachineDuration, &MediaDecoder::DurationChanged);
--- a/dom/media/MediaDecoder.h
+++ b/dom/media/MediaDecoder.h
@@ -55,19 +55,37 @@ enum class Visibility : uint8_t;
// GetTickCount() and conflicts with MediaDecoder::GetCurrentTime implementation.
#ifdef GetCurrentTime
#undef GetCurrentTime
#endif
struct MediaDecoderInit
{
MediaDecoderOwner* const mOwner;
+ const dom::AudioChannel mAudioChannel;
+ const double mVolume;
+ const bool mPreservesPitch;
+ const double mPlaybackRate;
+ const bool mMinimizePreroll;
+ const bool mHasSuspendTaint;
- explicit MediaDecoderInit(MediaDecoderOwner* aOwner)
+ MediaDecoderInit(MediaDecoderOwner* aOwner,
+ dom::AudioChannel aAudioChannel,
+ double aVolume,
+ bool aPreservesPitch,
+ double aPlaybackRate,
+ bool aMinimizePreroll,
+ bool aHasSuspendTaint)
: mOwner(aOwner)
+ , mAudioChannel(aAudioChannel)
+ , mVolume(aVolume)
+ , mPreservesPitch(aPreservesPitch)
+ , mPlaybackRate(aPlaybackRate)
+ , mMinimizePreroll(aMinimizePreroll)
+ , mHasSuspendTaint(aHasSuspendTaint)
{
}
};
class MediaDecoder : public AbstractMediaDecoder
{
public:
// Used to register with MediaResource to receive notifications which will
@@ -723,16 +741,19 @@ protected:
MediaEventListener mFirstFrameLoadedListener;
MediaEventListener mOnPlaybackEvent;
MediaEventListener mOnPlaybackErrorEvent;
MediaEventListener mOnDecoderDoctorEvent;
MediaEventListener mOnMediaNotSeekable;
protected:
+ // PlaybackRate and pitch preservation status we should start at.
+ double mPlaybackRate;
+
// Whether the state machine is shut down.
Mirror<bool> mStateMachineIsShutdown;
// Buffered range, mirrored from the reader.
Mirror<media::TimeIntervals> mBuffered;
// NextFrameStatus, mirrored from the state machine.
Mirror<MediaDecoderOwner::NextFrameStatus> mNextFrameStatus;
@@ -750,19 +771,16 @@ protected:
Mirror<int64_t> mPlaybackPosition;
// Used to distinguish whether the audio is producing sound.
Mirror<bool> mIsAudioDataAudible;
// Volume of playback. 0.0 = muted. 1.0 = full volume.
Canonical<double> mVolume;
- // PlaybackRate and pitch preservation status we should start at.
- double mPlaybackRate = 1;
-
Canonical<bool> mPreservesPitch;
// Media duration set explicitly by JS. At present, this is only ever present
// for MSE.
Canonical<Maybe<double>> mExplicitDuration;
// Set to one of the valid play states.
// This can only be changed on the main thread while holding the decoder