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

Side by Side Diff: content/renderer/media/webmediaplayer_ms_compositor.cc

Issue 1394783004: Change paused frame of WebMediaPlayerMS from YV12 to I420 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months 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
« no previous file with comments | « content/renderer/BUILD.gn ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "content/renderer/media/webmediaplayer_ms_compositor.h" 5 #include "content/renderer/media/webmediaplayer_ms_compositor.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/hash.h" 8 #include "base/hash.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "cc/blink/context_provider_web_context.h" 10 #include "cc/blink/context_provider_web_context.h"
11 #include "content/renderer/render_thread_impl.h" 11 #include "content/renderer/render_thread_impl.h"
12 #include "media/base/media_switches.h" 12 #include "media/base/media_switches.h"
13 #include "media/base/video_frame.h" 13 #include "media/base/video_frame.h"
14 #include "media/base/video_util.h" 14 #include "media/base/video_util.h"
15 #include "media/blink/skcanvas_video_renderer.h" 15 #include "media/blink/skcanvas_video_renderer.h"
16 #include "media/filters/video_renderer_algorithm.h" 16 #include "media/filters/video_renderer_algorithm.h"
17 #include "skia/ext/platform_canvas.h" 17 #include "skia/ext/platform_canvas.h"
18 #include "third_party/WebKit/public/platform/WebMediaStream.h" 18 #include "third_party/WebKit/public/platform/WebMediaStream.h"
19 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 19 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
20 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 20 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
21 #include "third_party/WebKit/public/platform/WebURL.h" 21 #include "third_party/WebKit/public/platform/WebURL.h"
22 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" 22 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
23 #include "third_party/libyuv/include/libyuv/convert.h"
24 #include "third_party/libyuv/include/libyuv/video_common.h"
23 25
24 namespace content { 26 namespace content {
25 27
26 namespace { 28 namespace {
27 29
28 // This function copies |frame| to a new YV12 media::VideoFrame. 30 // This function copies |frame| to a new I420 media::VideoFrame.
29 // TODO: Consider using libyuv for better performance. see http://crbug/541728 31 scoped_refptr<media::VideoFrame> CopyFrameToI420(
30 scoped_refptr<media::VideoFrame> CopyFrameToYV12(
31 const scoped_refptr<media::VideoFrame>& frame, 32 const scoped_refptr<media::VideoFrame>& frame,
32 media::SkCanvasVideoRenderer* video_renderer) { 33 media::SkCanvasVideoRenderer* video_renderer) {
33 const scoped_refptr<media::VideoFrame> new_frame = 34 const scoped_refptr<media::VideoFrame> new_frame =
34 media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12, 35 media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12,
35 frame->coded_size(), frame->visible_rect(), 36 frame->coded_size(), frame->visible_rect(),
36 frame->natural_size(), frame->timestamp()); 37 frame->natural_size(), frame->timestamp());
38 const gfx::Size& size = frame->coded_size();
37 39
38 if (frame->HasTextures()) { 40 if (frame->HasTextures()) {
39 DCHECK(frame->format() == media::PIXEL_FORMAT_ARGB || 41 DCHECK(frame->format() == media::PIXEL_FORMAT_ARGB ||
40 frame->format() == media::PIXEL_FORMAT_XRGB || 42 frame->format() == media::PIXEL_FORMAT_XRGB ||
41 frame->format() == media::PIXEL_FORMAT_I420 || 43 frame->format() == media::PIXEL_FORMAT_I420 ||
42 frame->format() == media::PIXEL_FORMAT_UYVY); 44 frame->format() == media::PIXEL_FORMAT_UYVY);
43 SkBitmap bitmap; 45 SkBitmap bitmap;
44 bitmap.allocN32Pixels(frame->visible_rect().width(), 46 bitmap.allocN32Pixels(frame->visible_rect().width(),
45 frame->visible_rect().height()); 47 frame->visible_rect().height());
46 SkCanvas canvas(bitmap); 48 SkCanvas canvas(bitmap);
47 49
48 cc::ContextProvider* const provider = 50 cc::ContextProvider* const provider =
49 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); 51 RenderThreadImpl::current()->SharedMainThreadContextProvider().get();
50 if (provider) { 52 if (provider) {
51 const media::Context3D context_3d = 53 const media::Context3D context_3d =
52 media::Context3D(provider->ContextGL(), provider->GrContext()); 54 media::Context3D(provider->ContextGL(), provider->GrContext());
53 DCHECK(context_3d.gl); 55 DCHECK(context_3d.gl);
54 video_renderer->Copy(frame.get(), &canvas, context_3d); 56 video_renderer->Copy(frame.get(), &canvas, context_3d);
55 } else { 57 } else {
56 // GPU Process crashed. 58 // GPU Process crashed.
57 bitmap.eraseColor(SK_ColorTRANSPARENT); 59 bitmap.eraseColor(SK_ColorTRANSPARENT);
58 } 60 }
59 media::CopyRGBToVideoFrame(reinterpret_cast<uint8*>(bitmap.getPixels()), 61 libyuv::ARGBToI420(reinterpret_cast<uint8*>(bitmap.getPixels()),
60 bitmap.rowBytes(), frame->visible_rect(), 62 bitmap.rowBytes(),
61 new_frame.get()); 63 new_frame->data(media::VideoFrame::kYPlane),
64 new_frame->stride(media::VideoFrame::kYPlane),
65 new_frame->data(media::VideoFrame::kUPlane),
66 new_frame->stride(media::VideoFrame::kUPlane),
67 new_frame->data(media::VideoFrame::kVPlane),
68 new_frame->stride(media::VideoFrame::kVPlane),
69 size.width(), size.height());
62 } else { 70 } else {
63 DCHECK(frame->IsMappable()); 71 DCHECK(frame->IsMappable());
64 DCHECK(frame->format() == media::PIXEL_FORMAT_YV12 || 72 DCHECK(frame->format() == media::PIXEL_FORMAT_YV12 ||
65 frame->format() == media::PIXEL_FORMAT_I420); 73 frame->format() == media::PIXEL_FORMAT_I420);
66 const size_t num_planes = media::VideoFrame::NumPlanes(frame->format()); 74 libyuv::I420Copy(frame->data(media::VideoFrame::kYPlane),
67 for (size_t i = 0; i < num_planes; ++i) { 75 frame->stride(media::VideoFrame::kYPlane),
68 media::CopyPlane(i, frame->data(i), frame->stride(i), frame->rows(i), 76 frame->data(media::VideoFrame::kUPlane),
69 new_frame.get()); 77 frame->stride(media::VideoFrame::kUPlane),
70 } 78 frame->data(media::VideoFrame::kVPlane),
79 frame->stride(media::VideoFrame::kVPlane),
80 new_frame->data(media::VideoFrame::kYPlane),
81 new_frame->stride(media::VideoFrame::kYPlane),
82 new_frame->data(media::VideoFrame::kUPlane),
83 new_frame->stride(media::VideoFrame::kUPlane),
84 new_frame->data(media::VideoFrame::kVPlane),
85 new_frame->stride(media::VideoFrame::kVPlane),
86 size.width(), size.height());
71 } 87 }
72 return new_frame; 88 return new_frame;
73 } 89 }
74 90
75 } // anonymous namespace 91 } // anonymous namespace
76 92
77 WebMediaPlayerMSCompositor::WebMediaPlayerMSCompositor( 93 WebMediaPlayerMSCompositor::WebMediaPlayerMSCompositor(
78 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, 94 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
79 const blink::WebURL& url) 95 const blink::WebURL& url)
80 : compositor_task_runner_(compositor_task_runner), 96 : compositor_task_runner_(compositor_task_runner),
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 media::SkCanvasVideoRenderer* renderer) { 301 media::SkCanvasVideoRenderer* renderer) {
286 DCHECK(thread_checker_.CalledOnValidThread()); 302 DCHECK(thread_checker_.CalledOnValidThread());
287 base::AutoLock auto_lock(current_frame_lock_); 303 base::AutoLock auto_lock(current_frame_lock_);
288 if (!current_frame_.get()) 304 if (!current_frame_.get())
289 return; 305 return;
290 306
291 // Copy the frame so that rendering can show the last received frame. 307 // Copy the frame so that rendering can show the last received frame.
292 // The original frame must not be referenced when the player is paused since 308 // The original frame must not be referenced when the player is paused since
293 // there might be a finite number of available buffers. E.g, video that 309 // there might be a finite number of available buffers. E.g, video that
294 // originates from a video camera. 310 // originates from a video camera.
295 current_frame_ = CopyFrameToYV12(current_frame_, renderer); 311 current_frame_ = CopyFrameToI420(current_frame_, renderer);
296 } 312 }
297 313
298 bool WebMediaPlayerMSCompositor::MapTimestampsToRenderTimeTicks( 314 bool WebMediaPlayerMSCompositor::MapTimestampsToRenderTimeTicks(
299 const std::vector<base::TimeDelta>& timestamps, 315 const std::vector<base::TimeDelta>& timestamps,
300 std::vector<base::TimeTicks>* wall_clock_times) { 316 std::vector<base::TimeTicks>* wall_clock_times) {
301 DCHECK(compositor_task_runner_->BelongsToCurrentThread() || 317 DCHECK(compositor_task_runner_->BelongsToCurrentThread() ||
302 thread_checker_.CalledOnValidThread()); 318 thread_checker_.CalledOnValidThread());
303 for (const base::TimeDelta& timestamp : timestamps) { 319 for (const base::TimeDelta& timestamp : timestamps) {
304 DCHECK(timestamps_to_clock_times_.count(timestamp)); 320 DCHECK(timestamps_to_clock_times_.count(timestamp));
305 wall_clock_times->push_back(timestamps_to_clock_times_[timestamp]); 321 wall_clock_times->push_back(timestamps_to_clock_times_[timestamp]);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 355
340 void WebMediaPlayerMSCompositor::SetCurrentFrame( 356 void WebMediaPlayerMSCompositor::SetCurrentFrame(
341 const scoped_refptr<media::VideoFrame>& frame) { 357 const scoped_refptr<media::VideoFrame>& frame) {
342 current_frame_lock_.AssertAcquired(); 358 current_frame_lock_.AssertAcquired();
343 if (!current_frame_used_by_compositor_) 359 if (!current_frame_used_by_compositor_)
344 ++dropped_frame_count_; 360 ++dropped_frame_count_;
345 current_frame_used_by_compositor_ = false; 361 current_frame_used_by_compositor_ = false;
346 current_frame_ = frame; 362 current_frame_ = frame;
347 } 363 }
348 } 364 }
OLDNEW
« no previous file with comments | « content/renderer/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698