blob: 3bd5138cb1d35bf48ae8dd790efd2b97e4d883be [file] [log] [blame]
[email protected]891acc92009-04-27 19:56:411// Copyright (c) 2008-2009 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.
[email protected]ec9212f2008-12-18 21:40:364
[email protected]8931c41a2009-07-07 17:31:495#include "webkit/glue/webmediaplayer_impl.h"
6
[email protected]891acc92009-04-27 19:56:417#include "base/command_line.h"
[email protected]d43ed912009-02-03 04:52:538#include "googleurl/src/gurl.h"
[email protected]4c616fa52009-03-30 20:10:079#include "media/filters/ffmpeg_audio_decoder.h"
[email protected]3f06d0ef2009-03-19 01:35:3610#include "media/filters/ffmpeg_demuxer.h"
[email protected]720ac732009-04-02 23:55:4411#include "media/filters/ffmpeg_video_decoder.h"
[email protected]891acc92009-04-27 19:56:4112#include "media/filters/null_audio_renderer.h"
[email protected]afdcf5c2009-05-10 20:30:4113#include "webkit/api/public/WebRect.h"
14#include "webkit/api/public/WebSize.h"
15#include "webkit/api/public/WebURL.h"
[email protected]add51772009-06-11 18:25:1716#include "webkit/glue/media/video_renderer_impl.h"
[email protected]b3f2b912009-04-09 16:18:5217
[email protected]df143bdc2009-06-16 17:34:1918using WebKit::WebCanvas;
[email protected]b3f2b912009-04-09 16:18:5219using WebKit::WebRect;
20using WebKit::WebSize;
[email protected]ec9212f2008-12-18 21:40:3621
[email protected]8931c41a2009-07-07 17:31:4922namespace {
23
24// Limits the maximum outstanding repaints posted on render thread.
25// This number of 50 is a guess, it does not take too much memory on the task
26// queue but gives up a pretty good latency on repaint.
27const int kMaxOutstandingRepaints = 50;
28
29} // namespace
30
[email protected]add51772009-06-11 18:25:1731namespace webkit_glue {
32
[email protected]d43ed912009-02-03 04:52:5333/////////////////////////////////////////////////////////////////////////////
[email protected]8931c41a2009-07-07 17:31:4934// WebMediaPlayerImpl::Proxy implementation
[email protected]d43ed912009-02-03 04:52:5335
[email protected]8931c41a2009-07-07 17:31:4936WebMediaPlayerImpl::Proxy::Proxy(MessageLoop* render_loop,
37 WebMediaPlayerImpl* webmediaplayer)
38 : render_loop_(render_loop),
39 webmediaplayer_(webmediaplayer),
40 outstanding_repaints_(0) {
41 DCHECK(render_loop_);
42 DCHECK(webmediaplayer_);
43}
[email protected]d43ed912009-02-03 04:52:5344
[email protected]8931c41a2009-07-07 17:31:4945WebMediaPlayerImpl::Proxy::~Proxy() {
46 Detach();
47}
48
49void WebMediaPlayerImpl::Proxy::Repaint() {
50 AutoLock auto_lock(lock_);
51 if (outstanding_repaints_ < kMaxOutstandingRepaints) {
52 ++outstanding_repaints_;
53
54 render_loop_->PostTask(FROM_HERE,
55 NewRunnableMethod(this, &WebMediaPlayerImpl::Proxy::RepaintTask));
[email protected]d43ed912009-02-03 04:52:5356 }
[email protected]8931c41a2009-07-07 17:31:4957}
[email protected]d43ed912009-02-03 04:52:5358
[email protected]8931c41a2009-07-07 17:31:4959void WebMediaPlayerImpl::Proxy::TimeChanged() {
60 render_loop_->PostTask(FROM_HERE,
61 NewRunnableMethod(this, &WebMediaPlayerImpl::Proxy::TimeChangedTask));
62}
63
64void WebMediaPlayerImpl::Proxy::NetworkStateChanged(
65 WebKit::WebMediaPlayer::NetworkState state) {
66 render_loop_->PostTask(FROM_HERE,
67 NewRunnableMethod(this,
68 &WebMediaPlayerImpl::Proxy::NetworkStateChangedTask,
69 state));
70}
71
72void WebMediaPlayerImpl::Proxy::ReadyStateChanged(
73 WebKit::WebMediaPlayer::ReadyState state) {
74 render_loop_->PostTask(FROM_HERE,
75 NewRunnableMethod(this,
76 &WebMediaPlayerImpl::Proxy::ReadyStateChangedTask,
77 state));
78}
79
80void WebMediaPlayerImpl::Proxy::RepaintTask() {
81 DCHECK(MessageLoop::current() == render_loop_);
82 {
83 AutoLock auto_lock(lock_);
84 --outstanding_repaints_;
85 DCHECK_GE(outstanding_repaints_, 0);
[email protected]d43ed912009-02-03 04:52:5386 }
[email protected]8931c41a2009-07-07 17:31:4987 if (webmediaplayer_)
88 webmediaplayer_->Repaint();
89}
[email protected]d43ed912009-02-03 04:52:5390
[email protected]8931c41a2009-07-07 17:31:4991void WebMediaPlayerImpl::Proxy::TimeChangedTask() {
92 DCHECK(MessageLoop::current() == render_loop_);
93 if (webmediaplayer_)
94 webmediaplayer_->TimeChanged();
95}
[email protected]d43ed912009-02-03 04:52:5396
[email protected]8931c41a2009-07-07 17:31:4997void WebMediaPlayerImpl::Proxy::NetworkStateChangedTask(
98 WebKit::WebMediaPlayer::NetworkState state) {
99 DCHECK(MessageLoop::current() == render_loop_);
100 if (webmediaplayer_)
101 webmediaplayer_->SetNetworkState(state);
102}
103
104void WebMediaPlayerImpl::Proxy::ReadyStateChangedTask(
105 WebKit::WebMediaPlayer::ReadyState state) {
106 DCHECK(MessageLoop::current() == render_loop_);
107 if (webmediaplayer_)
108 webmediaplayer_->SetReadyState(state);
109}
110
111void WebMediaPlayerImpl::Proxy::SetVideoRenderer(
112 VideoRendererImpl* video_renderer) {
113 video_renderer_ = video_renderer;
114}
115
116void WebMediaPlayerImpl::Proxy::Paint(skia::PlatformCanvas* canvas,
117 const gfx::Rect& dest_rect) {
118 DCHECK(MessageLoop::current() == render_loop_);
119 if (video_renderer_) {
120 video_renderer_->Paint(canvas, dest_rect);
121 }
122}
123
124void WebMediaPlayerImpl::Proxy::SetSize(const gfx::Rect& rect) {
125 DCHECK(MessageLoop::current() == render_loop_);
126 if (video_renderer_) {
127 video_renderer_->SetRect(rect);
128 }
129}
130
131void WebMediaPlayerImpl::Proxy::Detach() {
132 DCHECK(MessageLoop::current() == render_loop_);
133 webmediaplayer_ = NULL;
134 video_renderer_ = NULL;
135}
136
137void WebMediaPlayerImpl::Proxy::PipelineInitializationCallback(bool success) {
138 if (success) {
139 // Since we have initialized the pipeline, say we have everything.
140 // TODO(hclam): change this to report the correct status. Should also post
141 // a task to call to |webmediaplayer_|.
142 ReadyStateChanged(WebKit::WebMediaPlayer::HaveMetadata);
143 ReadyStateChanged(WebKit::WebMediaPlayer::HaveEnoughData);
144 NetworkStateChanged(WebKit::WebMediaPlayer::Loaded);
145 } else {
[email protected]3b4cbbf2009-07-11 00:16:19146 // TODO(hclam): should use pipeline_->GetError() to determine the state
[email protected]8931c41a2009-07-07 17:31:49147 // properly and reports error using MediaError.
148 // WebKit uses FormatError to indicate an error for bogus URL or bad file.
149 // Since we are at the initialization stage we can safely treat every error
150 // as format error. Should post a task to call to |webmediaplayer_|.
151 NetworkStateChanged(WebKit::WebMediaPlayer::FormatError);
152 }
153}
154
155void WebMediaPlayerImpl::Proxy::PipelineSeekCallback(bool success) {
156 if (success)
157 TimeChanged();
158}
[email protected]d43ed912009-02-03 04:52:53159
160/////////////////////////////////////////////////////////////////////////////
[email protected]4e6be3f2009-05-07 02:24:44161// WebMediaPlayerImpl implementation
[email protected]d43ed912009-02-03 04:52:53162
[email protected]add51772009-06-11 18:25:17163WebMediaPlayerImpl::WebMediaPlayerImpl(WebKit::WebMediaPlayerClient* client,
164 media::FilterFactoryCollection* factory)
[email protected]4e6be3f2009-05-07 02:24:44165 : network_state_(WebKit::WebMediaPlayer::Empty),
166 ready_state_(WebKit::WebMediaPlayer::HaveNothing),
[email protected]d43ed912009-02-03 04:52:53167 main_loop_(NULL),
[email protected]add51772009-06-11 18:25:17168 filter_factory_(factory),
[email protected]3b4cbbf2009-07-11 00:16:19169 pipeline_thread_("PipelineThread"),
[email protected]49480902009-07-14 20:23:43170 paused_(true),
171 playback_rate_(0.0f),
[email protected]8931c41a2009-07-07 17:31:49172 client_(client) {
[email protected]4e6be3f2009-05-07 02:24:44173 // Saves the current message loop.
174 DCHECK(!main_loop_);
175 main_loop_ = MessageLoop::current();
176
[email protected]3b4cbbf2009-07-11 00:16:19177 // Create the pipeline and its thread.
178 if (!pipeline_thread_.Start()) {
179 NOTREACHED() << "Could not start PipelineThread";
180 } else {
181 pipeline_.reset(new media::PipelineImpl(pipeline_thread_.message_loop()));
182 }
183
[email protected]4e6be3f2009-05-07 02:24:44184 // Also we want to be notified of |main_loop_| destruction.
185 main_loop_->AddDestructionObserver(this);
[email protected]8931c41a2009-07-07 17:31:49186
187 // Creates the proxy.
188 proxy_ = new Proxy(main_loop_, this);
189
190 // Add in the default filter factories.
191 filter_factory_->AddFactory(media::FFmpegDemuxer::CreateFilterFactory());
192 filter_factory_->AddFactory(media::FFmpegAudioDecoder::CreateFactory());
193 filter_factory_->AddFactory(media::FFmpegVideoDecoder::CreateFactory());
194 filter_factory_->AddFactory(media::NullAudioRenderer::CreateFilterFactory());
195 filter_factory_->AddFactory(VideoRendererImpl::CreateFactory(proxy_));
[email protected]ec9212f2008-12-18 21:40:36196}
197
[email protected]4e6be3f2009-05-07 02:24:44198WebMediaPlayerImpl::~WebMediaPlayerImpl() {
[email protected]8931c41a2009-07-07 17:31:49199 Destroy();
[email protected]d43ed912009-02-03 04:52:53200
[email protected]4e6be3f2009-05-07 02:24:44201 // Finally tell the |main_loop_| we don't want to be notified of destruction
[email protected]d43ed912009-02-03 04:52:53202 // event.
203 if (main_loop_) {
204 main_loop_->RemoveDestructionObserver(this);
205 }
[email protected]ec9212f2008-12-18 21:40:36206}
207
[email protected]4e6be3f2009-05-07 02:24:44208void WebMediaPlayerImpl::load(const WebKit::WebURL& url) {
[email protected]8931c41a2009-07-07 17:31:49209 DCHECK(MessageLoop::current() == main_loop_);
210 DCHECK(proxy_);
[email protected]d43ed912009-02-03 04:52:53211
[email protected]a7281022009-06-17 17:58:04212 // Initialize the pipeline.
[email protected]8931c41a2009-07-07 17:31:49213 SetNetworkState(WebKit::WebMediaPlayer::Loading);
214 SetReadyState(WebKit::WebMediaPlayer::HaveNothing);
[email protected]3b4cbbf2009-07-11 00:16:19215 pipeline_->Start(
[email protected]8931c41a2009-07-07 17:31:49216 filter_factory_.get(),
217 url.spec(),
218 NewCallback(proxy_.get(),
219 &WebMediaPlayerImpl::Proxy::PipelineInitializationCallback));
[email protected]ec9212f2008-12-18 21:40:36220}
221
[email protected]4e6be3f2009-05-07 02:24:44222void WebMediaPlayerImpl::cancelLoad() {
[email protected]8931c41a2009-07-07 17:31:49223 DCHECK(MessageLoop::current() == main_loop_);
[email protected]ec9212f2008-12-18 21:40:36224}
225
[email protected]4e6be3f2009-05-07 02:24:44226void WebMediaPlayerImpl::play() {
[email protected]8931c41a2009-07-07 17:31:49227 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53228
[email protected]49480902009-07-14 20:23:43229 paused_ = false;
230 pipeline_->SetPlaybackRate(playback_rate_);
[email protected]ec9212f2008-12-18 21:40:36231}
232
[email protected]4e6be3f2009-05-07 02:24:44233void WebMediaPlayerImpl::pause() {
[email protected]8931c41a2009-07-07 17:31:49234 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53235
[email protected]49480902009-07-14 20:23:43236 paused_ = true;
[email protected]3b4cbbf2009-07-11 00:16:19237 pipeline_->SetPlaybackRate(0.0f);
[email protected]ec9212f2008-12-18 21:40:36238}
239
[email protected]4e6be3f2009-05-07 02:24:44240void WebMediaPlayerImpl::seek(float seconds) {
[email protected]8931c41a2009-07-07 17:31:49241 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53242
[email protected]b9490b9c2009-05-12 01:01:52243 // Try to preserve as much accuracy as possible.
244 float microseconds = seconds * base::Time::kMicrosecondsPerSecond;
[email protected]add51772009-06-11 18:25:17245 if (seconds != 0)
[email protected]3b4cbbf2009-07-11 00:16:19246 pipeline_->Seek(
[email protected]b9490b9c2009-05-12 01:01:52247 base::TimeDelta::FromMicroseconds(static_cast<int64>(microseconds)),
[email protected]8931c41a2009-07-07 17:31:49248 NewCallback(proxy_.get(),
249 &WebMediaPlayerImpl::Proxy::PipelineSeekCallback));
[email protected]ec9212f2008-12-18 21:40:36250}
251
[email protected]4e6be3f2009-05-07 02:24:44252void WebMediaPlayerImpl::setEndTime(float seconds) {
[email protected]8931c41a2009-07-07 17:31:49253 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53254
255 // TODO(hclam): add method call when it has been implemented.
256 return;
[email protected]ec9212f2008-12-18 21:40:36257}
[email protected]d43ed912009-02-03 04:52:53258
[email protected]4e6be3f2009-05-07 02:24:44259void WebMediaPlayerImpl::setRate(float rate) {
[email protected]8931c41a2009-07-07 17:31:49260 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53261
[email protected]49480902009-07-14 20:23:43262 playback_rate_ = rate;
263 if (!paused_) {
264 pipeline_->SetPlaybackRate(rate);
265 }
[email protected]ec9212f2008-12-18 21:40:36266}
267
[email protected]4e6be3f2009-05-07 02:24:44268void WebMediaPlayerImpl::setVolume(float volume) {
[email protected]8931c41a2009-07-07 17:31:49269 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53270
[email protected]3b4cbbf2009-07-11 00:16:19271 pipeline_->SetVolume(volume);
[email protected]ec9212f2008-12-18 21:40:36272}
[email protected]f0a51fb52009-03-05 12:46:38273
[email protected]4e6be3f2009-05-07 02:24:44274void WebMediaPlayerImpl::setVisible(bool visible) {
[email protected]8931c41a2009-07-07 17:31:49275 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53276
277 // TODO(hclam): add appropriate method call when pipeline has it implemented.
278 return;
[email protected]ec9212f2008-12-18 21:40:36279}
[email protected]d43ed912009-02-03 04:52:53280
[email protected]4e6be3f2009-05-07 02:24:44281bool WebMediaPlayerImpl::setAutoBuffer(bool autoBuffer) {
[email protected]8931c41a2009-07-07 17:31:49282 DCHECK(MessageLoop::current() == main_loop_);
[email protected]4e6be3f2009-05-07 02:24:44283
284 return false;
285}
286
287bool WebMediaPlayerImpl::totalBytesKnown() {
[email protected]8931c41a2009-07-07 17:31:49288 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53289
[email protected]3b4cbbf2009-07-11 00:16:19290 return pipeline_->GetTotalBytes() != 0;
[email protected]d43ed912009-02-03 04:52:53291}
292
[email protected]4e6be3f2009-05-07 02:24:44293bool WebMediaPlayerImpl::hasVideo() const {
[email protected]8931c41a2009-07-07 17:31:49294 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53295
296 size_t width, height;
[email protected]3b4cbbf2009-07-11 00:16:19297 pipeline_->GetVideoSize(&width, &height);
[email protected]d43ed912009-02-03 04:52:53298 return width != 0 && height != 0;
299}
300
[email protected]4e6be3f2009-05-07 02:24:44301WebKit::WebSize WebMediaPlayerImpl::naturalSize() const {
[email protected]8931c41a2009-07-07 17:31:49302 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53303
304 size_t width, height;
[email protected]3b4cbbf2009-07-11 00:16:19305 pipeline_->GetVideoSize(&width, &height);
[email protected]4e6be3f2009-05-07 02:24:44306 return WebKit::WebSize(width, height);
[email protected]d43ed912009-02-03 04:52:53307}
308
[email protected]4e6be3f2009-05-07 02:24:44309bool WebMediaPlayerImpl::paused() const {
[email protected]8931c41a2009-07-07 17:31:49310 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53311
[email protected]3b4cbbf2009-07-11 00:16:19312 return pipeline_->GetPlaybackRate() == 0.0f;
[email protected]d43ed912009-02-03 04:52:53313}
314
[email protected]4e6be3f2009-05-07 02:24:44315bool WebMediaPlayerImpl::seeking() const {
[email protected]8931c41a2009-07-07 17:31:49316 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53317
[email protected]8931c41a2009-07-07 17:31:49318 return false;
[email protected]ec9212f2008-12-18 21:40:36319}
320
[email protected]4e6be3f2009-05-07 02:24:44321float WebMediaPlayerImpl::duration() const {
[email protected]8931c41a2009-07-07 17:31:49322 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53323
[email protected]3b4cbbf2009-07-11 00:16:19324 return static_cast<float>(pipeline_->GetDuration().InSecondsF());
[email protected]d43ed912009-02-03 04:52:53325}
326
[email protected]4e6be3f2009-05-07 02:24:44327float WebMediaPlayerImpl::currentTime() const {
[email protected]8931c41a2009-07-07 17:31:49328 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53329
[email protected]3b4cbbf2009-07-11 00:16:19330 return static_cast<float>(pipeline_->GetTime().InSecondsF());
[email protected]d43ed912009-02-03 04:52:53331}
332
[email protected]4e6be3f2009-05-07 02:24:44333int WebMediaPlayerImpl::dataRate() const {
[email protected]8931c41a2009-07-07 17:31:49334 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53335
336 // TODO(hclam): Add this method call if pipeline has it in the interface.
337 return 0;
338}
339
[email protected]4e6be3f2009-05-07 02:24:44340float WebMediaPlayerImpl::maxTimeBuffered() const {
[email protected]8931c41a2009-07-07 17:31:49341 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53342
[email protected]3b4cbbf2009-07-11 00:16:19343 return static_cast<float>(pipeline_->GetBufferedTime().InSecondsF());
[email protected]ec9212f2008-12-18 21:40:36344}
345
[email protected]4e6be3f2009-05-07 02:24:44346float WebMediaPlayerImpl::maxTimeSeekable() const {
[email protected]8931c41a2009-07-07 17:31:49347 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53348
[email protected]73293602009-04-29 00:30:22349 // TODO(scherkus): move this logic down into the pipeline.
[email protected]3b4cbbf2009-07-11 00:16:19350 if (pipeline_->GetTotalBytes() == 0) {
[email protected]73293602009-04-29 00:30:22351 return 0.0f;
352 }
[email protected]3b4cbbf2009-07-11 00:16:19353 double total_bytes = static_cast<double>(pipeline_->GetTotalBytes());
354 double buffered_bytes = static_cast<double>(pipeline_->GetBufferedBytes());
355 double duration = static_cast<double>(pipeline_->GetDuration().InSecondsF());
[email protected]73293602009-04-29 00:30:22356 return static_cast<float>(duration * (buffered_bytes / total_bytes));
[email protected]ec9212f2008-12-18 21:40:36357}
358
[email protected]4e6be3f2009-05-07 02:24:44359unsigned long long WebMediaPlayerImpl::bytesLoaded() const {
[email protected]8931c41a2009-07-07 17:31:49360 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53361
[email protected]3b4cbbf2009-07-11 00:16:19362 return pipeline_->GetBufferedBytes();
[email protected]d43ed912009-02-03 04:52:53363}
364
[email protected]4e6be3f2009-05-07 02:24:44365unsigned long long WebMediaPlayerImpl::totalBytes() const {
[email protected]8931c41a2009-07-07 17:31:49366 DCHECK(MessageLoop::current() == main_loop_);
[email protected]d43ed912009-02-03 04:52:53367
[email protected]3b4cbbf2009-07-11 00:16:19368 return pipeline_->GetTotalBytes();
[email protected]d43ed912009-02-03 04:52:53369}
370
[email protected]4e6be3f2009-05-07 02:24:44371void WebMediaPlayerImpl::setSize(const WebSize& size) {
[email protected]8931c41a2009-07-07 17:31:49372 DCHECK(MessageLoop::current() == main_loop_);
373 DCHECK(proxy_);
[email protected]d43ed912009-02-03 04:52:53374
[email protected]8931c41a2009-07-07 17:31:49375 proxy_->SetSize(gfx::Rect(0, 0, size.width, size.height));
[email protected]ec9212f2008-12-18 21:40:36376}
377
[email protected]df143bdc2009-06-16 17:34:19378void WebMediaPlayerImpl::paint(WebCanvas* canvas,
[email protected]4e6be3f2009-05-07 02:24:44379 const WebRect& rect) {
[email protected]8931c41a2009-07-07 17:31:49380 DCHECK(MessageLoop::current() == main_loop_);
381 DCHECK(proxy_);
[email protected]4e6be3f2009-05-07 02:24:44382
[email protected]8931c41a2009-07-07 17:31:49383 proxy_->Paint(canvas, rect);
[email protected]ec9212f2008-12-18 21:40:36384}
[email protected]5df51652009-01-17 00:03:00385
[email protected]4e6be3f2009-05-07 02:24:44386void WebMediaPlayerImpl::WillDestroyCurrentMessageLoop() {
[email protected]8931c41a2009-07-07 17:31:49387 Destroy();
388 main_loop_ = NULL;
389}
390
391void WebMediaPlayerImpl::Repaint() {
392 DCHECK(MessageLoop::current() == main_loop_);
393 GetClient()->repaint();
394}
395
396void WebMediaPlayerImpl::TimeChanged() {
397 DCHECK(MessageLoop::current() == main_loop_);
398 GetClient()->timeChanged();
399}
400
401void WebMediaPlayerImpl::SetNetworkState(
402 WebKit::WebMediaPlayer::NetworkState state) {
403 DCHECK(MessageLoop::current() == main_loop_);
404 if (network_state_ != state) {
405 network_state_ = state;
406 GetClient()->networkStateChanged();
407 }
408}
409
410void WebMediaPlayerImpl::SetReadyState(
411 WebKit::WebMediaPlayer::ReadyState state) {
412 DCHECK(MessageLoop::current() == main_loop_);
413 if (ready_state_ != state) {
414 ready_state_ = state;
415 GetClient()->readyStateChanged();
416 }
417}
418
419void WebMediaPlayerImpl::Destroy() {
420 DCHECK(MessageLoop::current() == main_loop_);
421
422 // Make sure to kill the pipeline so there's no more media threads running.
[email protected]3b4cbbf2009-07-11 00:16:19423 // TODO(hclam): stopping the pipeline might block for a long time.
424 pipeline_->Stop(NULL);
425 pipeline_thread_.Stop();
[email protected]5df51652009-01-17 00:03:00426
[email protected]8931c41a2009-07-07 17:31:49427 // And then detach the proxy, it may live on the render thread for a little
428 // longer until all the tasks are finished.
429 if (proxy_) {
430 proxy_->Detach();
431 proxy_ = NULL;
[email protected]a7281022009-06-17 17:58:04432 }
[email protected]5df51652009-01-17 00:03:00433}
434
[email protected]8931c41a2009-07-07 17:31:49435WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
436 DCHECK(MessageLoop::current() == main_loop_);
437 DCHECK(client_);
438 return client_;
[email protected]5df51652009-01-17 00:03:00439}
[email protected]add51772009-06-11 18:25:17440
441} // namespace webkit_glue