Chromium Code Reviews| 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 a799cc0523f704f81d18ca1d361a19a082de4c2c..cc01eee89d21fbc81564dbe87f49ef4f9863bac5 100644 |
| --- a/webkit/plugins/ppapi/content_decryptor_delegate.cc |
| +++ b/webkit/plugins/ppapi/content_decryptor_delegate.cc |
| @@ -14,7 +14,6 @@ |
| #include "media/base/video_decoder_config.h" |
| #include "media/base/video_frame.h" |
| #include "media/base/video_util.h" |
| -#include "ppapi/shared_impl/scoped_pp_resource.h" |
| #include "ppapi/shared_impl/var.h" |
| #include "ppapi/shared_impl/var_tracker.h" |
| #include "ppapi/thunk/enter.h" |
| @@ -32,6 +31,8 @@ namespace ppapi { |
| namespace { |
| +const int kInitialMediaBufferSize = 1024; |
| + |
| // Fills |resource| with a PP_Resource containing a PPB_Buffer_Impl and copies |
| // |data| into the buffer resource. The |resource| has a reference count of 1. |
| // If |data| is NULL, fills |resource| with a PP_Resource with ID of 0. |
| @@ -39,6 +40,7 @@ namespace { |
| bool MakeBufferResource(PP_Instance instance, |
| const uint8* data, int size, |
| ScopedPPResource* resource) { |
| + TRACE_EVENT0("eme", "ContentDecryptorDelegate - MakeBufferResource"); |
| DCHECK(resource); |
| if (!data || !size) { |
| @@ -274,7 +276,9 @@ ContentDecryptorDelegate::ContentDecryptorDelegate( |
| pending_audio_decoder_init_request_id_(0), |
| pending_video_decoder_init_request_id_(0), |
| pending_audio_decode_request_id_(0), |
| - pending_video_decode_request_id_(0) { |
| + pending_video_decode_request_id_(0), |
| + audio_input_resource_size_(0), |
| + video_input_resource_size_(0) { |
| } |
| void ContentDecryptorDelegate::set_decrypt_client( |
| @@ -335,11 +339,14 @@ bool ContentDecryptorDelegate::Decrypt( |
| const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
| const media::Decryptor::DecryptCB& decrypt_cb) { |
| DVLOG(3) << "Decrypt() - stream_type: " << stream_type; |
| + // |{audio|video}_input_resource_size_| must be available here because there |
|
ddorwin
2012/11/17 02:07:38
What do you mean by "available"?
xhwang
2012/11/18 00:10:33
Done here and elsewhere.
|
| + // is only one pending audio/video decrypt request at any time. This is |
| + // enforced by the media pipeline. |
| ScopedPPResource encrypted_resource; |
| - if (!MakeBufferResource(pp_instance_, |
| - encrypted_buffer->GetData(), |
| - encrypted_buffer->GetDataSize(), |
| - &encrypted_resource) || |
| + if (!MakeMediaBufferResource(stream_type, |
| + encrypted_buffer->GetData(), |
| + encrypted_buffer->GetDataSize(), |
| + &encrypted_resource) || |
| !encrypted_resource.get()) { |
| return false; |
| } |
| @@ -499,11 +506,14 @@ bool ContentDecryptorDelegate::DecryptAndDecodeAudio( |
| // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize() |
| // return NULL and 0 respectively. In that case, we'll just create a 0 |
| // resource. |
| + // |audio_input_resource_size_| must be available here because there is only |
| + // one pending audio decode request at any time. This is enforced by the media |
| + // pipeline. |
| ScopedPPResource encrypted_resource; |
| - if (!MakeBufferResource(pp_instance_, |
| - encrypted_buffer->GetData(), |
| - encrypted_buffer->GetDataSize(), |
| - &encrypted_resource)) { |
| + if (!MakeMediaBufferResource(media::Decryptor::kAudio, |
| + encrypted_buffer->GetData(), |
| + encrypted_buffer->GetDataSize(), |
| + &encrypted_resource)) { |
| return false; |
| } |
| @@ -543,11 +553,14 @@ bool ContentDecryptorDelegate::DecryptAndDecodeVideo( |
| // If |encrypted_buffer| is end-of-stream buffer, GetData() and GetDataSize() |
| // return NULL and 0 respectively. In that case, we'll just create a 0 |
| // resource. |
| + // |video_input_resource_size_| must be available here because there is only |
| + // one pending video decode request at any time. This is enforced by the media |
| + // pipeline. |
| ScopedPPResource encrypted_resource; |
| - if (!MakeBufferResource(pp_instance_, |
| - encrypted_buffer->GetData(), |
| - encrypted_buffer->GetDataSize(), |
| - &encrypted_resource)) { |
| + if (!MakeBufferResource(pp_instance_,//media::Decryptor::kVideo, |
|
ddorwin
2012/11/17 02:07:38
Huh? Why not MakeMediaBufferResource?
xhwang
2012/11/18 00:10:33
Oops, I used this to test how much gain I have and
|
| + encrypted_buffer->GetData(), |
| + encrypted_buffer->GetDataSize(), |
| + &encrypted_resource)) { |
| return false; |
| } |
| @@ -890,5 +903,59 @@ void ContentDecryptorDelegate::CancelDecode( |
| } |
| } |
| +bool ContentDecryptorDelegate::MakeMediaBufferResource( |
| + media::Decryptor::StreamType stream_type, |
| + const uint8* data, int size, |
| + ScopedPPResource* resource) { |
| + TRACE_EVENT0("eme", "ContentDecryptorDelegate::MakeMediaBufferResource"); |
| + |
| + DCHECK(resource); |
| + |
| + if (!data || !size) { |
| + DCHECK(!data && !size); |
| + resource->Release(); |
| + return true; |
| + } |
| + |
| + DCHECK(stream_type == media::Decryptor::kAudio || |
| + stream_type == media::Decryptor::kVideo); |
| + ScopedPPResource& media_resource = (stream_type == media::Decryptor::kAudio) ? |
| + audio_input_resource_ : video_input_resource_; |
| + int& media_resource_size = (stream_type == media::Decryptor::kAudio) ? |
| + audio_input_resource_size_ : video_input_resource_size_; |
| + |
| + if (media_resource_size < size) { |
| + if (media_resource_size == 0) |
| + media_resource_size = kInitialMediaBufferSize; |
|
ddorwin
2012/11/17 02:07:38
Are you just trying to make it a power of 2? If so
xhwang
2012/11/18 00:10:33
It can really just be any size. Use power of 2 her
|
| + |
| + while (media_resource_size < size) { |
| + media_resource_size *= 2; |
|
ddorwin
2012/11/17 02:07:38
Should we just do pow(ceiling(log(size)))?
xhwang
2012/11/18 00:10:33
Using a while loop and double the size (shift one
|
| + } |
| + |
| + DVLOG(2) << "Size of media buffer for " |
| + << ((stream_type == media::Decryptor::kAudio) ? "audio" : "video") |
| + << " stream bumped to " << media_resource_size |
| + << " bytes to fit input."; |
| + media_resource = ScopedPPResource( |
| + ScopedPPResource::PassRef(), |
| + PPB_Buffer_Impl::Create(pp_instance_, media_resource_size)); |
| + } |
|
ddorwin
2012/11/17 02:07:38
If any of the above fails, we need to reset the ap
xhwang
2012/11/18 00:10:33
Added reset of media_resource and media_resource_s
ddorwin
2012/11/18 00:37:19
It's better to have a unit of code function correc
xhwang
2012/11/19 21:16:34
okay
|
| + |
| + if (!media_resource.get()) |
|
ddorwin
2012/11/17 02:07:38
This can never fail outside the bracket at 942 unl
xhwang
2012/11/18 00:10:33
This can happen for new created buffer. Move this
|
| + return false; |
| + |
| + EnterResourceNoLock<PPB_Buffer_API> enter(media_resource, true); |
| + if (enter.failed()) |
| + return false; |
| + |
| + BufferAutoMapper mapper(enter.object()); |
| + if (!mapper.data() || mapper.size() < static_cast<size_t>(size)) |
| + return false; |
| + memcpy(mapper.data(), data, size); |
| + |
| + *resource = media_resource; |
| + return true; |
| +} |
| + |
| } // namespace ppapi |
| } // namespace webkit |