diff options
-rw-r--r-- | content/common/gpu/gpu_video_decode_accelerator.cc | 13 | ||||
-rw-r--r-- | content/gpu/omx_video_decode_accelerator.cc | 21 | ||||
-rw-r--r-- | content/gpu/omx_video_decode_accelerator.h | 10 | ||||
-rw-r--r-- | content/renderer/gpu_video_decode_accelerator_host.cc | 11 | ||||
-rw-r--r-- | media/base/bitstream_buffer.h | 20 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_video_decoder_impl.cc | 10 |
6 files changed, 51 insertions, 34 deletions
diff --git a/content/common/gpu/gpu_video_decode_accelerator.cc b/content/common/gpu/gpu_video_decode_accelerator.cc index 35d0a0b..e962968 100644 --- a/content/common/gpu/gpu_video_decode_accelerator.cc +++ b/content/common/gpu/gpu_video_decode_accelerator.cc @@ -117,8 +117,9 @@ void GpuVideoDecodeAccelerator::OnInitialize( void GpuVideoDecodeAccelerator::OnDecode(int32 id, base::SharedMemoryHandle handle, int32 size) { - // TODO(vrk): Implement. - NOTIMPLEMENTED(); + if (!video_decode_accelerator_) + return; + video_decode_accelerator_->Decode(media::BitstreamBuffer(id, handle, size)); } void GpuVideoDecodeAccelerator::OnAssignGLESBuffers( @@ -164,8 +165,12 @@ void GpuVideoDecodeAccelerator::OnAbort() { void GpuVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer( int32 bitstream_buffer_id) { - // TODO(vrk): Implement. - NOTIMPLEMENTED(); + if (!Send(new AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed( + route_id_, bitstream_buffer_id))) { + DLOG(ERROR) + << "Send(AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed) " + << "failed"; + } } void GpuVideoDecodeAccelerator::NotifyFlushDone() { diff --git a/content/gpu/omx_video_decode_accelerator.cc b/content/gpu/omx_video_decode_accelerator.cc index 32f8eec..3367cd9 100644 --- a/content/gpu/omx_video_decode_accelerator.cc +++ b/content/gpu/omx_video_decode_accelerator.cc @@ -248,7 +248,7 @@ bool OmxVideoDecodeAccelerator::CreateComponent() { } bool OmxVideoDecodeAccelerator::Decode( - media::BitstreamBuffer* bitstream_buffer, + const media::BitstreamBuffer& bitstream_buffer, const media::VideoDecodeAcceleratorCallback& callback) { DCHECK(!free_input_buffers_.empty()); DCHECK(bitstream_buffer); @@ -260,9 +260,15 @@ bool OmxVideoDecodeAccelerator::Decode( OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front(); free_input_buffers_.pop(); - // setup |omx_buffer|. - omx_buffer->pBuffer = static_cast<OMX_U8*>(bitstream_buffer->bitstream()); - omx_buffer->nFilledLen = bitstream_buffer->bitstream_size(); + // Setup |omx_buffer|. + scoped_ptr<base::SharedMemory> shm( + new base::SharedMemory(bitstream_buffer.handle(), true)); + if (!shm->Map(bitstream_buffer.size())) { + LOG(ERROR) << "Failed to SharedMemory::Map()."; + return false; + } + omx_buffer->pBuffer = static_cast<OMX_U8*>(shm->memory()); + omx_buffer->nFilledLen = bitstream_buffer->size(); omx_buffer->nAllocLen = omx_buffer->nFilledLen; omx_buffer->nFlags &= ~OMX_BUFFERFLAG_EOS; @@ -279,7 +285,8 @@ bool OmxVideoDecodeAccelerator::Decode( input_buffers_at_component_++; // OMX_EmptyThisBuffer is a non blocking call and should // not make any assumptions about its completion. - omx_buff_cb_.insert(std::make_pair(omx_buffer, callback)); + omx_buff_cb_.insert(std::make_pair( + omx_buffer, make_pair(shm.release(), callback))); return true; } @@ -729,7 +736,8 @@ void OmxVideoDecodeAccelerator::EmptyBufferDoneTask( StopOnError(); return; } - it->second.Run(); + delete it->second.first; + it->second.second.Run(); omx_buff_cb_.erase(it); } @@ -879,4 +887,3 @@ void OmxVideoDecodeAccelerator::ChangePort( } DISABLE_RUNNABLE_METHOD_REFCOUNT(OmxVideoDecodeAccelerator); - diff --git a/content/gpu/omx_video_decode_accelerator.h b/content/gpu/omx_video_decode_accelerator.h index 522f8fa..ea4e6c2 100644 --- a/content/gpu/omx_video_decode_accelerator.h +++ b/content/gpu/omx_video_decode_accelerator.h @@ -16,6 +16,7 @@ #include "base/callback.h" #include "base/logging.h" #include "base/message_loop.h" +#include "base/shared_memory.h" #include "media/video/video_decode_accelerator.h" #include "third_party/openmax/il/OMX_Component.h" #include "third_party/openmax/il/OMX_Core.h" @@ -32,7 +33,7 @@ class OmxVideoDecodeAccelerator : public media::VideoDecodeAccelerator { const std::vector<uint32>& GetConfig( const std::vector<uint32>& prototype_config); bool Initialize(const std::vector<uint32>& config); - bool Decode(media::BitstreamBuffer* bitstream_buffer, + bool Decode(const media::BitstreamBuffer& bitstream_buffer, const media::VideoDecodeAcceleratorCallback& callback); void AssignPictureBuffer(std::vector<PictureBuffer*> picture_buffers); void ReusePictureBuffer(int32 picture_buffer_id); @@ -129,8 +130,10 @@ class OmxVideoDecodeAccelerator : public media::VideoDecodeAccelerator { // void pointer to hold EGLImage handle. void* egl_image_; - typedef std::map<OMX_BUFFERHEADERTYPE*, - media::VideoDecodeAcceleratorCallback> OMXBufferCallbackMap; + typedef std::map< + OMX_BUFFERHEADERTYPE*, + std::pair<base::SharedMemory*, + media::VideoDecodeAcceleratorCallback> > OMXBufferCallbackMap; OMXBufferCallbackMap omx_buff_cb_; // Method used the change the state of the port. @@ -160,4 +163,3 @@ class OmxVideoDecodeAccelerator : public media::VideoDecodeAccelerator { }; #endif // CONTENT_GPU_OMX_VIDEO_DECODE_ACCELERATOR_H_ - diff --git a/content/renderer/gpu_video_decode_accelerator_host.cc b/content/renderer/gpu_video_decode_accelerator_host.cc index bfc66ad..2b2d027 100644 --- a/content/renderer/gpu_video_decode_accelerator_host.cc +++ b/content/renderer/gpu_video_decode_accelerator_host.cc @@ -87,9 +87,14 @@ bool GpuVideoDecodeAcceleratorHost::Initialize( bool GpuVideoDecodeAcceleratorHost::Decode( const media::BitstreamBuffer& bitstream_buffer) { - // TODO(vrk): Implement. - NOTIMPLEMENTED(); - return false; + if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Decode( + decoder_id_, bitstream_buffer.id(), + bitstream_buffer.handle(), bitstream_buffer.size()))) { + DLOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Decode) failed"; + return false; + } + + return true; } void GpuVideoDecodeAcceleratorHost::AssignGLESBuffers( diff --git a/media/base/bitstream_buffer.h b/media/base/bitstream_buffer.h index bd9b843..3510776 100644 --- a/media/base/bitstream_buffer.h +++ b/media/base/bitstream_buffer.h @@ -6,30 +6,30 @@ #define MEDIA_BASE_BITSTREAM_BUFFER_H_ #include "base/basictypes.h" +#include "base/shared_memory.h" namespace media { -// Class for passing bitstream buffers around. Ownership of the bitstream -// pointer remains with whoever uses this class. -// This is media-namespace equivalent of PP_BitstreamBuffer_Dev. +// Class for passing bitstream buffers around. Does not take ownership of the +// data. This is the media-namespace equivalent of PP_VideoBitstreamBuffer_Dev. class BitstreamBuffer { public: - BitstreamBuffer(int32 id, uint8* data, size_t size) + BitstreamBuffer(int32 id, base::SharedMemoryHandle handle, size_t size) : id_(id), - data_(data), + handle_(handle), size_(size) { } int32 id() const { return id_; } - uint8* data() const { return data_; } + base::SharedMemoryHandle handle() const { return handle_; } size_t size() const { return size_; } private: - int32 id_; - uint8* data_; - size_t size_; + const int32 id_; + const base::SharedMemoryHandle handle_; + const size_t size_; - DISALLOW_IMPLICIT_CONSTRUCTORS(BitstreamBuffer); + // Allow compiler-generated copy & assign constructors. }; } // namespace media diff --git a/webkit/plugins/ppapi/ppb_video_decoder_impl.cc b/webkit/plugins/ppapi/ppb_video_decoder_impl.cc index 5c317ee..76edf08 100644 --- a/webkit/plugins/ppapi/ppb_video_decoder_impl.cc +++ b/webkit/plugins/ppapi/ppb_video_decoder_impl.cc @@ -233,12 +233,10 @@ bool PPB_VideoDecoder_Impl::Decode( if (!platform_video_decoder_.get()) return false; - scoped_refptr<PPB_Buffer_Impl> pepper_buffer = - Resource::GetAs<PPB_Buffer_Impl>(bitstream_buffer->data); - - media::BitstreamBuffer decode_buffer(bitstream_buffer->id, - pepper_buffer->mapped_buffer(), - bitstream_buffer->size); + media::BitstreamBuffer decode_buffer( + bitstream_buffer->id, + Resource::GetAs<PPB_Buffer_Impl>(bitstream_buffer->data)->handle(), + bitstream_buffer->size); // Store the callback to inform when bitstream buffer has been processed. // TODO(vmr): handle simultaneous decodes + callbacks. |