Bug 1281632 - P6: Extract parameters to GMPAudioDecoder into struct. r=gerald
MozReview-Commit-ID: 7UXY5uEQUtj
--- a/dom/media/platforms/agnostic/eme/EMEAudioDecoder.cpp
+++ b/dom/media/platforms/agnostic/eme/EMEAudioDecoder.cpp
@@ -17,20 +17,19 @@ EMEAudioCallbackAdapter::Error(GMPErr aE
// happen if a key expires or a session is closed during playback.
NS_WARNING("GMP failed to decrypt due to lack of key");
return;
}
AudioCallbackAdapter::Error(aErr);
}
EMEAudioDecoder::EMEAudioDecoder(CDMProxy* aProxy,
- const AudioInfo& aConfig,
- TaskQueue* aTaskQueue,
- MediaDataDecoderCallbackProxy* aCallback)
- : GMPAudioDecoder(aConfig, aTaskQueue, aCallback, new EMEAudioCallbackAdapter(aCallback))
+ const GMPAudioDecoderParams& aParams)
+ : GMPAudioDecoder(GMPAudioDecoderParams(aParams).WithAdapter(
+ new EMEAudioCallbackAdapter(aParams.mCallback)))
, mProxy(aProxy)
{}
void
EMEAudioDecoder::InitTags(nsTArray<nsCString>& aTags)
{
aTags.AppendElement(NS_LITERAL_CSTRING("aac"));
aTags.AppendElement(NS_ConvertUTF16toUTF8(mProxy->KeySystem()));
--- a/dom/media/platforms/agnostic/eme/EMEAudioDecoder.h
+++ b/dom/media/platforms/agnostic/eme/EMEAudioDecoder.h
@@ -18,20 +18,17 @@ public:
: AudioCallbackAdapter(aCallback)
{}
void Error(GMPErr aErr) override;
};
class EMEAudioDecoder : public GMPAudioDecoder {
public:
- EMEAudioDecoder(CDMProxy* aProxy,
- const AudioInfo& aConfig,
- TaskQueue* aTaskQueue,
- MediaDataDecoderCallbackProxy* aCallback);
+ EMEAudioDecoder(CDMProxy* aProxy, const GMPAudioDecoderParams& aParams);
private:
void InitTags(nsTArray<nsCString>& aTags) override;
nsCString GetNodeId() override;
RefPtr<CDMProxy> mProxy;
};
--- a/dom/media/platforms/agnostic/eme/EMEDecoderModule.cpp
+++ b/dom/media/platforms/agnostic/eme/EMEDecoderModule.cpp
@@ -266,20 +266,18 @@ already_AddRefed<MediaDataDecoder>
EMEDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
{
MOZ_ASSERT(aParams.mConfig.mCrypto.mValid);
if (SupportsMimeType(aParams.mConfig.mMimeType, nullptr)) {
// GMP decodes. Assume that means it can decrypt too.
RefPtr<MediaDataDecoderProxy> wrapper =
CreateDecoderWrapper(aParams.mCallback, mProxy, aParams.mTaskQueue);
- wrapper->SetProxyTarget(new EMEAudioDecoder(mProxy,
- aParams.AudioConfig(),
- aParams.mTaskQueue,
- wrapper->Callback()));
+ auto gmpParams = GMPAudioDecoderParams(aParams).WithCallback(wrapper);
+ wrapper->SetProxyTarget(new EMEAudioDecoder(mProxy, gmpParams));
return wrapper.forget();
}
MOZ_ASSERT(mPDM);
RefPtr<MediaDataDecoder> decoder(mPDM->CreateDecoder(aParams));
if (!decoder) {
return nullptr;
}
--- a/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.cpp
+++ b/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.cpp
@@ -121,28 +121,52 @@ AudioCallbackAdapter::Error(GMPErr aErr)
void
AudioCallbackAdapter::Terminated()
{
NS_WARNING("AAC GMP decoder terminated.");
mCallback->Error(MediaDataDecoderError::FATAL_ERROR);
}
-GMPAudioDecoder::GMPAudioDecoder(const AudioInfo& aConfig,
- TaskQueue* aTaskQueue,
- MediaDataDecoderCallbackProxy* aCallback,
- AudioCallbackAdapter* aAdapter)
- : mConfig(aConfig)
- , mCallback(aCallback)
+GMPAudioDecoderParams::GMPAudioDecoderParams(const CreateDecoderParams& aParams)
+ : mConfig(aParams.AudioConfig())
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(nullptr)
+ , mAdapter(nullptr)
+{}
+
+GMPAudioDecoderParams&
+GMPAudioDecoderParams::WithCallback(MediaDataDecoderProxy* aWrapper)
+{
+ MOZ_ASSERT(aWrapper);
+ MOZ_ASSERT(!mCallback); // Should only be called once per instance.
+ mCallback = aWrapper->Callback();
+ mAdapter = nullptr;
+ return *this;
+}
+
+GMPAudioDecoderParams&
+GMPAudioDecoderParams::WithAdapter(AudioCallbackAdapter* aAdapter)
+{
+ MOZ_ASSERT(aAdapter);
+ MOZ_ASSERT(!mAdapter); // Should only be called once per instance.
+ mCallback = aAdapter->Callback();
+ mAdapter = aAdapter;
+ return *this;
+}
+
+GMPAudioDecoder::GMPAudioDecoder(const GMPAudioDecoderParams& aParams)
+ : mConfig(aParams.mConfig)
+ , mCallback(aParams.mCallback)
, mGMP(nullptr)
- , mAdapter(aAdapter)
+ , mAdapter(aParams.mAdapter)
{
- MOZ_ASSERT(!aAdapter || aCallback == aAdapter->Callback());
- if (!aAdapter) {
- mAdapter = new AudioCallbackAdapter(aCallback);
+ MOZ_ASSERT(!mAdapter || mCallback == mAdapter->Callback());
+ if (!mAdapter) {
+ mAdapter = new AudioCallbackAdapter(mCallback);
}
}
void
GMPAudioDecoder::InitTags(nsTArray<nsCString>& aTags)
{
aTags.AppendElement(NS_LITERAL_CSTRING("aac"));
const Maybe<nsCString> gmp(
--- a/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.h
+++ b/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.h
@@ -43,22 +43,30 @@ private:
MediaDataDecoderCallbackProxy* mCallback;
int64_t mLastStreamOffset;
int64_t mAudioFrameSum;
int64_t mAudioFrameOffset;
bool mMustRecaptureAudioPosition;
};
+struct GMPAudioDecoderParams {
+ explicit GMPAudioDecoderParams(const CreateDecoderParams& aParams);
+ GMPAudioDecoderParams& WithCallback(MediaDataDecoderProxy* aWrapper);
+ GMPAudioDecoderParams& WithAdapter(AudioCallbackAdapter* aAdapter);
+
+ const AudioInfo& mConfig;
+ TaskQueue* mTaskQueue;
+ MediaDataDecoderCallbackProxy* mCallback;
+ AudioCallbackAdapter* mAdapter;
+};
+
class GMPAudioDecoder : public MediaDataDecoder {
public:
- GMPAudioDecoder(const AudioInfo& aConfig,
- TaskQueue* aTaskQueue,
- MediaDataDecoderCallbackProxy* aCallback,
- AudioCallbackAdapter* aAdapter);
+ explicit GMPAudioDecoder(const GMPAudioDecoderParams& aParams);
RefPtr<InitPromise> Init() override;
nsresult Input(MediaRawData* aSample) override;
nsresult Flush() override;
nsresult Drain() override;
nsresult Shutdown() override;
const char* GetDescriptionName() const override
{
--- a/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp
+++ b/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp
@@ -75,20 +75,18 @@ GMPDecoderModule::CreateAudioDecoder(con
if (aParams.mDiagnostics) {
const Maybe<nsCString> preferredGMP = PreferredGMP(aParams.mConfig.mMimeType);
if (preferredGMP.isSome()) {
aParams.mDiagnostics->SetGMP(preferredGMP.value());
}
}
RefPtr<MediaDataDecoderProxy> wrapper = CreateDecoderWrapper(aParams.mCallback);
- wrapper->SetProxyTarget(new GMPAudioDecoder(aParams.AudioConfig(),
- aParams.mTaskQueue,
- wrapper->Callback(),
- nullptr));
+ auto params = GMPAudioDecoderParams(aParams).WithCallback(wrapper);
+ wrapper->SetProxyTarget(new GMPAudioDecoder(params));
return wrapper.forget();
}
PlatformDecoderModule::ConversionRequired
GMPDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
{
// GMPVideoCodecType::kGMPVideoCodecH264 specifies that encoded frames must be in AVCC format.
if (aConfig.IsVideo()) {