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..c3ca36841b941ac481700931a6bfa3bf17186ee4 100644 |
--- a/webkit/plugins/ppapi/content_decryptor_delegate.cc |
+++ b/webkit/plugins/ppapi/content_decryptor_delegate.cc |
@@ -78,30 +78,29 @@ bool CopyStringToArray(const std::string& str, uint8 (&array)[array_size]) { |
return true; |
} |
-// 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. |
+// Fills the |block_info| with information from |encrypted_buffer|. |
+// |
// 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"; |
xhwang
2013/01/28 16:35:20
can we keep this DCHECK so that we won't miss 0-by
scherkus (not reviewing)
2013/01/28 18:28:37
Done.
|
- 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) || |
@@ -352,8 +351,7 @@ bool ContentDecryptorDelegate::Decrypt( |
// time. This is enforced by the media pipeline. |
scoped_refptr<PPB_Buffer_Impl> encrypted_resource; |
if (!MakeMediaBufferResource(stream_type, |
- encrypted_buffer->GetData(), |
- encrypted_buffer->GetDataSize(), |
+ encrypted_buffer, |
&encrypted_resource) || |
!encrypted_resource) { |
return false; |
@@ -365,11 +363,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; |
} |
@@ -528,20 +522,15 @@ bool ContentDecryptorDelegate::ResetDecoder( |
bool ContentDecryptorDelegate::DecryptAndDecodeAudio( |
const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
const media::Decryptor::AudioDecodeCB& audio_decode_cb) { |
- // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize() |
- // return NULL and 0 respectively. In that case, we'll just create a NULL |
- // resource. |
// |audio_input_resource_| is not being used by the plugin now |
// 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, |
- encrypted_buffer->GetData(), |
- encrypted_buffer->GetDataSize(), |
+ encrypted_buffer, |
&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 +540,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 +555,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 +566,15 @@ 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, |
- encrypted_buffer->GetData(), |
- encrypted_buffer->GetDataSize(), |
+ encrypted_buffer, |
&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 +586,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 +602,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, |
@@ -979,24 +955,24 @@ void ContentDecryptorDelegate::CancelDecode( |
bool ContentDecryptorDelegate::MakeMediaBufferResource( |
media::Decryptor::StreamType stream_type, |
- const uint8* data, uint32_t size, |
+ const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
scoped_refptr<PPB_Buffer_Impl>* resource) { |
TRACE_EVENT0("eme", "ContentDecryptorDelegate::MakeMediaBufferResource"); |
- DCHECK(resource); |
- |
- if (!data || !size) { |
- DCHECK(!data && !size); |
- resource = NULL; |
+ // End of stream buffers are represented as null resources. |
+ if (encrypted_buffer->IsEndOfStream()) { |
+ *resource = NULL; |
xhwang
2013/01/28 16:35:20
looks like you found a bug! thanks!
scherkus (not reviewing)
2013/01/28 18:28:37
:)
|
return true; |
} |
+ const size_t data_size = static_cast<size_t>(encrypted_buffer->GetDataSize()); |
xhwang
2013/01/28 16:35:20
move this down to 972 or 975?
scherkus (not reviewing)
2013/01/28 18:28:37
Done.
|
+ |
DCHECK(stream_type == media::Decryptor::kAudio || |
stream_type == media::Decryptor::kVideo); |
scoped_refptr<PPB_Buffer_Impl>& media_resource = |
(stream_type == media::Decryptor::kAudio) ? audio_input_resource_ : |
video_input_resource_; |
- if (!media_resource || (media_resource->size() < size)) { |
+ if (!media_resource || media_resource->size() < data_size) { |
// Either the buffer hasn't been created yet, or we have one that isn't big |
// enough to fit |size| bytes. |
@@ -1008,7 +984,7 @@ bool ContentDecryptorDelegate::MakeMediaBufferResource( |
const uint32_t kMinimumMediaBufferSize = 1024; |
uint32_t media_resource_size = media_resource ? media_resource->size() : |
kMinimumMediaBufferSize; |
- while (media_resource_size < size) |
+ while (media_resource_size < data_size) |
media_resource_size *= 2; |
DVLOG(2) << "Size of media buffer for " |
@@ -1022,11 +998,11 @@ bool ContentDecryptorDelegate::MakeMediaBufferResource( |
} |
BufferAutoMapper mapper(media_resource); |
- if (!mapper.data() || mapper.size() < static_cast<size_t>(size)) { |
+ if (!mapper.data() || mapper.size() < data_size) { |
media_resource = NULL; |
return false; |
} |
- memcpy(mapper.data(), data, size); |
+ memcpy(mapper.data(), encrypted_buffer->GetData(), data_size); |
*resource = media_resource; |
return true; |