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

Side by Side Diff: media/blink/video_frame_compositor.cc

Issue 1094553002: Revert "Speculative revert by sheriff" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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 | « media/blink/video_frame_compositor.h ('k') | media/blink/video_frame_compositor_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "media/blink/video_frame_compositor.h" 5 #include "media/blink/video_frame_compositor.h"
6 6
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
7 #include "media/base/video_frame.h" 9 #include "media/base/video_frame.h"
8 10
9 namespace media { 11 namespace media {
10 12
11 static bool IsOpaque(const scoped_refptr<VideoFrame>& frame) { 13 static bool IsOpaque(const scoped_refptr<VideoFrame>& frame) {
12 switch (frame->format()) { 14 switch (frame->format()) {
13 case VideoFrame::UNKNOWN: 15 case VideoFrame::UNKNOWN:
14 case VideoFrame::YV12: 16 case VideoFrame::YV12:
15 case VideoFrame::YV12J: 17 case VideoFrame::YV12J:
16 case VideoFrame::YV12HD: 18 case VideoFrame::YV12HD:
17 case VideoFrame::YV16: 19 case VideoFrame::YV16:
18 case VideoFrame::I420: 20 case VideoFrame::I420:
19 case VideoFrame::YV24: 21 case VideoFrame::YV24:
20 case VideoFrame::NV12: 22 case VideoFrame::NV12:
21 return true; 23 return true;
22 24
23 case VideoFrame::YV12A: 25 case VideoFrame::YV12A:
24 #if defined(VIDEO_HOLE) 26 #if defined(VIDEO_HOLE)
25 case VideoFrame::HOLE: 27 case VideoFrame::HOLE:
26 #endif // defined(VIDEO_HOLE) 28 #endif // defined(VIDEO_HOLE)
27 case VideoFrame::NATIVE_TEXTURE: 29 case VideoFrame::NATIVE_TEXTURE:
28 case VideoFrame::ARGB: 30 case VideoFrame::ARGB:
29 break; 31 break;
30 } 32 }
31 return false; 33 return false;
32 } 34 }
33 35
34 VideoFrameCompositor::VideoFrameCompositor( 36 VideoFrameCompositor::VideoFrameCompositor(
37 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
35 const base::Callback<void(gfx::Size)>& natural_size_changed_cb, 38 const base::Callback<void(gfx::Size)>& natural_size_changed_cb,
36 const base::Callback<void(bool)>& opacity_changed_cb) 39 const base::Callback<void(bool)>& opacity_changed_cb)
37 : natural_size_changed_cb_(natural_size_changed_cb), 40 : compositor_task_runner_(compositor_task_runner),
41 natural_size_changed_cb_(natural_size_changed_cb),
38 opacity_changed_cb_(opacity_changed_cb), 42 opacity_changed_cb_(opacity_changed_cb),
39 client_(NULL) { 43 client_(nullptr),
44 rendering_(false),
45 callback_(nullptr) {
40 } 46 }
41 47
42 VideoFrameCompositor::~VideoFrameCompositor() { 48 VideoFrameCompositor::~VideoFrameCompositor() {
49 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
50 DCHECK(!callback_);
51 DCHECK(!rendering_);
43 if (client_) 52 if (client_)
44 client_->StopUsingProvider(); 53 client_->StopUsingProvider();
45 } 54 }
46 55
56 void VideoFrameCompositor::OnRendererStateUpdate() {
57 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
58 if (!client_)
59 return;
60
61 base::AutoLock lock(lock_);
62 if (callback_) {
63 if (rendering_)
64 client_->StartRendering();
65
66 // TODO(dalecurtis): This will need to request the first frame so we have
67 // something to show, even if playback hasn't started yet.
68 } else if (rendering_) {
69 client_->StopRendering();
70 }
71 }
72
73 scoped_refptr<VideoFrame>
74 VideoFrameCompositor::GetCurrentFrameAndUpdateIfStale() {
75 // TODO(dalecurtis): Implement frame refresh when stale.
76 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
77 return GetCurrentFrame();
78 }
79
47 void VideoFrameCompositor::SetVideoFrameProviderClient( 80 void VideoFrameCompositor::SetVideoFrameProviderClient(
48 cc::VideoFrameProvider::Client* client) { 81 cc::VideoFrameProvider::Client* client) {
82 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
49 if (client_) 83 if (client_)
50 client_->StopUsingProvider(); 84 client_->StopUsingProvider();
51 client_ = client; 85 client_ = client;
86 OnRendererStateUpdate();
52 } 87 }
53 88
54 scoped_refptr<VideoFrame> VideoFrameCompositor::GetCurrentFrame() { 89 scoped_refptr<VideoFrame> VideoFrameCompositor::GetCurrentFrame() {
90 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
55 return current_frame_; 91 return current_frame_;
56 } 92 }
57 93
58 void VideoFrameCompositor::PutCurrentFrame( 94 void VideoFrameCompositor::PutCurrentFrame() {
59 const scoped_refptr<VideoFrame>& frame) { 95 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
96 // TODO(dalecurtis): Wire up a flag for RenderCallback::OnFrameDropped().
60 } 97 }
61 98
62 void VideoFrameCompositor::UpdateCurrentFrame( 99 bool VideoFrameCompositor::UpdateCurrentFrame(base::TimeTicks deadline_min,
100 base::TimeTicks deadline_max) {
101 // TODO(dalecurtis): Wire this up to RenderCallback::Render().
102 base::AutoLock lock(lock_);
103 return false;
104 }
105
106 void VideoFrameCompositor::Start(RenderCallback* callback) {
107 NOTREACHED();
108
109 // Called from the media thread, so acquire the callback under lock before
110 // returning in case a Stop() call comes in before the PostTask is processed.
111 base::AutoLock lock(lock_);
112 callback_ = callback;
113 rendering_ = true;
114 compositor_task_runner_->PostTask(
115 FROM_HERE, base::Bind(&VideoFrameCompositor::OnRendererStateUpdate,
116 base::Unretained(this)));
117 }
118
119 void VideoFrameCompositor::Stop() {
120 NOTREACHED();
121
122 // Called from the media thread, so release the callback under lock before
123 // returning to avoid a pending UpdateCurrentFrame() call occurring before
124 // the PostTask is processed.
125 base::AutoLock lock(lock_);
126 callback_ = nullptr;
127 rendering_ = false;
128 compositor_task_runner_->PostTask(
129 FROM_HERE, base::Bind(&VideoFrameCompositor::OnRendererStateUpdate,
130 base::Unretained(this)));
131 }
132
133 void VideoFrameCompositor::PaintFrameUsingOldRenderingPath(
63 const scoped_refptr<VideoFrame>& frame) { 134 const scoped_refptr<VideoFrame>& frame) {
135 if (!compositor_task_runner_->BelongsToCurrentThread()) {
136 compositor_task_runner_->PostTask(
137 FROM_HERE,
138 base::Bind(&VideoFrameCompositor::PaintFrameUsingOldRenderingPath,
139 base::Unretained(this), frame));
140 return;
141 }
142
64 if (current_frame_.get() && 143 if (current_frame_.get() &&
65 current_frame_->natural_size() != frame->natural_size()) { 144 current_frame_->natural_size() != frame->natural_size()) {
66 natural_size_changed_cb_.Run(frame->natural_size()); 145 natural_size_changed_cb_.Run(frame->natural_size());
67 } 146 }
68 147
69 if (!current_frame_.get() || IsOpaque(current_frame_) != IsOpaque(frame)) { 148 if (!current_frame_.get() || IsOpaque(current_frame_) != IsOpaque(frame)) {
70 opacity_changed_cb_.Run(IsOpaque(frame)); 149 opacity_changed_cb_.Run(IsOpaque(frame));
71 } 150 }
72 151
73 current_frame_ = frame; 152 current_frame_ = frame;
74 153
75 if (client_) 154 if (client_)
76 client_->DidReceiveFrame(); 155 client_->DidReceiveFrame();
77 } 156 }
78 157
79 } // namespace media 158 } // namespace media
OLDNEW
« no previous file with comments | « media/blink/video_frame_compositor.h ('k') | media/blink/video_frame_compositor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698