summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/gpu_video_decoder_host.cc37
-rw-r--r--chrome/renderer/gpu_video_decoder_host.h1
-rw-r--r--chrome/renderer/media/gles2_video_decode_context.cc8
-rw-r--r--chrome/renderer/media/gles2_video_decode_context.h9
-rw-r--r--chrome/renderer/media/ipc_video_decoder.cc7
5 files changed, 45 insertions, 17 deletions
diff --git a/chrome/renderer/gpu_video_decoder_host.cc b/chrome/renderer/gpu_video_decoder_host.cc
index 771c38a..a585ede 100644
--- a/chrome/renderer/gpu_video_decoder_host.cc
+++ b/chrome/renderer/gpu_video_decoder_host.cc
@@ -109,9 +109,12 @@ void GpuVideoDecoderHost::FillThisBuffer(scoped_refptr<VideoFrame> frame) {
// TODO(hclam): We should keep an IDMap to convert between a frame a buffer
// ID so that we can signal GpuVideoDecoder in GPU process to use the buffer.
// This eliminates one conversion step.
- // TODO(hclam): Fill the param.
GpuVideoDecoderOutputBufferParam param;
+ // TODO(hclam): This is a hack to pass the texture id to the hardware video
+ // decoder. We should have created a mapping between VideoFrame and buffer id
+ // and we pass the buffer id to the GPU process.
+ param.texture = frame->gl_texture(VideoFrame::kRGBPlane);
if (!channel_host_ || !channel_host_->Send(
new GpuVideoDecoderMsg_FillThisBuffer(route_id(), param))) {
LOG(ERROR) << "GpuVideoDecoderMsg_FillThisBuffer failed";
@@ -149,6 +152,13 @@ void GpuVideoDecoderHost::OnInitializeDone(
if (!input_transfer_buffer_->Map(param.input_buffer_size))
break;
+ if (!base::SharedMemory::IsHandleValid(param.output_buffer_handle))
+ break;
+ output_transfer_buffer_.reset(
+ new base::SharedMemory(param.output_buffer_handle, false));
+ if (!output_transfer_buffer_->Map(param.output_buffer_size))
+ break;
+
success = true;
} while (0);
@@ -158,6 +168,7 @@ void GpuVideoDecoderHost::OnInitializeDone(
void GpuVideoDecoderHost::OnUninitializeDone() {
input_transfer_buffer_.reset();
+ output_transfer_buffer_.reset();
event_handler_->OnUninitializeDone();
}
@@ -178,11 +189,27 @@ void GpuVideoDecoderHost::OnFillThisBufferDone(
if (param.flags & GpuVideoDecoderOutputBufferParam::kFlagsEndOfStream) {
VideoFrame::CreateEmptyFrame(&frame);
- } else {
+ } else if (done_param_.surface_type ==
+ media::VideoFrame::TYPE_SYSTEM_MEMORY) {
+ VideoFrame::CreateFrame(VideoFrame::YV12,
+ init_param_.width,
+ init_param_.height,
+ base::TimeDelta::FromMicroseconds(param.timestamp),
+ base::TimeDelta::FromMicroseconds(param.duration),
+ &frame);
+ uint8* src = static_cast<uint8*>(output_transfer_buffer_->memory());
+ uint8* data0 = frame->data(0);
+ uint8* data1 = frame->data(1);
+ uint8* data2 = frame->data(2);
+ int32 size = init_param_.width * init_param_.height;
+ memcpy(data0, src, size);
+ memcpy(data1, src + size, size / 4);
+ memcpy(data2, src + size + size / 4, size / 4);
+ } else if (done_param_.surface_type == media::VideoFrame::TYPE_GL_TEXTURE) {
// TODO(hclam): The logic in buffer allocation is pretty much around
- // using shared memory for output buffer which needs to be adjusted.
- // Fake the texture ID until we implement it properly.
- VideoFrame::GlTexture textures[3] = { 0, 0, 0 };
+ // using shared memory for output buffer which needs to be adjusted. For
+ // now we have to add this hack to get the texture id.
+ VideoFrame::GlTexture textures[3] = { param.texture, 0, 0 };
media::VideoFrame::CreateFrameGlTexture(
media::VideoFrame::RGBA, init_param_.width, init_param_.height,
textures,
diff --git a/chrome/renderer/gpu_video_decoder_host.h b/chrome/renderer/gpu_video_decoder_host.h
index 1255bf5..02f8fc8 100644
--- a/chrome/renderer/gpu_video_decoder_host.h
+++ b/chrome/renderer/gpu_video_decoder_host.h
@@ -112,6 +112,7 @@ class GpuVideoDecoderHost
// Transfer buffers for both input and output.
// TODO(jiesun): remove output buffer when hardware composition is ready.
scoped_ptr<base::SharedMemory> input_transfer_buffer_;
+ scoped_ptr<base::SharedMemory> output_transfer_buffer_;
DISALLOW_COPY_AND_ASSIGN(GpuVideoDecoderHost);
};
diff --git a/chrome/renderer/media/gles2_video_decode_context.cc b/chrome/renderer/media/gles2_video_decode_context.cc
index 2c04282..075f80a 100644
--- a/chrome/renderer/media/gles2_video_decode_context.cc
+++ b/chrome/renderer/media/gles2_video_decode_context.cc
@@ -20,15 +20,15 @@ void* Gles2VideoDecodeContext::GetDevice() {
}
void Gles2VideoDecodeContext::AllocateVideoFrames(
- int n, size_t width, size_t height, media::VideoFrame::Format format,
- std::vector<scoped_refptr<media::VideoFrame> >* frames, Task* task) {
+ int n, size_t width, size_t height, AllocationCompleteCallback* callback) {
// TODO(hclam): Implement.
}
-void Gles2VideoDecodeContext::ReleaseAllVideoFrames() {
+void Gles2VideoDecodeContext::ReleaseVideoFrames(int n,
+ media::VideoFrame* frames) {
// TODO(hclam): Implement.
}
-void Gles2VideoDecodeContext::Destroy(Task* task) {
+void Gles2VideoDecodeContext::Destroy(DestructionCompleteCallback* callback) {
// TODO(hclam): Implement.
}
diff --git a/chrome/renderer/media/gles2_video_decode_context.h b/chrome/renderer/media/gles2_video_decode_context.h
index 35958b6..e087bb3 100644
--- a/chrome/renderer/media/gles2_video_decode_context.h
+++ b/chrome/renderer/media/gles2_video_decode_context.h
@@ -95,11 +95,10 @@ class Gles2VideoDecodeContext : public media::VideoDecodeContext {
// media::VideoDecodeContext implementation.
virtual void* GetDevice();
- virtual void AllocateVideoFrames(
- int n, size_t width, size_t height, media::VideoFrame::Format format,
- std::vector<scoped_refptr<media::VideoFrame> >* frames, Task* task);
- virtual void ReleaseAllVideoFrames();
- virtual void Destroy(Task* task) = 0;
+ virtual void AllocateVideoFrames(int n, size_t width, size_t height,
+ AllocationCompleteCallback* callback);
+ virtual void ReleaseVideoFrames(int n, media::VideoFrame* frames);
+ virtual void Destroy(DestructionCompleteCallback* callback);
//--------------------------------------------------------------------------
// Any thread
diff --git a/chrome/renderer/media/ipc_video_decoder.cc b/chrome/renderer/media/ipc_video_decoder.cc
index eda8696..0b6896b 100644
--- a/chrome/renderer/media/ipc_video_decoder.cc
+++ b/chrome/renderer/media/ipc_video_decoder.cc
@@ -111,9 +111,10 @@ void IpcVideoDecoder::OnInitializeDone(
media::mime_type::kUncompressedVideo);
media_format_.SetAsInteger(media::MediaFormat::kWidth, width_);
media_format_.SetAsInteger(media::MediaFormat::kHeight, height_);
- media_format_.SetAsInteger(
- media::MediaFormat::kSurfaceType,
- static_cast<int>(media::VideoFrame::TYPE_GL_TEXTURE));
+ media_format_.SetAsInteger(media::MediaFormat::kSurfaceType,
+ static_cast<int>(param.surface_type));
+ media_format_.SetAsInteger(media::MediaFormat::kSurfaceFormat,
+ static_cast<int>(param.format));
state_ = kPlaying;
} else {
LOG(ERROR) << "IpcVideoDecoder initialization failed!";