| Index: chrome/renderer/media/ipc_video_renderer.cc
|
| ===================================================================
|
| --- chrome/renderer/media/ipc_video_renderer.cc (revision 65168)
|
| +++ chrome/renderer/media/ipc_video_renderer.cc (working copy)
|
| @@ -1,162 +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/media/ipc_video_renderer.h"
|
| -
|
| -#include "chrome/common/render_messages.h"
|
| -#include "chrome/renderer/render_thread.h"
|
| -#include "media/base/video_frame.h"
|
| -#include "media/base/media_format.h"
|
| -
|
| -IPCVideoRenderer::IPCVideoRenderer(int routing_id)
|
| - : created_(false),
|
| - routing_id_(routing_id),
|
| - stopped_(false, false) {
|
| -}
|
| -
|
| -IPCVideoRenderer::~IPCVideoRenderer() {
|
| -}
|
| -
|
| -bool IPCVideoRenderer::OnInitialize(media::VideoDecoder* decoder) {
|
| - video_size_.SetSize(width(), height());
|
| -
|
| - // TODO(scherkus): we're assuming YV12 here.
|
| - size_t size = (width() * height()) + ((width() * height()) >> 1);
|
| - uint32 epoch = static_cast<uint32>(reinterpret_cast<size_t>(this));
|
| - transport_dib_.reset(TransportDIB::Create(size, epoch));
|
| - CHECK(transport_dib_.get());
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void IPCVideoRenderer::OnStop(media::FilterCallback* callback) {
|
| - stopped_.Signal();
|
| -
|
| - proxy_->message_loop()->PostTask(FROM_HERE,
|
| - NewRunnableMethod(this, &IPCVideoRenderer::DoDestroyVideo, callback));
|
| -}
|
| -
|
| -void IPCVideoRenderer::OnFrameAvailable() {
|
| - proxy_->message_loop()->PostTask(FROM_HERE,
|
| - NewRunnableMethod(this, &IPCVideoRenderer::DoUpdateVideo));
|
| -}
|
| -
|
| -void IPCVideoRenderer::SetWebMediaPlayerImplProxy(
|
| - webkit_glue::WebMediaPlayerImpl::Proxy* proxy) {
|
| - proxy_ = proxy;
|
| -}
|
| -
|
| -void IPCVideoRenderer::SetRect(const gfx::Rect& rect) {
|
| - DCHECK(MessageLoop::current() == proxy_->message_loop());
|
| -
|
| - // TODO(scherkus): this is actually a SetSize() call... there's a pending
|
| - // WebKit bug to get this fixed up. It would be nice if this was a real
|
| - // SetRect() call so we could get the absolute coordinates instead of relying
|
| - // on Paint().
|
| -}
|
| -
|
| -void IPCVideoRenderer::Paint(skia::PlatformCanvas* canvas,
|
| - const gfx::Rect& dest_rect) {
|
| - DCHECK(MessageLoop::current() == proxy_->message_loop());
|
| -
|
| - // Copy the rect for UpdateVideo messages.
|
| - video_rect_ = dest_rect;
|
| -
|
| - if (!created_) {
|
| - created_ = true;
|
| - Send(new ViewHostMsg_CreateVideo(routing_id_, video_size_));
|
| -
|
| - // Force an update in case the first frame arrived before the first
|
| - // Paint() call.
|
| - DoUpdateVideo();
|
| - }
|
| -
|
| - // TODO(scherkus): code to punch a hole through the backing store goes here.
|
| - // We don't need it right away since we don't do a proper alpha composite
|
| - // between the browser BackingStore and VideoLayer.
|
| -}
|
| -
|
| -void IPCVideoRenderer::Send(IPC::Message* msg) {
|
| - DCHECK(routing_id_ != MSG_ROUTING_NONE);
|
| - DCHECK(routing_id_ == msg->routing_id());
|
| -
|
| - bool result = RenderThread::current()->Send(msg);
|
| - LOG_IF(ERROR, !result) << "RenderThread::current()->Send(msg) failed";
|
| -}
|
| -
|
| -void IPCVideoRenderer::DoUpdateVideo() {
|
| - DCHECK(MessageLoop::current() == proxy_->message_loop());
|
| -
|
| - // Nothing to do if we don't know where we are positioned on the page.
|
| - if (!created_ || video_rect_.IsEmpty() || stopped_.IsSignaled()) {
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<media::VideoFrame> frame;
|
| - GetCurrentFrame(&frame);
|
| - if (!frame) {
|
| - PutCurrentFrame(frame);
|
| - return;
|
| - }
|
| -
|
| - CHECK(frame->width() == static_cast<size_t>(video_size_.width()));
|
| - CHECK(frame->height() == static_cast<size_t>(video_size_.height()));
|
| - CHECK(frame->format() == media::VideoFrame::YV12);
|
| - CHECK(frame->planes() == 3);
|
| -
|
| - uint8* dest = reinterpret_cast<uint8*>(transport_dib_->memory());
|
| -
|
| - // Copy Y plane.
|
| - const uint8* src = frame->data(media::VideoFrame::kYPlane);
|
| - size_t stride = frame->stride(media::VideoFrame::kYPlane);
|
| - for (size_t row = 0; row < frame->height(); ++row) {
|
| - memcpy(dest, src, frame->width());
|
| - dest += frame->width();
|
| - src += stride;
|
| - }
|
| -
|
| - // Copy U plane.
|
| - src = frame->data(media::VideoFrame::kUPlane);
|
| - stride = frame->stride(media::VideoFrame::kUPlane);
|
| - for (size_t row = 0; row < frame->height() / 2; ++row) {
|
| - memcpy(dest, src, frame->width() / 2);
|
| - dest += frame->width() / 2;
|
| - src += stride;
|
| - }
|
| -
|
| - // Copy V plane.
|
| - src = frame->data(media::VideoFrame::kVPlane);
|
| - stride = frame->stride(media::VideoFrame::kVPlane);
|
| - for (size_t row = 0; row < frame->height() / 2; ++row) {
|
| - memcpy(dest, src, frame->width() / 2);
|
| - dest += frame->width() / 2;
|
| - src += stride;
|
| - }
|
| -
|
| - PutCurrentFrame(frame);
|
| -
|
| - // Sanity check!
|
| - uint8* expected = reinterpret_cast<uint8*>(transport_dib_->memory()) +
|
| - transport_dib_->size();
|
| - CHECK(dest == expected);
|
| -
|
| - Send(new ViewHostMsg_UpdateVideo(routing_id_,
|
| - transport_dib_->id(),
|
| - video_rect_));
|
| -}
|
| -
|
| -void IPCVideoRenderer::DoDestroyVideo(media::FilterCallback* callback) {
|
| - DCHECK(MessageLoop::current() == proxy_->message_loop());
|
| -
|
| - // We shouldn't receive any more messages after the browser receives this.
|
| - Send(new ViewHostMsg_DestroyVideo(routing_id_));
|
| -
|
| - // Detach ourselves from the proxy.
|
| - proxy_->SetVideoRenderer(NULL);
|
| - proxy_ = NULL;
|
| - if (callback) {
|
| - callback->Run();
|
| - delete callback;
|
| - }
|
| -}
|
|
|