Index: webkit/plugins/ppapi/content_decryptor_delegate.cc |
diff --git a/webkit/plugins/ppapi/content_decryptor_delegate.cc b/webkit/plugins/ppapi/content_decryptor_delegate.cc |
index 069f367c6f47b8d2e3496372b09e7a259c90c311..e93bc93c7e2dbdef62e5f65e68c93172d43460b3 100644 |
--- a/webkit/plugins/ppapi/content_decryptor_delegate.cc |
+++ b/webkit/plugins/ppapi/content_decryptor_delegate.cc |
@@ -79,29 +79,29 @@ bool CopyStringToArray(const std::string& str, uint8 (&array)[array_size]) { |
} |
// Fills the |block_info| with information from |decrypt_config|, |timestamp| |
-// and |request_id|. |decrypt_config| can be NULL if the block is not encrypted. |
-// This is useful for end-of-stream blocks. |
+// and |request_id|. |
+// |
// Returns true if |block_info| is successfully filled. Returns false |
// otherwise. |
-bool MakeEncryptedBlockInfo(int data_size, |
- const media::DecryptConfig* decrypt_config, |
- int64_t timestamp, |
- uint32_t request_id, |
- PP_EncryptedBlockInfo* block_info) { |
- DCHECK(block_info); |
- |
+static bool MakeEncryptedBlockInfo( |
+ const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
+ uint32_t request_id, |
+ PP_EncryptedBlockInfo* block_info) { |
// TODO(xhwang): Fix initialization of PP_EncryptedBlockInfo here and |
// anywhere else. |
memset(block_info, 0, sizeof(*block_info)); |
- |
block_info->tracking_info.request_id = request_id; |
- block_info->tracking_info.timestamp = timestamp; |
- if (!decrypt_config) |
+ // EOS buffers need a request ID and nothing more. |
+ if (encrypted_buffer->IsEndOfStream()) |
return true; |
- DCHECK(data_size) << "DecryptConfig is set on an empty buffer"; |
- block_info->data_size = data_size; |
+ block_info->tracking_info.timestamp = |
+ encrypted_buffer->GetTimestamp().InMicroseconds(); |
+ block_info->data_size = encrypted_buffer->GetDataSize(); |
+ |
+ const media::DecryptConfig* decrypt_config = |
+ encrypted_buffer->GetDecryptConfig(); |
block_info->data_offset = decrypt_config->data_offset(); |
if (!CopyStringToArray(decrypt_config->key_id(), block_info->key_id) || |
@@ -365,11 +365,7 @@ bool ContentDecryptorDelegate::Decrypt( |
PP_EncryptedBlockInfo block_info = {}; |
DCHECK(encrypted_buffer->GetDecryptConfig()); |
- if (!MakeEncryptedBlockInfo(encrypted_buffer->GetDataSize(), |
- encrypted_buffer->GetDecryptConfig(), |
- encrypted_buffer->GetTimestamp().InMicroseconds(), |
- request_id, |
- &block_info)) { |
+ if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { |
return false; |
} |
@@ -535,13 +531,13 @@ bool ContentDecryptorDelegate::DecryptAndDecodeAudio( |
// because there is only one pending audio decode request at any time. |
// This is enforced by the media pipeline. |
scoped_refptr<PPB_Buffer_Impl> encrypted_resource; |
- if (!MakeMediaBufferResource(media::Decryptor::kAudio, |
+ if (!encrypted_buffer->IsEndOfStream() && |
+ !MakeMediaBufferResource(media::Decryptor::kAudio, |
encrypted_buffer->GetData(), |
encrypted_buffer->GetDataSize(), |
&encrypted_resource)) { |
return false; |
} |
- ScopedPPResource pp_resource(encrypted_resource.get()); |
// The resource should not be NULL for non-EOS buffer. |
if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource) |
@@ -551,12 +547,7 @@ bool ContentDecryptorDelegate::DecryptAndDecodeAudio( |
DVLOG(2) << "DecryptAndDecodeAudio() - request_id " << request_id; |
PP_EncryptedBlockInfo block_info = {}; |
- if (!MakeEncryptedBlockInfo( |
- encrypted_buffer->GetDataSize(), |
- encrypted_buffer->GetDecryptConfig(), |
- encrypted_buffer->GetTimestamp().InMicroseconds(), |
- request_id, |
- &block_info)) { |
+ if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { |
return false; |
} |
@@ -571,6 +562,7 @@ bool ContentDecryptorDelegate::DecryptAndDecodeAudio( |
pending_audio_decode_request_id_ = request_id; |
pending_audio_decode_cb_ = audio_decode_cb; |
+ ScopedPPResource pp_resource(encrypted_resource.get()); |
plugin_decryption_interface_->DecryptAndDecode(pp_instance_, |
PP_DECRYPTORSTREAMTYPE_AUDIO, |
pp_resource, |
@@ -581,20 +573,17 @@ bool ContentDecryptorDelegate::DecryptAndDecodeAudio( |
bool ContentDecryptorDelegate::DecryptAndDecodeVideo( |
const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
const media::Decryptor::VideoDecodeCB& video_decode_cb) { |
- // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize() |
- // return NULL and 0 respectively. In that case, we'll just get a NULL |
- // resource. |
// |video_input_resource_| is not being used by the plugin now |
// because there is only one pending video decode request at any time. |
// This is enforced by the media pipeline. |
scoped_refptr<PPB_Buffer_Impl> encrypted_resource; |
- if (!MakeMediaBufferResource(media::Decryptor::kVideo, |
+ if (!encrypted_buffer->IsEndOfStream() && |
+ !MakeMediaBufferResource(media::Decryptor::kVideo, |
encrypted_buffer->GetData(), |
encrypted_buffer->GetDataSize(), |
&encrypted_resource)) { |
return false; |
} |
- ScopedPPResource pp_resource(encrypted_resource.get()); |
// The resource should not be 0 for non-EOS buffer. |
if (!encrypted_buffer->IsEndOfStream() && !encrypted_resource) |
@@ -606,12 +595,7 @@ bool ContentDecryptorDelegate::DecryptAndDecodeVideo( |
"eme", "ContentDecryptorDelegate::DecryptAndDecodeVideo", request_id); |
PP_EncryptedBlockInfo block_info = {}; |
- if (!MakeEncryptedBlockInfo( |
- encrypted_buffer->GetDataSize(), |
- encrypted_buffer->GetDecryptConfig(), |
- encrypted_buffer->GetTimestamp().InMicroseconds(), |
- request_id, |
- &block_info)) { |
+ if (!MakeEncryptedBlockInfo(encrypted_buffer, request_id, &block_info)) { |
return false; |
} |
@@ -627,6 +611,7 @@ bool ContentDecryptorDelegate::DecryptAndDecodeVideo( |
pending_video_decode_cb_ = video_decode_cb; |
// TODO(tomfinegan): Need to get stream type from media stack. |
+ ScopedPPResource pp_resource(encrypted_resource.get()); |
plugin_decryption_interface_->DecryptAndDecode(pp_instance_, |
PP_DECRYPTORSTREAMTYPE_VIDEO, |
pp_resource, |
@@ -984,13 +969,6 @@ bool ContentDecryptorDelegate::MakeMediaBufferResource( |
TRACE_EVENT0("eme", "ContentDecryptorDelegate::MakeMediaBufferResource"); |
DCHECK(resource); |
- |
- if (!data || !size) { |
- DCHECK(!data && !size); |
- resource = NULL; |
- return true; |
- } |
- |
DCHECK(stream_type == media::Decryptor::kAudio || |
stream_type == media::Decryptor::kVideo); |
scoped_refptr<PPB_Buffer_Impl>& media_resource = |