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

Side by Side Diff: webkit/glue/webmediaplayer_proxy.cc

Issue 7493030: Split WebMediaPlayerImpl::Proxy into its own class. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: fixes Created 9 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « webkit/glue/webmediaplayer_proxy.h ('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
(Empty)
1 // Copyright (c) 2011 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 "webkit/glue/webmediaplayer_proxy.h"
6
7 #include "base/logging.h"
8 #include "base/message_loop.h"
9 #include "media/base/pipeline_status.h"
10 #include "media/filters/chunk_demuxer.h"
11 #include "webkit/glue/media/web_video_renderer.h"
12 #include "webkit/glue/webmediaplayer_impl.h"
13
14 using media::PipelineStatus;
15
16 namespace webkit_glue {
17
18 // Limits the maximum outstanding repaints posted on render thread.
19 // This number of 50 is a guess, it does not take too much memory on the task
20 // queue but gives up a pretty good latency on repaint.
21 static const int kMaxOutstandingRepaints = 50;
22
23 WebMediaPlayerProxy::WebMediaPlayerProxy(MessageLoop* render_loop,
24 WebMediaPlayerImpl* webmediaplayer)
25 : render_loop_(render_loop),
26 webmediaplayer_(webmediaplayer),
27 outstanding_repaints_(0) {
28 DCHECK(render_loop_);
29 DCHECK(webmediaplayer_);
30 }
31
32 WebMediaPlayerProxy::~WebMediaPlayerProxy() {
33 Detach();
34 }
35
36 void WebMediaPlayerProxy::Repaint() {
37 base::AutoLock auto_lock(lock_);
38 if (outstanding_repaints_ < kMaxOutstandingRepaints) {
39 ++outstanding_repaints_;
40
41 render_loop_->PostTask(FROM_HERE,
42 NewRunnableMethod(this, &WebMediaPlayerProxy::RepaintTask));
43 }
44 }
45
46 void WebMediaPlayerProxy::SetVideoRenderer(
47 scoped_refptr<WebVideoRenderer> video_renderer) {
48 video_renderer_ = video_renderer;
49 }
50
51 WebDataSourceBuildObserverHack* WebMediaPlayerProxy::GetBuildObserver() {
52 if (!build_observer_.get())
53 build_observer_.reset(NewCallback(this,
54 &WebMediaPlayerProxy::AddDataSource));
55 return build_observer_.get();
56 }
57
58 void WebMediaPlayerProxy::Paint(SkCanvas* canvas, const gfx::Rect& dest_rect) {
59 DCHECK(MessageLoop::current() == render_loop_);
60 if (video_renderer_) {
61 video_renderer_->Paint(canvas, dest_rect);
62 }
63 }
64
65 void WebMediaPlayerProxy::SetSize(const gfx::Rect& rect) {
66 DCHECK(MessageLoop::current() == render_loop_);
67 if (video_renderer_) {
68 video_renderer_->SetRect(rect);
69 }
70 }
71
72 bool WebMediaPlayerProxy::HasSingleOrigin() {
73 DCHECK(MessageLoop::current() == render_loop_);
74
75 base::AutoLock auto_lock(data_sources_lock_);
76
77 for (DataSourceList::iterator itr = data_sources_.begin();
78 itr != data_sources_.end();
79 itr++) {
80 if (!(*itr)->HasSingleOrigin())
81 return false;
82 }
83 return true;
84 }
85
86 void WebMediaPlayerProxy::AbortDataSources() {
87 DCHECK(MessageLoop::current() == render_loop_);
88 base::AutoLock auto_lock(data_sources_lock_);
89
90 for (DataSourceList::iterator itr = data_sources_.begin();
91 itr != data_sources_.end();
92 itr++) {
93 (*itr)->Abort();
94 }
95 }
96
97 void WebMediaPlayerProxy::Detach() {
98 DCHECK(MessageLoop::current() == render_loop_);
99 webmediaplayer_ = NULL;
100 video_renderer_ = NULL;
101
102 {
103 base::AutoLock auto_lock(data_sources_lock_);
104 data_sources_.clear();
105 }
106 }
107
108 void WebMediaPlayerProxy::PipelineInitializationCallback(
109 PipelineStatus status) {
110 render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
111 this, &WebMediaPlayerProxy::PipelineInitializationTask, status));
112 }
113
114 void WebMediaPlayerProxy::PipelineSeekCallback(PipelineStatus status) {
115 render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
116 this, &WebMediaPlayerProxy::PipelineSeekTask, status));
117 }
118
119 void WebMediaPlayerProxy::PipelineEndedCallback(PipelineStatus status) {
120 render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
121 this, &WebMediaPlayerProxy::PipelineEndedTask, status));
122 }
123
124 void WebMediaPlayerProxy::PipelineErrorCallback(PipelineStatus error) {
125 DCHECK_NE(error, media::PIPELINE_OK);
126 render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
127 this, &WebMediaPlayerProxy::PipelineErrorTask, error));
128 }
129
130 void WebMediaPlayerProxy::NetworkEventCallback(PipelineStatus status) {
131 render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
132 this, &WebMediaPlayerProxy::NetworkEventTask, status));
133 }
134
135 void WebMediaPlayerProxy::AddDataSource(WebDataSource* data_source) {
136 base::AutoLock auto_lock(data_sources_lock_);
137 data_sources_.push_back(make_scoped_refptr(data_source));
138 }
139
140 void WebMediaPlayerProxy::RepaintTask() {
141 DCHECK(MessageLoop::current() == render_loop_);
142 {
143 base::AutoLock auto_lock(lock_);
144 --outstanding_repaints_;
145 DCHECK_GE(outstanding_repaints_, 0);
146 }
147 if (webmediaplayer_) {
148 webmediaplayer_->Repaint();
149 }
150 }
151
152 void WebMediaPlayerProxy::PipelineInitializationTask(PipelineStatus status) {
153 DCHECK(MessageLoop::current() == render_loop_);
154 if (webmediaplayer_) {
155 webmediaplayer_->OnPipelineInitialize(status);
156 }
157 }
158
159 void WebMediaPlayerProxy::PipelineSeekTask(PipelineStatus status) {
160 DCHECK(MessageLoop::current() == render_loop_);
161 if (webmediaplayer_) {
162 webmediaplayer_->OnPipelineSeek(status);
163 }
164 }
165
166 void WebMediaPlayerProxy::PipelineEndedTask(PipelineStatus status) {
167 DCHECK(MessageLoop::current() == render_loop_);
168 if (webmediaplayer_) {
169 webmediaplayer_->OnPipelineEnded(status);
170 }
171 }
172
173 void WebMediaPlayerProxy::PipelineErrorTask(PipelineStatus error) {
174 DCHECK(MessageLoop::current() == render_loop_);
175 if (webmediaplayer_) {
176 webmediaplayer_->OnPipelineError(error);
177 }
178 }
179
180 void WebMediaPlayerProxy::NetworkEventTask(PipelineStatus status) {
181 DCHECK(MessageLoop::current() == render_loop_);
182 if (webmediaplayer_) {
183 webmediaplayer_->OnNetworkEvent(status);
184 }
185 }
186
187 void WebMediaPlayerProxy::GetCurrentFrame(
188 scoped_refptr<media::VideoFrame>* frame_out) {
189 if (video_renderer_)
190 video_renderer_->GetCurrentFrame(frame_out);
191 }
192
193 void WebMediaPlayerProxy::PutCurrentFrame(
194 scoped_refptr<media::VideoFrame> frame) {
195 if (video_renderer_)
196 video_renderer_->PutCurrentFrame(frame);
197 }
198
199 void WebMediaPlayerProxy::DemuxerOpened(media::ChunkDemuxer* demuxer) {
200 render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
201 this, &WebMediaPlayerProxy::DemuxerOpenedTask,
202 scoped_refptr<media::ChunkDemuxer>(demuxer)));
203 }
204
205 void WebMediaPlayerProxy::DemuxerClosed() {
206 render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
207 this, &WebMediaPlayerProxy::DemuxerClosedTask));
208 }
209
210 void WebMediaPlayerProxy::DemuxerFlush() {
211 if (chunk_demuxer_.get())
212 chunk_demuxer_->FlushData();
213 }
214
215 bool WebMediaPlayerProxy::DemuxerAppend(const uint8* data, size_t length) {
216 if (chunk_demuxer_.get())
217 return chunk_demuxer_->AppendData(data, length);
218 return false;
219 }
220
221 void WebMediaPlayerProxy::DemuxerEndOfStream(media::PipelineStatus status) {
222 if (chunk_demuxer_.get())
223 chunk_demuxer_->EndOfStream(status);
224 }
225
226 void WebMediaPlayerProxy::DemuxerShutdown() {
227 if (chunk_demuxer_.get())
228 chunk_demuxer_->Shutdown();
229 }
230
231 void WebMediaPlayerProxy::DemuxerOpenedTask(
232 const scoped_refptr<media::ChunkDemuxer>& demuxer) {
233 DCHECK(MessageLoop::current() == render_loop_);
234 chunk_demuxer_ = demuxer;
235 if (webmediaplayer_)
236 webmediaplayer_->OnDemuxerOpened();
237 }
238
239 void WebMediaPlayerProxy::DemuxerClosedTask() {
240 chunk_demuxer_ = NULL;
241 }
242
243 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/glue/webmediaplayer_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698