Bug 1346120 part 3 - Use NullDecoderModule while suspending a video element's decoder; r?jwwang
MozReview-Commit-ID: L1CsDV5TW5R
--- a/dom/media/MediaDecoderReader.h
+++ b/dom/media/MediaDecoderReader.h
@@ -255,20 +255,20 @@ public:
return mOnTrackWaitingForKey;
}
MediaEventProducer<TrackInfo::TrackType>& OnTrackWaitingForKeyProducer()
{
return mOnTrackWaitingForKey;
}
- // Switch the video decoder to BlankDecoderModule. It might takes effective
+ // Switch the video decoder to NullDecoderModule. It might takes effective
// since a few samples later depends on how much demuxed samples are already
// queued in the original video decoder.
- virtual void SetVideoBlankDecode(bool aIsBlankDecode) { }
+ virtual void SetVideoNullDecode(bool aIsNullDecode) { }
protected:
virtual ~MediaDecoderReader();
// Recomputes mBuffered.
virtual void UpdateBuffered();
RefPtr<MediaDataPromise> DecodeToFirstVideoData();
--- a/dom/media/MediaDecoderReaderWrapper.cpp
+++ b/dom/media/MediaDecoderReaderWrapper.cpp
@@ -143,14 +143,14 @@ MediaDecoderReaderWrapper::OnMetadataRea
}
}
void
MediaDecoderReaderWrapper::SetVideoBlankDecode(bool aIsBlankDecode)
{
MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
nsCOMPtr<nsIRunnable> r =
- NewRunnableMethod<bool>(mReader, &MediaDecoderReader::SetVideoBlankDecode,
+ NewRunnableMethod<bool>(mReader, &MediaDecoderReader::SetVideoNullDecode,
aIsBlankDecode);
mReader->OwnerThread()->Dispatch(r.forget());
}
} // namespace mozilla
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -660,17 +660,17 @@ MediaFormatReader::DecoderFactory::DoCre
switch (aData.mTrack) {
case TrackInfo::kAudioTrack: {
aData.mDecoder = mOwner->mPlatform->CreateDecoder({
ownerData.mInfo
? *ownerData.mInfo->GetAsAudioInfo()
: *ownerData.mOriginalInfo->GetAsAudioInfo(),
ownerData.mTaskQueue,
mOwner->mCrashHelper,
- ownerData.mIsBlankDecode,
+ ownerData.mIsNullDecode,
&result,
TrackInfo::kAudioTrack,
&mOwner->OnTrackWaitingForKeyProducer()
});
break;
}
case TrackType::kVideoTrack: {
@@ -679,17 +679,17 @@ MediaFormatReader::DecoderFactory::DoCre
aData.mDecoder = mOwner->mPlatform->CreateDecoder({
ownerData.mInfo
? *ownerData.mInfo->GetAsVideoInfo()
: *ownerData.mOriginalInfo->GetAsVideoInfo(),
ownerData.mTaskQueue,
mOwner->mKnowsCompositor,
mOwner->GetImageContainer(),
mOwner->mCrashHelper,
- ownerData.mIsBlankDecode,
+ ownerData.mIsNullDecode,
&result,
TrackType::kVideoTrack,
&mOwner->OnTrackWaitingForKeyProducer()
});
break;
}
default:
@@ -3042,36 +3042,36 @@ MediaFormatReader::GetMozDebugReaderData
mVideo.mWaitingForData,
mVideo.mWaitingForKey,
mVideo.mLastStreamSourceID);
}
aString += result;
}
void
-MediaFormatReader::SetVideoBlankDecode(bool aIsBlankDecode)
+MediaFormatReader::SetVideoNullDecode(bool aIsNullDecode)
{
MOZ_ASSERT(OnTaskQueue());
- return SetBlankDecode(TrackType::kVideoTrack, aIsBlankDecode);
+ return SetNullDecode(TrackType::kVideoTrack, aIsNullDecode);
}
void
-MediaFormatReader::SetBlankDecode(TrackType aTrack, bool aIsBlankDecode)
+MediaFormatReader::SetNullDecode(TrackType aTrack, bool aIsNullDecode)
{
MOZ_ASSERT(OnTaskQueue());
auto& decoder = GetDecoderData(aTrack);
- if (decoder.mIsBlankDecode == aIsBlankDecode) {
+ if (decoder.mIsNullDecode == aIsNullDecode) {
return;
}
- LOG("%s, decoder.mIsBlankDecode = %d => aIsBlankDecode = %d",
- TrackTypeToStr(aTrack), decoder.mIsBlankDecode, aIsBlankDecode);
-
- decoder.mIsBlankDecode = aIsBlankDecode;
+ LOG("%s, decoder.mIsNullDecode = %d => aIsNullDecode = %d",
+ TrackTypeToStr(aTrack), decoder.mIsNullDecode, aIsNullDecode);
+
+ decoder.mIsNullDecode = aIsNullDecode;
ShutdownDecoder(aTrack);
}
void
MediaFormatReader::OnFirstDemuxCompleted(
TrackInfo::TrackType aType, RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples)
{
MOZ_ASSERT(OnTaskQueue());
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -73,17 +73,17 @@ public:
}
void SetCDMProxy(CDMProxy* aProxy) override;
// Returns a string describing the state of the decoder data.
// Used for debugging purposes.
void GetMozDebugReaderData(nsACString& aString);
- void SetVideoBlankDecode(bool aIsBlankDecode) override;
+ void SetVideoNullDecode(bool aIsNullDecode) override;
private:
nsresult InitInternal() override;
bool HasVideo() const { return mVideo.mTrackDemuxer; }
bool HasAudio() const { return mAudio.mTrackDemuxer; }
bool IsWaitingOnCDMResource();
@@ -199,17 +199,17 @@ private:
, mMaxConsecutiveError(aNumOfMaxError)
, mNumSamplesInput(0)
, mNumSamplesOutput(0)
, mNumSamplesOutputTotal(0)
, mNumSamplesSkippedTotal(0)
, mSizeOfQueue(0)
, mIsHardwareAccelerated(false)
, mLastStreamSourceID(UINT32_MAX)
- , mIsBlankDecode(false)
+ , mIsNullDecode(false)
{
}
MediaFormatReader* mOwner;
// Disambiguate Audio vs Video.
MediaData::Type mType;
RefPtr<MediaTrackDemuxer> mTrackDemuxer;
// TaskQueue on which decoder can choose to decode.
@@ -381,18 +381,18 @@ private:
uint32_t mLastStreamSourceID;
Maybe<uint32_t> mNextStreamSourceID;
media::TimeIntervals mTimeRanges;
Maybe<media::TimeUnit> mLastTimeRangesEnd;
// TrackInfo as first discovered during ReadMetadata.
UniquePtr<TrackInfo> mOriginalInfo;
RefPtr<TrackInfoSharedPtr> mInfo;
Maybe<media::TimeUnit> mFirstDemuxedSampleTime;
- // Use BlankDecoderModule or not.
- bool mIsBlankDecode;
+ // Use NullDecoderModule or not.
+ bool mIsNullDecode;
};
class DecoderDataWithPromise : public DecoderData
{
public:
DecoderDataWithPromise(MediaFormatReader* aOwner,
MediaData::Type aType,
@@ -526,17 +526,17 @@ private:
RefPtr<VideoFrameContainer> mVideoFrameContainer;
layers::ImageContainer* GetImageContainer();
RefPtr<CDMProxy> mCDMProxy;
RefPtr<GMPCrashHelper> mCrashHelper;
- void SetBlankDecode(TrackType aTrack, bool aIsBlankDecode);
+ void SetNullDecode(TrackType aTrack, bool aIsNullDecode);
class DecoderFactory;
UniquePtr<DecoderFactory> mDecoderFactory;
class ShutdownPromisePool;
UniquePtr<ShutdownPromisePool> mShutdownPromisePool;
MediaEventListener mCompositorUpdatedListener;
--- a/dom/media/platforms/PDMFactory.cpp
+++ b/dom/media/platforms/PDMFactory.cpp
@@ -48,16 +48,17 @@
#include "mp4_demuxer/H264.h"
#include <functional>
namespace mozilla {
extern already_AddRefed<PlatformDecoderModule> CreateAgnosticDecoderModule();
extern already_AddRefed<PlatformDecoderModule> CreateBlankDecoderModule();
+extern already_AddRefed<PlatformDecoderModule> CreateNullDecoderModule();
class PDMFactoryImpl final
{
public:
PDMFactoryImpl()
{
#ifdef XP_WIN
WMFDecoderModule::Init();
@@ -158,17 +159,17 @@ public:
private:
nsTArray<std::function<CheckResult()>> mCheckerList;
}; // SupportChecker
PDMFactory::PDMFactory()
{
EnsureInit();
CreatePDMs();
- CreateBlankPDM();
+ CreateNullPDM();
}
PDMFactory::~PDMFactory()
{
}
void
PDMFactory::EnsureInit() const
@@ -198,19 +199,19 @@ PDMFactory::EnsureInit() const
}
});
SyncRunnable::DispatchToThread(mainThread, runnable);
}
already_AddRefed<MediaDataDecoder>
PDMFactory::CreateDecoder(const CreateDecoderParams& aParams)
{
- if (aParams.mUseBlankDecoder) {
- MOZ_ASSERT(mBlankPDM);
- return CreateDecoderWithPDM(mBlankPDM, aParams);
+ if (aParams.mUseNullDecoder) {
+ MOZ_ASSERT(mNullPDM);
+ return CreateDecoderWithPDM(mNullPDM, aParams);
}
const TrackInfo& config = aParams.mConfig;
bool isEncrypted = mEMEPDM && config.mCrypto.mValid;
if (isEncrypted) {
return CreateDecoderWithPDM(mEMEPDM, aParams);
}
@@ -285,17 +286,17 @@ PDMFactory::CreateDecoderWithPDM(Platfor
if (!config.IsVideo()) {
*result = MediaResult(
NS_ERROR_DOM_MEDIA_FATAL_ERR,
RESULT_DETAIL("Decoder configuration error, expected audio or video."));
return nullptr;
}
- if (MP4Decoder::IsH264(config.mMimeType) && !aParams.mUseBlankDecoder) {
+ if (MP4Decoder::IsH264(config.mMimeType) && !aParams.mUseNullDecoder) {
RefPtr<H264Converter> h = new H264Converter(aPDM, aParams);
const nsresult rv = h->GetLastError();
if (NS_SUCCEEDED(rv) || rv == NS_ERROR_NOT_INITIALIZED) {
// The H264Converter either successfully created the wrapped decoder,
// or there wasn't enough AVCC data to do so. Otherwise, there was some
// problem, for example WMF DLLs were missing.
m = h.forget();
}
@@ -397,20 +398,20 @@ PDMFactory::CreatePDMs()
m = new GMPDecoderModule();
mGMPPDMFailedToStartup = !StartupPDM(m);
} else {
mGMPPDMFailedToStartup = false;
}
}
void
-PDMFactory::CreateBlankPDM()
+PDMFactory::CreateNullPDM()
{
- mBlankPDM = CreateBlankDecoderModule();
- MOZ_ASSERT(mBlankPDM && NS_SUCCEEDED(mBlankPDM->Startup()));
+ mNullPDM = CreateNullDecoderModule();
+ MOZ_ASSERT(mNullPDM && NS_SUCCEEDED(mNullPDM->Startup()));
}
bool
PDMFactory::StartupPDM(PlatformDecoderModule* aPDM)
{
if (aPDM && NS_SUCCEEDED(aPDM->Startup())) {
mCurrentPDMs.AppendElement(aPDM);
return true;
--- a/dom/media/platforms/PDMFactory.h
+++ b/dom/media/platforms/PDMFactory.h
@@ -48,31 +48,31 @@ public:
static constexpr int kYUV400 = 0;
static constexpr int kYUV420 = 1;
static constexpr int kYUV422 = 2;
static constexpr int kYUV444 = 3;
private:
virtual ~PDMFactory();
void CreatePDMs();
- void CreateBlankPDM();
+ void CreateNullPDM();
// Startup the provided PDM and add it to our list if successful.
bool StartupPDM(PlatformDecoderModule* aPDM);
// Returns the first PDM in our list supporting the mimetype.
already_AddRefed<PlatformDecoderModule>
GetDecoder(const TrackInfo& aTrackInfo,
DecoderDoctorDiagnostics* aDiagnostics) const;
already_AddRefed<MediaDataDecoder>
CreateDecoderWithPDM(PlatformDecoderModule* aPDM,
const CreateDecoderParams& aParams);
nsTArray<RefPtr<PlatformDecoderModule>> mCurrentPDMs;
RefPtr<PlatformDecoderModule> mEMEPDM;
- RefPtr<PlatformDecoderModule> mBlankPDM;
+ RefPtr<PlatformDecoderModule> mNullPDM;
bool mWMFFailedToLoad = false;
bool mFFmpegFailedToLoad = false;
bool mGMPPDMFailedToStartup = false;
void EnsureInit() const;
template<class T> friend class StaticAutoPtr;
static StaticAutoPtr<PDMFactoryImpl> sInstance;
--- a/dom/media/platforms/PlatformDecoderModule.h
+++ b/dom/media/platforms/PlatformDecoderModule.h
@@ -80,34 +80,34 @@ struct MOZ_STACK_CLASS CreateDecoderPara
const TrackInfo& mConfig;
TaskQueue* mTaskQueue = nullptr;
DecoderDoctorDiagnostics* mDiagnostics = nullptr;
layers::ImageContainer* mImageContainer = nullptr;
MediaResult* mError = nullptr;
RefPtr<layers::KnowsCompositor> mKnowsCompositor;
RefPtr<GMPCrashHelper> mCrashHelper;
- bool mUseBlankDecoder = false;
+ bool mUseNullDecoder = false;
TrackInfo::TrackType mType = TrackInfo::kUndefinedTrack;
MediaEventProducer<TrackInfo::TrackType>* mOnWaitingForKeyEvent = nullptr;
OptionSet mOptions = OptionSet(Option::Default);
private:
void Set(TaskQueue* aTaskQueue) { mTaskQueue = aTaskQueue; }
void Set(DecoderDoctorDiagnostics* aDiagnostics)
{
mDiagnostics = aDiagnostics;
}
void Set(layers::ImageContainer* aImageContainer)
{
mImageContainer = aImageContainer;
}
void Set(MediaResult* aError) { mError = aError; }
void Set(GMPCrashHelper* aCrashHelper) { mCrashHelper = aCrashHelper; }
- void Set(bool aUseBlankDecoder) { mUseBlankDecoder = aUseBlankDecoder; }
+ void Set(bool aUseNullDecoder) { mUseNullDecoder = aUseNullDecoder; }
void Set(OptionSet aOptions) { mOptions = aOptions; }
void Set(layers::KnowsCompositor* aKnowsCompositor)
{
mKnowsCompositor = aKnowsCompositor;
}
void Set(TrackInfo::TrackType aType)
{
mType = aType;