示例#1
0
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();
}