OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/renderer/media/ipc_video_renderer.h" | 5 #include "chrome/renderer/media/ipc_video_renderer.h" |
6 | 6 |
7 #include "chrome/common/render_messages.h" | 7 #include "chrome/common/render_messages.h" |
8 #include "chrome/renderer/render_thread.h" | 8 #include "chrome/renderer/render_thread.h" |
9 #include "media/base/buffers.h" | 9 #include "media/base/video_frame.h" |
10 #include "media/base/media_format.h" | 10 #include "media/base/media_format.h" |
11 | 11 |
12 IPCVideoRenderer::IPCVideoRenderer( | 12 IPCVideoRenderer::IPCVideoRenderer( |
13 webkit_glue::WebMediaPlayerImpl::Proxy* proxy, | 13 webkit_glue::WebMediaPlayerImpl::Proxy* proxy, |
14 int routing_id) | 14 int routing_id) |
15 : proxy_(proxy), | 15 : proxy_(proxy), |
16 created_(false), | 16 created_(false), |
17 routing_id_(routing_id), | 17 routing_id_(routing_id), |
18 stopped_(false, false) { | 18 stopped_(false, false) { |
19 // TODO(hclam): decide whether to do the following line in this thread or | 19 // TODO(hclam): decide whether to do the following line in this thread or |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 if (!created_ || video_rect_.IsEmpty() || stopped_.IsSignaled()) { | 116 if (!created_ || video_rect_.IsEmpty() || stopped_.IsSignaled()) { |
117 return; | 117 return; |
118 } | 118 } |
119 | 119 |
120 scoped_refptr<media::VideoFrame> frame; | 120 scoped_refptr<media::VideoFrame> frame; |
121 GetCurrentFrame(&frame); | 121 GetCurrentFrame(&frame); |
122 if (!frame) { | 122 if (!frame) { |
123 return; | 123 return; |
124 } | 124 } |
125 | 125 |
126 media::VideoSurface surface; | 126 CHECK(frame->width() == static_cast<size_t>(video_size_.width())); |
127 CHECK(frame->Lock(&surface)); | 127 CHECK(frame->height() == static_cast<size_t>(video_size_.height())); |
128 CHECK(surface.width == static_cast<size_t>(video_size_.width())); | 128 CHECK(frame->format() == media::VideoFrame::YV12); |
129 CHECK(surface.height == static_cast<size_t>(video_size_.height())); | 129 CHECK(frame->planes() == 3); |
130 CHECK(surface.format == media::VideoSurface::YV12); | |
131 CHECK(surface.planes == 3); | |
132 | 130 |
133 uint8* dest = reinterpret_cast<uint8*>(transport_dib_->memory()); | 131 uint8* dest = reinterpret_cast<uint8*>(transport_dib_->memory()); |
134 | 132 |
135 // Copy Y plane. | 133 // Copy Y plane. |
136 const uint8* src = surface.data[media::VideoSurface::kYPlane]; | 134 const uint8* src = frame->data(media::VideoFrame::kYPlane); |
137 size_t stride = surface.strides[media::VideoSurface::kYPlane]; | 135 size_t stride = frame->stride(media::VideoFrame::kYPlane); |
138 for (size_t row = 0; row < surface.height; ++row) { | 136 for (size_t row = 0; row < frame->height(); ++row) { |
139 memcpy(dest, src, surface.width); | 137 memcpy(dest, src, frame->width()); |
140 dest += surface.width; | 138 dest += frame->width(); |
141 src += stride; | 139 src += stride; |
142 } | 140 } |
143 | 141 |
144 // Copy U plane. | 142 // Copy U plane. |
145 src = surface.data[media::VideoSurface::kUPlane]; | 143 src = frame->data(media::VideoFrame::kUPlane); |
146 stride = surface.strides[media::VideoSurface::kUPlane]; | 144 stride = frame->stride(media::VideoFrame::kUPlane); |
147 for (size_t row = 0; row < surface.height / 2; ++row) { | 145 for (size_t row = 0; row < frame->height() / 2; ++row) { |
148 memcpy(dest, src, surface.width / 2); | 146 memcpy(dest, src, frame->width() / 2); |
149 dest += surface.width / 2; | 147 dest += frame->width() / 2; |
150 src += stride; | 148 src += stride; |
151 } | 149 } |
152 | 150 |
153 // Copy V plane. | 151 // Copy V plane. |
154 src = surface.data[media::VideoSurface::kVPlane]; | 152 src = frame->data(media::VideoFrame::kVPlane); |
155 stride = surface.strides[media::VideoSurface::kVPlane]; | 153 stride = frame->stride(media::VideoFrame::kVPlane); |
156 for (size_t row = 0; row < surface.height / 2; ++row) { | 154 for (size_t row = 0; row < frame->height() / 2; ++row) { |
157 memcpy(dest, src, surface.width / 2); | 155 memcpy(dest, src, frame->width() / 2); |
158 dest += surface.width / 2; | 156 dest += frame->width() / 2; |
159 src += stride; | 157 src += stride; |
160 } | 158 } |
161 | 159 |
162 // Sanity check! | 160 // Sanity check! |
163 uint8* expected = reinterpret_cast<uint8*>(transport_dib_->memory()) + | 161 uint8* expected = reinterpret_cast<uint8*>(transport_dib_->memory()) + |
164 transport_dib_->size(); | 162 transport_dib_->size(); |
165 CHECK(dest == expected); | 163 CHECK(dest == expected); |
166 | 164 |
167 Send(new ViewHostMsg_UpdateVideo(routing_id_, | 165 Send(new ViewHostMsg_UpdateVideo(routing_id_, |
168 transport_dib_->id(), | 166 transport_dib_->id(), |
169 video_rect_)); | 167 video_rect_)); |
170 | |
171 frame->Unlock(); | |
172 } | 168 } |
173 | 169 |
174 void IPCVideoRenderer::DoDestroyVideo() { | 170 void IPCVideoRenderer::DoDestroyVideo() { |
175 DCHECK(MessageLoop::current() == proxy_->message_loop()); | 171 DCHECK(MessageLoop::current() == proxy_->message_loop()); |
176 | 172 |
177 // We shouldn't receive any more messages after the browser receives this. | 173 // We shouldn't receive any more messages after the browser receives this. |
178 Send(new ViewHostMsg_DestroyVideo(routing_id_)); | 174 Send(new ViewHostMsg_DestroyVideo(routing_id_)); |
179 | 175 |
180 // Detach ourselves from the proxy. | 176 // Detach ourselves from the proxy. |
181 proxy_->SetVideoRenderer(NULL); | 177 proxy_->SetVideoRenderer(NULL); |
182 proxy_ = NULL; | 178 proxy_ = NULL; |
183 } | 179 } |
OLD | NEW |