summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--webkit/media/crypto/ppapi/cdm_wrapper.cc413
-rw-r--r--webkit/media/crypto/ppapi/content_decryption_module.h32
2 files changed, 209 insertions, 236 deletions
diff --git a/webkit/media/crypto/ppapi/cdm_wrapper.cc b/webkit/media/crypto/ppapi/cdm_wrapper.cc
index 592ac1e..b4b7108 100644
--- a/webkit/media/crypto/ppapi/cdm_wrapper.cc
+++ b/webkit/media/crypto/ppapi/cdm_wrapper.cc
@@ -64,7 +64,7 @@ void ConfigureInputBuffer(
PP_DCHECK(subsamples);
PP_DCHECK(!encrypted_buffer.is_null());
- input_buffer->data = reinterpret_cast<uint8_t*>(encrypted_buffer.data());
+ input_buffer->data = static_cast<uint8_t*>(encrypted_buffer.data());
input_buffer->data_size = encrypted_buffer.size();
input_buffer->data_offset = encrypted_block_info.data_offset;
input_buffer->key_id = encrypted_block_info.key_id;
@@ -206,8 +206,8 @@ class PpbBuffer : public cdm::Buffer {
class PpbBufferAllocator : public cdm::Allocator {
public:
- explicit PpbBufferAllocator(pp::Instance* instance);
- virtual ~PpbBufferAllocator();
+ explicit PpbBufferAllocator(pp::Instance* instance) : instance_(instance) {}
+ virtual ~PpbBufferAllocator() {}
// cdm::Allocator methods.
// Allocates a pp::Buffer_Dev of the specified size and wraps it in a
@@ -221,41 +221,51 @@ class PpbBufferAllocator : public cdm::Allocator {
DISALLOW_COPY_AND_ASSIGN(PpbBufferAllocator);
};
-class DecryptedBlockImpl : public cdm::DecryptedBlock {
- public:
- DecryptedBlockImpl() : buffer_(NULL), timestamp_(0) {}
- virtual ~DecryptedBlockImpl();
-
- virtual void set_buffer(cdm::Buffer* buffer) OVERRIDE;
- virtual cdm::Buffer* buffer() OVERRIDE;
-
- virtual void set_timestamp(int64_t timestamp) OVERRIDE;
- virtual int64_t timestamp() const OVERRIDE;
+cdm::Buffer* PpbBufferAllocator::Allocate(int32_t size) {
+ PP_DCHECK(size > 0);
+ PP_DCHECK(IsMainThread());
- private:
- PpbBuffer* buffer_;
- int64_t timestamp_;
+ pp::Buffer_Dev buffer(instance_, size);
+ if (buffer.is_null())
+ return NULL;
- DISALLOW_COPY_AND_ASSIGN(DecryptedBlockImpl);
-};
+ return new PpbBuffer(buffer);
+}
class KeyMessageImpl : public cdm::KeyMessage {
public:
KeyMessageImpl() : message_(NULL) {}
- virtual ~KeyMessageImpl();
+ virtual ~KeyMessageImpl() {
+ if (message_)
+ message_->Destroy();
+ }
// cdm::KeyMessage methods.
- virtual void set_session_id(const char* session_id, int32_t length) OVERRIDE;
- virtual const char* session_id() const OVERRIDE;
- virtual int32_t session_id_length() const OVERRIDE;
+ virtual void set_session_id(const char* session_id, int32_t length) OVERRIDE {
+ session_id_.assign(session_id, length);
+ }
+ virtual const char* session_id() const OVERRIDE {
+ return session_id_.c_str();
+ }
+ virtual int32_t session_id_length() const OVERRIDE {
+ return session_id_.length();
+ }
- virtual void set_message(cdm::Buffer* message) OVERRIDE;
- virtual cdm::Buffer* message() OVERRIDE;
+ virtual void set_message(cdm::Buffer* message) OVERRIDE {
+ message_ = static_cast<PpbBuffer*>(message);
+ }
+ virtual cdm::Buffer* message() OVERRIDE { return message_; }
virtual void set_default_url(const char* default_url,
- int32_t length) OVERRIDE;
- virtual const char* default_url() const OVERRIDE;
- virtual int32_t default_url_length() const OVERRIDE;
+ int32_t length) OVERRIDE {
+ default_url_.assign(default_url, length);
+ }
+ virtual const char* default_url() const OVERRIDE {
+ return default_url_.c_str();
+ }
+ virtual int32_t default_url_length() const OVERRIDE {
+ return default_url_.length();
+ }
std::string session_id_string() const { return session_id_; }
std::string default_url_string() const { return default_url_; }
@@ -268,50 +278,70 @@ class KeyMessageImpl : public cdm::KeyMessage {
DISALLOW_COPY_AND_ASSIGN(KeyMessageImpl);
};
-DecryptedBlockImpl::~DecryptedBlockImpl() {
- if (buffer_)
- buffer_->Destroy();
-}
+class DecryptedBlockImpl : public cdm::DecryptedBlock {
+ public:
+ DecryptedBlockImpl() : buffer_(NULL), timestamp_(0) {}
+ virtual ~DecryptedBlockImpl() { if (buffer_) buffer_->Destroy(); }
-void DecryptedBlockImpl::set_buffer(cdm::Buffer* buffer) {
- buffer_ = static_cast<PpbBuffer*>(buffer);
-}
+ virtual void set_buffer(cdm::Buffer* buffer) OVERRIDE {
+ buffer_ = static_cast<PpbBuffer*>(buffer);
+ }
+ virtual cdm::Buffer* buffer() OVERRIDE { return buffer_; }
-cdm::Buffer* DecryptedBlockImpl::buffer() {
- return buffer_;
-}
+ virtual void set_timestamp(int64_t timestamp) OVERRIDE {
+ timestamp_ = timestamp;
+ }
+ virtual int64_t timestamp() const OVERRIDE { return timestamp_; }
-void DecryptedBlockImpl::set_timestamp(int64_t timestamp) {
- timestamp_ = timestamp;
-}
+ private:
+ PpbBuffer* buffer_;
+ int64_t timestamp_;
-int64_t DecryptedBlockImpl::timestamp() const {
- return timestamp_;
-}
+ DISALLOW_COPY_AND_ASSIGN(DecryptedBlockImpl);
+};
class VideoFrameImpl : public cdm::VideoFrame {
public:
VideoFrameImpl();
virtual ~VideoFrameImpl();
- virtual void set_format(cdm::VideoFormat format) OVERRIDE;
- virtual cdm::VideoFormat format() const OVERRIDE;
+ virtual void set_format(cdm::VideoFormat format) OVERRIDE {
+ format_ = format;
+ }
+ virtual cdm::VideoFormat format() const OVERRIDE { return format_; }
- virtual void set_size(cdm::Size size) OVERRIDE;
- virtual cdm::Size size() const OVERRIDE;
+ virtual void set_size(cdm::Size size) OVERRIDE { size_ = size; }
+ virtual cdm::Size size() const OVERRIDE { return size_; }
- virtual void set_frame_buffer(cdm::Buffer* frame_buffer) OVERRIDE;
- virtual cdm::Buffer* frame_buffer() OVERRIDE;
+ virtual void set_frame_buffer(cdm::Buffer* frame_buffer) OVERRIDE {
+ frame_buffer_ = static_cast<PpbBuffer*>(frame_buffer);
+ }
+ virtual cdm::Buffer* frame_buffer() OVERRIDE { return frame_buffer_; }
virtual void set_plane_offset(cdm::VideoFrame::VideoPlane plane,
- int32_t offset) OVERRIDE;
- virtual int32_t plane_offset(VideoPlane plane) OVERRIDE;
+ int32_t offset) OVERRIDE {
+ PP_DCHECK(0 <= plane && plane < kMaxPlanes);
+ PP_DCHECK(offset >= 0);
+ plane_offsets_[plane] = offset;
+ }
+ virtual int32_t plane_offset(VideoPlane plane) OVERRIDE {
+ PP_DCHECK(0 <= plane && plane < kMaxPlanes);
+ return plane_offsets_[plane];
+ }
- virtual void set_stride(VideoPlane plane, int32_t stride) OVERRIDE;
- virtual int32_t stride(VideoPlane plane) OVERRIDE;
+ virtual void set_stride(VideoPlane plane, int32_t stride) OVERRIDE {
+ PP_DCHECK(0 <= plane && plane < kMaxPlanes);
+ strides_[plane] = stride;
+ }
+ virtual int32_t stride(VideoPlane plane) OVERRIDE {
+ PP_DCHECK(0 <= plane && plane < kMaxPlanes);
+ return strides_[plane];
+ }
- virtual void set_timestamp(int64_t timestamp) OVERRIDE;
- virtual int64_t timestamp() const OVERRIDE;
+ virtual void set_timestamp(int64_t timestamp) OVERRIDE {
+ timestamp_ = timestamp;
+ }
+ virtual int64_t timestamp() const OVERRIDE { return timestamp_; }
private:
// The video buffer format.
@@ -333,44 +363,9 @@ class VideoFrameImpl : public cdm::VideoFrame {
// Presentation timestamp in microseconds.
int64_t timestamp_;
-};
-
-KeyMessageImpl::~KeyMessageImpl() {
- if (message_)
- message_->Destroy();
-}
-void KeyMessageImpl::set_session_id(const char* session_id, int32_t length) {
- session_id_.assign(session_id, length);
-}
-
-const char* KeyMessageImpl::session_id() const {
- return session_id_.c_str();
-}
-
-int32_t KeyMessageImpl::session_id_length() const {
- return session_id_.length();
-}
-
-void KeyMessageImpl::set_message(cdm::Buffer* buffer) {
- message_ = static_cast<PpbBuffer*>(buffer);
-}
-
-cdm::Buffer* KeyMessageImpl::message() {
- return message_;
-}
-
-void KeyMessageImpl::set_default_url(const char* default_url, int32_t length) {
- default_url_.assign(default_url, length);
-}
-
-const char* KeyMessageImpl::default_url() const {
- return default_url_.c_str();
-}
-
-int32_t KeyMessageImpl::default_url_length() const {
- return default_url_.length();
-}
+ DISALLOW_COPY_AND_ASSIGN(VideoFrameImpl);
+};
VideoFrameImpl::VideoFrameImpl()
: format_(cdm::kUnknownVideoFormat),
@@ -387,60 +382,6 @@ VideoFrameImpl::~VideoFrameImpl() {
frame_buffer_->Destroy();
}
-void VideoFrameImpl::set_format(cdm::VideoFormat format) {
- format_ = format;
-}
-
-cdm::VideoFormat VideoFrameImpl::format() const {
- return format_;
-}
-
-void VideoFrameImpl::set_size(cdm::Size size) {
- size_ = size;
-}
-
-cdm::Size VideoFrameImpl::size() const {
- return size_;
-}
-
-void VideoFrameImpl::set_frame_buffer(cdm::Buffer* frame_buffer) {
- frame_buffer_ = static_cast<PpbBuffer*>(frame_buffer);
-}
-
-cdm::Buffer* VideoFrameImpl::frame_buffer() {
- return frame_buffer_;
-}
-
-void VideoFrameImpl::set_plane_offset(cdm::VideoFrame::VideoPlane plane,
- int32_t offset) {
- PP_DCHECK(0 <= plane && plane < kMaxPlanes);
- PP_DCHECK(offset >= 0);
- plane_offsets_[plane] = offset;
-}
-
-int32_t VideoFrameImpl::plane_offset(VideoPlane plane) {
- PP_DCHECK(0 <= plane && plane < kMaxPlanes);
- return plane_offsets_[plane];
-}
-
-void VideoFrameImpl::set_stride(VideoPlane plane, int32_t stride) {
- PP_DCHECK(0 <= plane && plane < kMaxPlanes);
- strides_[plane] = stride;
-}
-
-int32_t VideoFrameImpl::stride(VideoPlane plane) {
- PP_DCHECK(0 <= plane && plane < kMaxPlanes);
- return strides_[plane];
-}
-
-void VideoFrameImpl::set_timestamp(int64_t timestamp) {
- timestamp_ = timestamp;
-}
-
-int64_t VideoFrameImpl::timestamp() const {
- return timestamp_;
-}
-
class AudioFramesImpl : public cdm::AudioFrames {
public:
AudioFramesImpl() : buffer_(NULL) {}
@@ -471,11 +412,13 @@ class CdmWrapper : public pp::Instance,
public:
CdmWrapper(PP_Instance instance, pp::Module* module);
virtual ~CdmWrapper();
+
+ // pp::Instance implementation.
virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) {
return true;
}
- // PPP_ContentDecryptor_Private methods
+ // PPP_ContentDecryptor_Private implementation.
// Note: Results of calls to these methods must be reported through the
// PPB_ContentDecryptor_Private interface.
virtual void GenerateKeyRequest(const std::string& key_system,
@@ -502,7 +445,7 @@ class CdmWrapper : public pp::Instance,
pp::Buffer_Dev encrypted_buffer,
const PP_EncryptedBlockInfo& encrypted_block_info) OVERRIDE;
- // CdmHost methods.
+ // CdmHost implementation.
virtual void SetTimer(int64 delay_ms) OVERRIDE;
virtual double GetCurrentWallTimeMs() OVERRIDE;
@@ -541,6 +484,9 @@ class CdmWrapper : public pp::Instance,
const LinkedAudioFrames& audio_frames,
const PP_DecryptTrackingInfo& tracking_info);
+ // Helper function to fire KeyError event on the main thread.
+ void FireKeyError(const std::string& session_id);
+
// Helper for SetTimer().
void TimerExpired(int32 result);
@@ -548,25 +494,9 @@ class CdmWrapper : public pp::Instance,
pp::CompletionCallbackFactory<CdmWrapper> callback_factory_;
cdm::ContentDecryptionModule* cdm_;
std::string key_system_;
-};
-PpbBufferAllocator::PpbBufferAllocator(pp::Instance* instance)
- : instance_(instance) {
-}
-
-PpbBufferAllocator::~PpbBufferAllocator() {
-}
-
-cdm::Buffer* PpbBufferAllocator::Allocate(int32_t size) {
- PP_DCHECK(size > 0);
- PP_DCHECK(IsMainThread());
-
- pp::Buffer_Dev buffer(instance_, size);
- if (buffer.is_null())
- return NULL;
-
- return new PpbBuffer(buffer);
-}
+ DISALLOW_COPY_AND_ASSIGN(CdmWrapper);
+};
CdmWrapper::CdmWrapper(PP_Instance instance, pp::Module* module)
: pp::Instance(instance),
@@ -587,21 +517,23 @@ void CdmWrapper::GenerateKeyRequest(const std::string& key_system,
if (!cdm_) {
cdm_ = CreateCdmInstance(&allocator_, this);
- if (!cdm_)
+ PP_DCHECK(cdm_);
+ if (!cdm_) {
+ FireKeyError("");
return;
+ }
}
LinkedKeyMessage key_request(new KeyMessageImpl());
cdm::Status status = cdm_->GenerateKeyRequest(
- reinterpret_cast<const uint8_t*>(init_data.Map()),
+ static_cast<const uint8_t*>(init_data.Map()),
init_data.ByteLength(),
key_request.get());
PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError);
if (status != cdm::kSuccess ||
!key_request->message() ||
key_request->message()->size() == 0) {
- CallOnMain(callback_factory_.NewCallback(&CdmWrapper::KeyError,
- std::string()));
+ FireKeyError("");
return;
}
@@ -619,23 +551,28 @@ void CdmWrapper::GenerateKeyRequest(const std::string& key_system,
void CdmWrapper::AddKey(const std::string& session_id,
pp::VarArrayBuffer key,
pp::VarArrayBuffer init_data) {
- const uint8_t* key_ptr = reinterpret_cast<const uint8_t*>(key.Map());
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
+ if (!cdm_) {
+ FireKeyError(session_id);
+ return;
+ }
+
+ const uint8_t* key_ptr = static_cast<const uint8_t*>(key.Map());
int key_size = key.ByteLength();
- const uint8_t* init_data_ptr =
- reinterpret_cast<const uint8_t*>(init_data.Map());
+ const uint8_t* init_data_ptr = static_cast<const uint8_t*>(init_data.Map());
int init_data_size = init_data.ByteLength();
- if (!key_ptr || key_size <= 0 || !init_data_ptr || init_data_size <= 0)
+ if (!key_ptr || key_size <= 0 || !init_data_ptr || init_data_size <= 0) {
+ FireKeyError(session_id);
return;
+ }
- PP_DCHECK(cdm_);
cdm::Status status = cdm_->AddKey(session_id.data(), session_id.size(),
key_ptr, key_size,
init_data_ptr, init_data_size);
PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError);
if (status != cdm::kSuccess) {
- CallOnMain(callback_factory_.NewCallback(&CdmWrapper::KeyError,
- session_id));
+ FireKeyError(session_id);
return;
}
@@ -643,28 +580,37 @@ void CdmWrapper::AddKey(const std::string& session_id,
}
void CdmWrapper::CancelKeyRequest(const std::string& session_id) {
- PP_DCHECK(cdm_);
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
+ if (!cdm_) {
+ FireKeyError(session_id);
+ return;
+ }
+
cdm::Status status = cdm_->CancelKeyRequest(session_id.data(),
session_id.size());
PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError);
- if (status != cdm::kSuccess) {
- CallOnMain(callback_factory_.NewCallback(&CdmWrapper::KeyError,
- session_id));
- }
+ if (status != cdm::kSuccess)
+ FireKeyError(session_id);
}
+// Note: In the following decryption/decoding related functions, errors are NOT
+// reported via KeyError, but are reported via corresponding PPB calls.
+
void CdmWrapper::Decrypt(pp::Buffer_Dev encrypted_buffer,
const PP_EncryptedBlockInfo& encrypted_block_info) {
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
PP_DCHECK(!encrypted_buffer.is_null());
- PP_DCHECK(cdm_);
-
- cdm::InputBuffer input_buffer;
- std::vector<cdm::SubsampleEntry> subsamples;
- ConfigureInputBuffer(encrypted_buffer, encrypted_block_info, &subsamples,
- &input_buffer);
+ cdm::Status status = cdm::kDecryptError;
LinkedDecryptedBlock decrypted_block(new DecryptedBlockImpl());
- cdm::Status status = cdm_->Decrypt(input_buffer, decrypted_block.get());
+
+ if (cdm_) {
+ cdm::InputBuffer input_buffer;
+ std::vector<cdm::SubsampleEntry> subsamples;
+ ConfigureInputBuffer(encrypted_buffer, encrypted_block_info, &subsamples,
+ &input_buffer);
+ status = cdm_->Decrypt(input_buffer, decrypted_block.get());
+ }
CallOnMain(callback_factory_.NewCallback(
&CdmWrapper::DeliverBlock,
@@ -676,17 +622,22 @@ void CdmWrapper::Decrypt(pp::Buffer_Dev encrypted_buffer,
void CdmWrapper::InitializeAudioDecoder(
const PP_AudioDecoderConfig& decoder_config,
pp::Buffer_Dev extra_data_buffer) {
- PP_DCHECK(cdm_);
- cdm::AudioDecoderConfig cdm_decoder_config;
- cdm_decoder_config.codec = PpAudioCodecToCdmAudioCodec(decoder_config.codec);
- cdm_decoder_config.channel_count = decoder_config.channel_count;
- cdm_decoder_config.bits_per_channel = decoder_config.bits_per_channel;
- cdm_decoder_config.samples_per_second = decoder_config.samples_per_second;
- cdm_decoder_config.extra_data =
- static_cast<uint8_t*>(extra_data_buffer.data());
- cdm_decoder_config.extra_data_size =
- static_cast<int32_t>(extra_data_buffer.size());
- cdm::Status status = cdm_->InitializeAudioDecoder(cdm_decoder_config);
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
+
+ cdm::Status status = cdm::kSessionError;
+ if (cdm_) {
+ cdm::AudioDecoderConfig cdm_decoder_config;
+ cdm_decoder_config.codec =
+ PpAudioCodecToCdmAudioCodec(decoder_config.codec);
+ cdm_decoder_config.channel_count = decoder_config.channel_count;
+ cdm_decoder_config.bits_per_channel = decoder_config.bits_per_channel;
+ cdm_decoder_config.samples_per_second = decoder_config.samples_per_second;
+ cdm_decoder_config.extra_data =
+ static_cast<uint8_t*>(extra_data_buffer.data());
+ cdm_decoder_config.extra_data_size =
+ static_cast<int32_t>(extra_data_buffer.size());
+ status = cdm_->InitializeAudioDecoder(cdm_decoder_config);
+ }
CallOnMain(callback_factory_.NewCallback(
&CdmWrapper::DecoderInitializeDone,
@@ -698,20 +649,25 @@ void CdmWrapper::InitializeAudioDecoder(
void CdmWrapper::InitializeVideoDecoder(
const PP_VideoDecoderConfig& decoder_config,
pp::Buffer_Dev extra_data_buffer) {
- PP_DCHECK(cdm_);
- cdm::VideoDecoderConfig cdm_decoder_config;
- cdm_decoder_config.codec = PpVideoCodecToCdmVideoCodec(decoder_config.codec);
- cdm_decoder_config.profile =
- PpVCProfileToCdmVCProfile(decoder_config.profile);
- cdm_decoder_config.format =
- PpDecryptedFrameFormatToCdmVideoFormat(decoder_config.format);
- cdm_decoder_config.coded_size.width = decoder_config.width;
- cdm_decoder_config.coded_size.height = decoder_config.height;
- cdm_decoder_config.extra_data =
- static_cast<uint8_t*>(extra_data_buffer.data());
- cdm_decoder_config.extra_data_size =
- static_cast<int32_t>(extra_data_buffer.size());
- cdm::Status status = cdm_->InitializeVideoDecoder(cdm_decoder_config);
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
+
+ cdm::Status status = cdm::kSessionError;
+ if (cdm_) {
+ cdm::VideoDecoderConfig cdm_decoder_config;
+ cdm_decoder_config.codec =
+ PpVideoCodecToCdmVideoCodec(decoder_config.codec);
+ cdm_decoder_config.profile =
+ PpVCProfileToCdmVCProfile(decoder_config.profile);
+ cdm_decoder_config.format =
+ PpDecryptedFrameFormatToCdmVideoFormat(decoder_config.format);
+ cdm_decoder_config.coded_size.width = decoder_config.width;
+ cdm_decoder_config.coded_size.height = decoder_config.height;
+ cdm_decoder_config.extra_data =
+ static_cast<uint8_t*>(extra_data_buffer.data());
+ cdm_decoder_config.extra_data_size =
+ static_cast<int32_t>(extra_data_buffer.size());
+ status = cdm_->InitializeVideoDecoder(cdm_decoder_config);
+ }
CallOnMain(callback_factory_.NewCallback(
&CdmWrapper::DecoderInitializeDone,
@@ -722,7 +678,12 @@ void CdmWrapper::InitializeVideoDecoder(
void CdmWrapper::DeinitializeDecoder(PP_DecryptorStreamType decoder_type,
uint32_t request_id) {
- cdm_->DeinitializeDecoder(PpDecryptorStreamTypeToCdmStreamType(decoder_type));
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
+ if (cdm_) {
+ cdm_->DeinitializeDecoder(
+ PpDecryptorStreamTypeToCdmStreamType(decoder_type));
+ }
+
CallOnMain(callback_factory_.NewCallback(
&CdmWrapper::DecoderDeinitializeDone,
decoder_type,
@@ -731,7 +692,10 @@ void CdmWrapper::DeinitializeDecoder(PP_DecryptorStreamType decoder_type,
void CdmWrapper::ResetDecoder(PP_DecryptorStreamType decoder_type,
uint32_t request_id) {
- cdm_->ResetDecoder(PpDecryptorStreamTypeToCdmStreamType(decoder_type));
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
+ if (cdm_)
+ cdm_->ResetDecoder(PpDecryptorStreamTypeToCdmStreamType(decoder_type));
+
CallOnMain(callback_factory_.NewCallback(&CdmWrapper::DecoderResetDone,
decoder_type,
request_id));
@@ -741,11 +705,11 @@ void CdmWrapper::DecryptAndDecode(
PP_DecryptorStreamType decoder_type,
pp::Buffer_Dev encrypted_buffer,
const PP_EncryptedBlockInfo& encrypted_block_info) {
- PP_DCHECK(cdm_);
+ PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
cdm::InputBuffer input_buffer;
std::vector<cdm::SubsampleEntry> subsamples;
- if (!encrypted_buffer.is_null()) {
+ if (cdm_ && !encrypted_buffer.is_null()) {
ConfigureInputBuffer(encrypted_buffer,
encrypted_block_info,
&subsamples,
@@ -753,10 +717,12 @@ void CdmWrapper::DecryptAndDecode(
}
cdm::Status status = cdm::kDecodeError;
+
switch (decoder_type) {
case PP_DECRYPTORSTREAMTYPE_VIDEO: {
LinkedVideoFrame video_frame(new VideoFrameImpl());
- status = cdm_->DecryptAndDecodeFrame(input_buffer, video_frame.get());
+ if (cdm_)
+ status = cdm_->DecryptAndDecodeFrame(input_buffer, video_frame.get());
CallOnMain(callback_factory_.NewCallback(
&CdmWrapper::DeliverFrame,
status,
@@ -767,7 +733,10 @@ void CdmWrapper::DecryptAndDecode(
case PP_DECRYPTORSTREAMTYPE_AUDIO: {
LinkedAudioFrames audio_frames(new AudioFramesImpl());
- status = cdm_->DecryptAndDecodeSamples(input_buffer, audio_frames.get());
+ if (cdm_) {
+ status = cdm_->DecryptAndDecodeSamples(input_buffer,
+ audio_frames.get());
+ }
CallOnMain(callback_factory_.NewCallback(
&CdmWrapper::DeliverSamples,
status,
@@ -782,6 +751,10 @@ void CdmWrapper::DecryptAndDecode(
}
}
+void CdmWrapper::FireKeyError(const std::string& session_id) {
+ CallOnMain(callback_factory_.NewCallback(&CdmWrapper::KeyError, session_id));
+}
+
void CdmWrapper::SetTimer(int64 delay_ms) {
// NOTE: doesn't really need to run on the main thread; could just as well run
// on a helper thread if |cdm_| were thread-friendly and care was taken. We
diff --git a/webkit/media/crypto/ppapi/content_decryption_module.h b/webkit/media/crypto/ppapi/content_decryption_module.h
index aedf6d4..9dce406 100644
--- a/webkit/media/crypto/ppapi/content_decryption_module.h
+++ b/webkit/media/crypto/ppapi/content_decryption_module.h
@@ -367,22 +367,6 @@ class CdmHost {
virtual double GetCurrentWallTimeMs() = 0;
};
-// Represents a decrypted block that has not been decoded.
-class DecryptedBlock {
- public:
- virtual void set_buffer(Buffer* buffer) = 0;
- virtual Buffer* buffer() = 0;
-
- // TODO(tomfinegan): Figure out if timestamp is really needed. If it is not,
- // we can just pass Buffer pointers around.
- virtual void set_timestamp(int64_t timestamp) = 0;
- virtual int64_t timestamp() const = 0;
-
- protected:
- DecryptedBlock() {}
- virtual ~DecryptedBlock() {}
-};
-
// Represents a key message sent by the CDM.
class KeyMessage {
public:
@@ -402,6 +386,22 @@ class KeyMessage {
virtual ~KeyMessage() {}
};
+// Represents a decrypted block that has not been decoded.
+class DecryptedBlock {
+ public:
+ virtual void set_buffer(Buffer* buffer) = 0;
+ virtual Buffer* buffer() = 0;
+
+ // TODO(tomfinegan): Figure out if timestamp is really needed. If it is not,
+ // we can just pass Buffer pointers around.
+ virtual void set_timestamp(int64_t timestamp) = 0;
+ virtual int64_t timestamp() const = 0;
+
+ protected:
+ DecryptedBlock() {}
+ virtual ~DecryptedBlock() {}
+};
+
class VideoFrame {
public:
enum VideoPlane {