RefPtr<DecryptPromise> ChromiumCDMProxy::Decrypt(MediaRawData* aSample) { RefPtr<gmp::ChromiumCDMParent> cdm = GetCDMParent(); if (!cdm) { return DecryptPromise::CreateAndReject(DecryptResult(eme::AbortedErr, aSample), __func__); } RefPtr<MediaRawData> sample = aSample; return InvokeAsync( mGMPThread, __func__, [cdm, sample]() { return cdm->Decrypt(sample); }); }
void CDMProxy::DecryptJob::PostResult(GMPErr aResult, const nsTArray<uint8_t>& aDecryptedData) { if (aDecryptedData.Length() != mSample->Size()) { NS_WARNING("CDM returned incorrect number of decrypted bytes"); } if (GMP_SUCCEEDED(aResult)) { nsAutoPtr<MediaRawDataWriter> writer(mSample->CreateWriter()); PodCopy(writer->Data(), aDecryptedData.Elements(), std::min<size_t>(aDecryptedData.Length(), mSample->Size())); } else if (aResult == GMPNoKeyErr) { NS_WARNING("CDM returned GMPNoKeyErr"); // We still have the encrypted sample, so we can re-enqueue it to be // decrypted again once the key is usable again. } else { nsAutoCString str("CDM returned decode failure GMPErr="); str.AppendInt(aResult); NS_WARNING(str.get()); } mPromise.Resolve(DecryptResult(aResult, mSample), __func__); }