Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: chrome/renderer/media/ipc_video_renderer.cc

Issue 4399003: Deleted code associated with --enable-gpu-rendering and... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/media/ipc_video_renderer.h ('k') | chrome/renderer/render_view.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/renderer/media/ipc_video_renderer.h"
6
7 #include "chrome/common/render_messages.h"
8 #include "chrome/renderer/render_thread.h"
9 #include "media/base/video_frame.h"
10 #include "media/base/media_format.h"
11
12 IPCVideoRenderer::IPCVideoRenderer(int routing_id)
13 : created_(false),
14 routing_id_(routing_id),
15 stopped_(false, false) {
16 }
17
18 IPCVideoRenderer::~IPCVideoRenderer() {
19 }
20
21 bool IPCVideoRenderer::OnInitialize(media::VideoDecoder* decoder) {
22 video_size_.SetSize(width(), height());
23
24 // TODO(scherkus): we're assuming YV12 here.
25 size_t size = (width() * height()) + ((width() * height()) >> 1);
26 uint32 epoch = static_cast<uint32>(reinterpret_cast<size_t>(this));
27 transport_dib_.reset(TransportDIB::Create(size, epoch));
28 CHECK(transport_dib_.get());
29
30 return true;
31 }
32
33 void IPCVideoRenderer::OnStop(media::FilterCallback* callback) {
34 stopped_.Signal();
35
36 proxy_->message_loop()->PostTask(FROM_HERE,
37 NewRunnableMethod(this, &IPCVideoRenderer::DoDestroyVideo, callback));
38 }
39
40 void IPCVideoRenderer::OnFrameAvailable() {
41 proxy_->message_loop()->PostTask(FROM_HERE,
42 NewRunnableMethod(this, &IPCVideoRenderer::DoUpdateVideo));
43 }
44
45 void IPCVideoRenderer::SetWebMediaPlayerImplProxy(
46 webkit_glue::WebMediaPlayerImpl::Proxy* proxy) {
47 proxy_ = proxy;
48 }
49
50 void IPCVideoRenderer::SetRect(const gfx::Rect& rect) {
51 DCHECK(MessageLoop::current() == proxy_->message_loop());
52
53 // TODO(scherkus): this is actually a SetSize() call... there's a pending
54 // WebKit bug to get this fixed up. It would be nice if this was a real
55 // SetRect() call so we could get the absolute coordinates instead of relying
56 // on Paint().
57 }
58
59 void IPCVideoRenderer::Paint(skia::PlatformCanvas* canvas,
60 const gfx::Rect& dest_rect) {
61 DCHECK(MessageLoop::current() == proxy_->message_loop());
62
63 // Copy the rect for UpdateVideo messages.
64 video_rect_ = dest_rect;
65
66 if (!created_) {
67 created_ = true;
68 Send(new ViewHostMsg_CreateVideo(routing_id_, video_size_));
69
70 // Force an update in case the first frame arrived before the first
71 // Paint() call.
72 DoUpdateVideo();
73 }
74
75 // TODO(scherkus): code to punch a hole through the backing store goes here.
76 // We don't need it right away since we don't do a proper alpha composite
77 // between the browser BackingStore and VideoLayer.
78 }
79
80 void IPCVideoRenderer::Send(IPC::Message* msg) {
81 DCHECK(routing_id_ != MSG_ROUTING_NONE);
82 DCHECK(routing_id_ == msg->routing_id());
83
84 bool result = RenderThread::current()->Send(msg);
85 LOG_IF(ERROR, !result) << "RenderThread::current()->Send(msg) failed";
86 }
87
88 void IPCVideoRenderer::DoUpdateVideo() {
89 DCHECK(MessageLoop::current() == proxy_->message_loop());
90
91 // Nothing to do if we don't know where we are positioned on the page.
92 if (!created_ || video_rect_.IsEmpty() || stopped_.IsSignaled()) {
93 return;
94 }
95
96 scoped_refptr<media::VideoFrame> frame;
97 GetCurrentFrame(&frame);
98 if (!frame) {
99 PutCurrentFrame(frame);
100 return;
101 }
102
103 CHECK(frame->width() == static_cast<size_t>(video_size_.width()));
104 CHECK(frame->height() == static_cast<size_t>(video_size_.height()));
105 CHECK(frame->format() == media::VideoFrame::YV12);
106 CHECK(frame->planes() == 3);
107
108 uint8* dest = reinterpret_cast<uint8*>(transport_dib_->memory());
109
110 // Copy Y plane.
111 const uint8* src = frame->data(media::VideoFrame::kYPlane);
112 size_t stride = frame->stride(media::VideoFrame::kYPlane);
113 for (size_t row = 0; row < frame->height(); ++row) {
114 memcpy(dest, src, frame->width());
115 dest += frame->width();
116 src += stride;
117 }
118
119 // Copy U plane.
120 src = frame->data(media::VideoFrame::kUPlane);
121 stride = frame->stride(media::VideoFrame::kUPlane);
122 for (size_t row = 0; row < frame->height() / 2; ++row) {
123 memcpy(dest, src, frame->width() / 2);
124 dest += frame->width() / 2;
125 src += stride;
126 }
127
128 // Copy V plane.
129 src = frame->data(media::VideoFrame::kVPlane);
130 stride = frame->stride(media::VideoFrame::kVPlane);
131 for (size_t row = 0; row < frame->height() / 2; ++row) {
132 memcpy(dest, src, frame->width() / 2);
133 dest += frame->width() / 2;
134 src += stride;
135 }
136
137 PutCurrentFrame(frame);
138
139 // Sanity check!
140 uint8* expected = reinterpret_cast<uint8*>(transport_dib_->memory()) +
141 transport_dib_->size();
142 CHECK(dest == expected);
143
144 Send(new ViewHostMsg_UpdateVideo(routing_id_,
145 transport_dib_->id(),
146 video_rect_));
147 }
148
149 void IPCVideoRenderer::DoDestroyVideo(media::FilterCallback* callback) {
150 DCHECK(MessageLoop::current() == proxy_->message_loop());
151
152 // We shouldn't receive any more messages after the browser receives this.
153 Send(new ViewHostMsg_DestroyVideo(routing_id_));
154
155 // Detach ourselves from the proxy.
156 proxy_->SetVideoRenderer(NULL);
157 proxy_ = NULL;
158 if (callback) {
159 callback->Run();
160 delete callback;
161 }
162 }
OLDNEW
« no previous file with comments | « chrome/renderer/media/ipc_video_renderer.h ('k') | chrome/renderer/render_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698