gecko-dev/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.h
Bryce Van Dyk 413ba3feef Bug 1487811 - P1: Update Widevine headers and C++ code to prepare for CDM interface 10 support. r=cpearce
Update content_decryption_module.h and other Widevine headers. This removes the
CDM8 interface and adds in the CDM10 and CDM11 interfaces. As such this patch
removes references to CDM8 from the code and adds some of the foundations for
supporting CDM10. Most of the CDM10 code will be implemented in another bug, but
there are a number of cases where it was straight forward to shuffle CDM8+9 code
-> CDM9+10, rather than deleting it and replacing it later.

Differential Revision: https://phabricator.services.mozilla.com/D5628

--HG--
extra : moz-landing-system : lando
2018-09-13 14:49:10 +00:00

111 lines
3.0 KiB
C++

/*
* Copyright 2015, Mozilla Foundation and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __ClearKeyDecryptionManager_h__
#define __ClearKeyDecryptionManager_h__
#include "ClearKeyUtils.h"
// This include is required in order for content_decryption_module to work
// on Unix systems.
#include "stddef.h"
#include "content_decryption_module.h"
#include "RefCounted.h"
#include <map>
class ClearKeyDecryptor;
class CryptoMetaData
{
public:
CryptoMetaData() {}
explicit CryptoMetaData(const cdm::InputBuffer_1* aInputBuffer)
{
Init(aInputBuffer);
}
void Init(const cdm::InputBuffer_1* aInputBuffer)
{
if (!aInputBuffer) {
assert(!IsValid());
return;
}
Assign(mKeyId, aInputBuffer->key_id, aInputBuffer->key_id_size);
Assign(mIV, aInputBuffer->iv, aInputBuffer->iv_size);
for (uint32_t i = 0; i < aInputBuffer->num_subsamples; ++i) {
const cdm::SubsampleEntry& subsample = aInputBuffer->subsamples[i];
mCipherBytes.push_back(subsample.cipher_bytes);
mClearBytes.push_back(subsample.clear_bytes);
}
}
bool IsValid() const {
return !mKeyId.empty() &&
!mIV.empty() &&
!mCipherBytes.empty() &&
!mClearBytes.empty();
}
size_t NumSubsamples() const {
assert(mClearBytes.size() == mCipherBytes.size());
return mClearBytes.size();
}
std::vector<uint8_t> mKeyId;
std::vector<uint8_t> mIV;
std::vector<uint32_t> mClearBytes;
std::vector<uint32_t> mCipherBytes;
};
class ClearKeyDecryptionManager : public RefCounted
{
private:
ClearKeyDecryptionManager();
~ClearKeyDecryptionManager();
static ClearKeyDecryptionManager* sInstance;
public:
static ClearKeyDecryptionManager* Get();
bool HasSeenKeyId(const KeyId& aKeyId) const;
bool HasKeyForKeyId(const KeyId& aKeyId) const;
const Key& GetDecryptionKey(const KeyId& aKeyId);
// Create a decryptor for the given KeyId if one does not already exist.
void InitKey(KeyId aKeyId, Key aKey);
void ExpectKeyId(KeyId aKeyId);
void ReleaseKeyId(KeyId aKeyId);
// Decrypts buffer *in place*.
cdm::Status Decrypt(uint8_t* aBuffer, uint32_t aBufferSize,
const CryptoMetaData& aMetadata);
cdm::Status Decrypt(std::vector<uint8_t>& aBuffer,
const CryptoMetaData& aMetadata);
private:
bool IsExpectingKeyForKeyId(const KeyId& aKeyId) const;
std::map<KeyId, ClearKeyDecryptor*> mDecryptors;
};
#endif // __ClearKeyDecryptionManager_h__