summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/common/gpu/gpu_video_decode_accelerator.cc13
-rw-r--r--content/gpu/omx_video_decode_accelerator.cc21
-rw-r--r--content/gpu/omx_video_decode_accelerator.h10
-rw-r--r--content/renderer/gpu_video_decode_accelerator_host.cc11
-rw-r--r--media/base/bitstream_buffer.h20
-rw-r--r--webkit/plugins/ppapi/ppb_video_decoder_impl.cc10
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.