Bug 1341497 - Move WidevineBuffer and WidevineDecryptedBlock into WidevineUtils. r=gerald

This makes it easier to reuse in the ChromiumCDM code.

Also add an ExtractBuffer() method, which allows us to Move() the contained nsTArray
out without needing to copy the data.

MozReview-Commit-ID: 9suJSfXTVYy

--HG--
extra : rebase_source : 6eec99eb5329f3b8c3bb14d22459fee3bd95caf5
This commit is contained in:
Chris Pearce 2017-02-22 15:55:38 +13:00
Родитель 28ba840815
Коммит 83077824b8
4 изменённых файлов: 130 добавлений и 60 удалений

Просмотреть файл

@ -9,7 +9,6 @@
#include "WidevineUtils.h"
#include "WidevineFileIO.h"
#include "GMPPlatform.h"
#include <mozilla/SizePrintfMacros.h>
#include <stdarg.h>
#include "TimeUnits.h"
@ -161,43 +160,6 @@ WidevineDecryptor::SetServerCertificate(uint32_t aPromiseId,
CDM()->SetServerCertificate(aPromiseId, aServerCert, aServerCertSize);
}
class WidevineDecryptedBlock : public cdm::DecryptedBlock {
public:
WidevineDecryptedBlock()
: mBuffer(nullptr)
, mTimestamp(0)
{
}
~WidevineDecryptedBlock() override {
if (mBuffer) {
mBuffer->Destroy();
mBuffer = nullptr;
}
}
void SetDecryptedBuffer(cdm::Buffer* aBuffer) override {
mBuffer = aBuffer;
}
cdm::Buffer* DecryptedBuffer() override {
return mBuffer;
}
void SetTimestamp(int64_t aTimestamp) override {
mTimestamp = aTimestamp;
}
int64_t Timestamp() const override {
return mTimestamp;
}
private:
cdm::Buffer* mBuffer;
int64_t mTimestamp;
};
cdm::Time
WidevineDecryptor::ThrottleDecrypt(cdm::Time aWallTime, cdm::Time aSampleDuration)
{
@ -327,28 +289,6 @@ WidevineDecryptor::DecryptingComplete()
Release();
}
class WidevineBuffer : public cdm::Buffer {
public:
explicit WidevineBuffer(size_t aSize) {
CDM_LOG("WidevineBuffer(size=%" PRIuSIZE ") created", aSize);
mBuffer.SetLength(aSize);
}
~WidevineBuffer() override {
CDM_LOG("WidevineBuffer(size=%" PRIu32 ") destroyed", Size());
}
void Destroy() override { delete this; }
uint32_t Capacity() const override { return mBuffer.Length(); };
uint8_t* Data() override { return mBuffer.Elements(); }
void SetSize(uint32_t aSize) override { mBuffer.SetLength(aSize); }
uint32_t Size() const override { return mBuffer.Length(); }
private:
WidevineBuffer(const WidevineBuffer&);
void operator=(const WidevineBuffer&);
nsTArray<uint8_t> mBuffer;
};
Buffer*
WidevineDecryptor::Allocate(uint32_t aCapacity)
{

Просмотреть файл

@ -5,10 +5,12 @@
#include "WidevineUtils.h"
#include "WidevineDecryptor.h"
#include <mozilla/SizePrintfMacros.h>
#include "gmp-api/gmp-errors.h"
#include <stdarg.h>
#include <stdio.h>
#include <inttypes.h>
namespace mozilla {
@ -76,4 +78,90 @@ CDMWrapper::~CDMWrapper()
mCDM = nullptr;
}
WidevineBuffer::WidevineBuffer(size_t aSize)
{
CDM_LOG("WidevineBuffer(size=%" PRIuSIZE ") created", aSize);
mBuffer.SetLength(aSize);
}
WidevineBuffer::~WidevineBuffer()
{
CDM_LOG("WidevineBuffer(size=%" PRIu32 ") destroyed", Size());
}
void
WidevineBuffer::Destroy()
{
delete this;
}
uint32_t
WidevineBuffer::Capacity() const
{
return mBuffer.Length();
}
uint8_t*
WidevineBuffer::Data()
{
return mBuffer.Elements();
}
void
WidevineBuffer::SetSize(uint32_t aSize)
{
mBuffer.SetLength(aSize);
}
uint32_t
WidevineBuffer::Size() const
{
return mBuffer.Length();
}
nsTArray<uint8_t>
WidevineBuffer::ExtractBuffer() {
nsTArray<uint8_t> out;
out.SwapElements(mBuffer);
return out;
}
WidevineDecryptedBlock::WidevineDecryptedBlock()
: mBuffer(nullptr)
, mTimestamp(0)
{
}
WidevineDecryptedBlock::~WidevineDecryptedBlock()
{
if (mBuffer) {
mBuffer->Destroy();
mBuffer = nullptr;
}
}
void
WidevineDecryptedBlock::SetDecryptedBuffer(cdm::Buffer* aBuffer)
{
mBuffer = aBuffer;
}
cdm::Buffer*
WidevineDecryptedBlock::DecryptedBuffer()
{
return mBuffer;
}
void
WidevineDecryptedBlock::SetTimestamp(int64_t aTimestamp)
{
mTimestamp = aTimestamp;
}
int64_t
WidevineDecryptedBlock::Timestamp() const
{
return mTimestamp;
}
} // namespace mozilla

Просмотреть файл

@ -61,6 +61,43 @@ void InitInputBuffer(const GMPEncryptedBufferMetadata* aCrypto,
cdm::InputBuffer &aInputBuffer,
nsTArray<cdm::SubsampleEntry> &aSubsamples);
class WidevineBuffer : public cdm::Buffer
{
public:
explicit WidevineBuffer(size_t aSize);
~WidevineBuffer() override;
void Destroy() override;
uint32_t Capacity() const override;
uint8_t* Data() override;
void SetSize(uint32_t aSize) override;
uint32_t Size() const override;
// Moves contents of buffer out into temporary.
// Note: This empties the buffer.
nsTArray<uint8_t> ExtractBuffer();
private:
nsTArray<uint8_t> mBuffer;
WidevineBuffer(const WidevineBuffer&);
void operator=(const WidevineBuffer&);
};
class WidevineDecryptedBlock : public cdm::DecryptedBlock
{
public:
WidevineDecryptedBlock();
~WidevineDecryptedBlock() override;
void SetDecryptedBuffer(cdm::Buffer* aBuffer) override;
cdm::Buffer* DecryptedBuffer() override;
void SetTimestamp(int64_t aTimestamp) override;
int64_t Timestamp() const override;
private:
cdm::Buffer* mBuffer;
int64_t mTimestamp;
};
} // namespace mozilla
#endif // WidevineUtils_h_

Просмотреть файл

@ -14,6 +14,11 @@ SOURCES += [
'WidevineVideoFrame.cpp',
]
EXPORTS += [
'WidevineDecryptor.h',
'WidevineUtils.h'
]
FINAL_LIBRARY = 'xul'
LOCAL_INCLUDES += [