void CDMProxy::gmp_Decrypted(uint32_t aId, GMPErr aResult, const nsTArray<uint8_t>& aDecryptedData) { MOZ_ASSERT(IsOnGMPThread()); for (size_t i = 0; i < mDecryptionJobs.Length(); i++) { DecryptJob* job = mDecryptionJobs[i]; if (job->mId == aId) { if (aDecryptedData.Length() != job->mSample->size) { NS_WARNING("CDM returned incorrect number of decrypted bytes"); } if (GMP_SUCCEEDED(aResult)) { PodCopy(job->mSample->data, aDecryptedData.Elements(), std::min<size_t>(aDecryptedData.Length(), job->mSample->size)); job->mClient->Decrypted(GMPNoErr, job->mSample.forget()); } 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. job->mClient->Decrypted(GMPNoKeyErr, job->mSample.forget()); } else { nsAutoCString str("CDM returned decode failure GMPErr="); str.AppendInt(aResult); NS_WARNING(str.get()); job->mClient->Decrypted(aResult, nullptr); } mDecryptionJobs.RemoveElementAt(i); return; } } NS_WARNING("GMPDecryptorChild returned incorrect job ID"); }
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__); }
void CDMProxy::gmp_Decrypted(uint32_t aId, GMPErr aResult, const nsTArray<uint8_t>& aDecryptedData) { MOZ_ASSERT(IsOnGMPThread()); for (size_t i = 0; i < mDecryptionJobs.Length(); i++) { DecryptJob* job = mDecryptionJobs[i]; if (job->mId == aId) { if (aDecryptedData.Length() != job->mSample->size) { NS_WARNING("CDM returned incorrect number of decrypted bytes"); } PodCopy(job->mSample->data, aDecryptedData.Elements(), std::min<size_t>(aDecryptedData.Length(), job->mSample->size)); nsresult rv = GMP_SUCCEEDED(aResult) ? NS_OK : NS_ERROR_FAILURE; job->mClient->Decrypted(rv, job->mSample.forget()); mDecryptionJobs.RemoveElementAt(i); return; } else { NS_WARNING("GMPDecryptorChild returned incorrect job ID"); } } }