already_AddRefed<MediaDataDecoder> EMEDecoderModule::CreateVideoDecoder(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); auto params = GMPVideoDecoderParams(aParams).WithCallback(wrapper); wrapper->SetProxyTarget(new EMEVideoDecoder(mProxy, params)); return wrapper.forget(); } MOZ_ASSERT(mPDM); RefPtr<MediaDataDecoder> decoder(mPDM->CreateDecoder(aParams)); if (!decoder) { return nullptr; } RefPtr<MediaDataDecoder> emeDecoder(new EMEDecryptor(decoder, aParams.mCallback, mProxy, AbstractThread::GetCurrent()->AsTaskQueue())); return emeDecoder.forget(); }
EMEVideoDecoder::EMEVideoDecoder(CDMProxy* aProxy, const GMPVideoDecoderParams& aParams) : GMPVideoDecoder(GMPVideoDecoderParams(aParams).WithAdapter( new EMEVideoCallbackAdapter(aParams.mCallback, VideoInfo(aParams.mConfig.mDisplay), aParams.mImageContainer))) , mProxy(aProxy) {}
already_AddRefed<MediaDataDecoder> GMPDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams) { if (!MP4Decoder::IsH264(aParams.mConfig.mMimeType) && !VPXDecoder::IsVP8(aParams.mConfig.mMimeType) && !VPXDecoder::IsVP9(aParams.mConfig.mMimeType)) { return nullptr; } 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); auto params = GMPVideoDecoderParams(aParams).WithCallback(wrapper); wrapper->SetProxyTarget(new GMPVideoDecoder(params)); return wrapper.forget(); }