/* static */ already_AddRefed<PlatformDecoderModule> PlatformDecoderModule::CreateCDMWrapper(CDMProxy* aProxy, bool aHasAudio, bool aHasVideo) { bool cdmDecodesAudio; bool cdmDecodesVideo; { CDMCaps::AutoLock caps(aProxy->Capabilites()); cdmDecodesAudio = caps.CanDecryptAndDecodeAudio(); cdmDecodesVideo = caps.CanDecryptAndDecodeVideo(); } nsRefPtr<PlatformDecoderModule> pdm; if ((!cdmDecodesAudio && aHasAudio) || (!cdmDecodesVideo && aHasVideo)) { // The CDM itself can't decode. We need to wrap a PDM to decode the // decrypted output of the CDM. pdm = Create(); if (!pdm) { return nullptr; } } nsRefPtr<PlatformDecoderModule> emepdm( new AVCCDecoderModule(new EMEDecoderModule(aProxy, pdm, cdmDecodesAudio, cdmDecodesVideo))); return emepdm.forget(); }
/* static */ already_AddRefed<PlatformDecoderModule> PlatformDecoderModule::CreateCDMWrapper(CDMProxy* aProxy) { bool cdmDecodesAudio; bool cdmDecodesVideo; { CDMCaps::AutoLock caps(aProxy->Capabilites()); cdmDecodesAudio = caps.CanDecryptAndDecodeAudio(); cdmDecodesVideo = caps.CanDecryptAndDecodeVideo(); } // We always create a default PDM in order to decode // non-encrypted tracks. RefPtr<PlatformDecoderModule> pdm = Create(); if (!pdm) { return nullptr; } RefPtr<PlatformDecoderModule> emepdm( new EMEDecoderModule(aProxy, pdm, cdmDecodesAudio, cdmDecodesVideo)); return emepdm.forget(); }