Index: chrome/renderer/gpu_video_decoder_host.cc |
=================================================================== |
--- chrome/renderer/gpu_video_decoder_host.cc (revision 55418) |
+++ chrome/renderer/gpu_video_decoder_host.cc (working copy) |
@@ -1,199 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/renderer/gpu_video_decoder_host.h" |
- |
-#include "chrome/common/gpu_messages.h" |
-#include "chrome/renderer/gpu_video_service_host.h" |
-#include "chrome/renderer/render_thread.h" |
- |
-void GpuVideoDecoderHost::OnChannelError() { |
- channel_host_.release(); |
-} |
- |
-void GpuVideoDecoderHost::OnMessageReceived(const IPC::Message& msg) { |
- IPC_BEGIN_MESSAGE_MAP(GpuVideoDecoderHost, msg) |
- IPC_MESSAGE_HANDLER(GpuVideoDecoderHostMsg_InitializeACK, |
- OnInitializeDone) |
- IPC_MESSAGE_HANDLER(GpuVideoDecoderHostMsg_DestroyACK, |
- OnUninitializeDone) |
- IPC_MESSAGE_HANDLER(GpuVideoDecoderHostMsg_FlushACK, |
- OnFlushDone) |
- IPC_MESSAGE_HANDLER(GpuVideoDecoderHostMsg_EmptyThisBufferACK, |
- OnEmptyThisBufferACK) |
- IPC_MESSAGE_HANDLER(GpuVideoDecoderHostMsg_EmptyThisBufferDone, |
- OnEmptyThisBufferDone) |
- IPC_MESSAGE_HANDLER(GpuVideoDecoderHostMsg_FillThisBufferDone, |
- OnFillThisBufferDone) |
- IPC_MESSAGE_UNHANDLED_ERROR() |
- IPC_END_MESSAGE_MAP() |
-} |
- |
-bool GpuVideoDecoderHost::Initialize(const GpuVideoDecoderInitParam& param) { |
- DCHECK_EQ(state_, kStateUninitialized); |
- |
- init_param_ = param; |
- if (!channel_host_->Send( |
- new GpuVideoDecoderMsg_Initialize(route_id(), param))) { |
- LOG(ERROR) << "GpuVideoDecoderMsg_Initialize failed"; |
- return false; |
- } |
- return true; |
-} |
- |
-bool GpuVideoDecoderHost::Uninitialize() { |
- if (!channel_host_->Send(new GpuVideoDecoderMsg_Destroy(route_id()))) { |
- LOG(ERROR) << "GpuVideoDecoderMsg_Destroy failed"; |
- return false; |
- } |
- return true; |
-} |
- |
-void GpuVideoDecoderHost::EmptyThisBuffer(scoped_refptr<Buffer> buffer) { |
- DCHECK_NE(state_, kStateUninitialized); |
- DCHECK_NE(state_, kStateFlushing); |
- |
- // We never own input buffers, therefore when client in flush state, it |
- // never call us with EmptyThisBuffer. |
- if (state_ != kStateNormal) |
- return; |
- |
- input_buffer_queue_.push_back(buffer); |
- SendInputBufferToGpu(); |
-} |
- |
-void GpuVideoDecoderHost::FillThisBuffer(scoped_refptr<VideoFrame> frame) { |
- DCHECK_NE(state_, kStateUninitialized); |
- |
- // Depends on who provides buffer. client could return buffer to |
- // us while flushing. |
- if (state_ == kStateError) |
- return; |
- |
- GpuVideoDecoderOutputBufferParam param; |
- if (!channel_host_->Send( |
- new GpuVideoDecoderMsg_FillThisBuffer(route_id(), param))) { |
- LOG(ERROR) << "GpuVideoDecoderMsg_FillThisBuffer failed"; |
- } |
-} |
- |
-bool GpuVideoDecoderHost::Flush() { |
- state_ = kStateFlushing; |
- if (!channel_host_->Send(new GpuVideoDecoderMsg_Flush(route_id()))) { |
- LOG(ERROR) << "GpuVideoDecoderMsg_Flush failed"; |
- return false; |
- } |
- input_buffer_queue_.clear(); |
- // TODO(jiesun): because GpuVideoDeocder/GpuVideoDecoder are asynchronously. |
- // We need a way to make flush logic more clear. but I think ring buffer |
- // should make the busy flag obsolete, therefore I will leave it for now. |
- input_buffer_busy_ = false; |
- return true; |
-} |
- |
-void GpuVideoDecoderHost::OnInitializeDone( |
- const GpuVideoDecoderInitDoneParam& param) { |
- done_param_ = param; |
- bool success = false; |
- |
- do { |
- if (!param.success_) |
- break; |
- |
- if (!base::SharedMemory::IsHandleValid(param.input_buffer_handle_)) |
- break; |
- input_transfer_buffer_.reset( |
- new base::SharedMemory(param.input_buffer_handle_, false)); |
- 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); |
- |
- state_ = success ? kStateNormal : kStateError; |
- event_handler_->OnInitializeDone(success, param); |
-} |
- |
-void GpuVideoDecoderHost::OnUninitializeDone() { |
- input_transfer_buffer_.reset(); |
- output_transfer_buffer_.reset(); |
- |
- event_handler_->OnUninitializeDone(); |
-} |
- |
-void GpuVideoDecoderHost::OnFlushDone() { |
- state_ = kStateNormal; |
- event_handler_->OnFlushDone(); |
-} |
- |
-void GpuVideoDecoderHost::OnEmptyThisBufferDone() { |
- scoped_refptr<Buffer> buffer; |
- event_handler_->OnEmptyBufferDone(buffer); |
-} |
- |
-void GpuVideoDecoderHost::OnFillThisBufferDone( |
- const GpuVideoDecoderOutputBufferParam& param) { |
- scoped_refptr<VideoFrame> frame; |
- |
- if (param.flags_ & GpuVideoDecoderOutputBufferParam::kFlagsEndOfStream) { |
- VideoFrame::CreateEmptyFrame(&frame); |
- } else { |
- 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); |
- } |
- |
- event_handler_->OnFillBufferDone(frame); |
- if (!channel_host_->Send( |
- new GpuVideoDecoderMsg_FillThisBufferDoneACK(route_id()))) { |
- LOG(ERROR) << "GpuVideoDecoderMsg_FillThisBufferDoneACK failed"; |
- } |
-} |
- |
-void GpuVideoDecoderHost::OnEmptyThisBufferACK() { |
- input_buffer_busy_ = false; |
- SendInputBufferToGpu(); |
-} |
- |
-void GpuVideoDecoderHost::SendInputBufferToGpu() { |
- if (input_buffer_busy_) return; |
- if (input_buffer_queue_.empty()) return; |
- |
- input_buffer_busy_ = true; |
- |
- scoped_refptr<Buffer> buffer; |
- buffer = input_buffer_queue_.front(); |
- input_buffer_queue_.pop_front(); |
- |
- // Send input data to GPU process. |
- GpuVideoDecoderInputBufferParam param; |
- param.offset_ = 0; |
- param.size_ = buffer->GetDataSize(); |
- param.timestamp_ = buffer->GetTimestamp().InMicroseconds(); |
- memcpy(input_transfer_buffer_->memory(), buffer->GetData(), param.size_); |
- if (!channel_host_->Send( |
- new GpuVideoDecoderMsg_EmptyThisBuffer(route_id(), param))) { |
- LOG(ERROR) << "GpuVideoDecoderMsg_EmptyThisBuffer failed"; |
- } |
-} |
- |