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 "webkit/glue/webmediaplayer_impl.h" | 5 #include "webkit/glue/webmediaplayer_impl.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "media/base/limits.h" | 9 #include "media/base/limits.h" |
10 #include "media/base/media_format.h" | 10 #include "media/base/media_format.h" |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 WebMediaPlayerImpl::~WebMediaPlayerImpl() { | 235 WebMediaPlayerImpl::~WebMediaPlayerImpl() { |
236 Destroy(); | 236 Destroy(); |
237 | 237 |
238 // Finally tell the |main_loop_| we don't want to be notified of destruction | 238 // Finally tell the |main_loop_| we don't want to be notified of destruction |
239 // event. | 239 // event. |
240 if (main_loop_) { | 240 if (main_loop_) { |
241 main_loop_->RemoveDestructionObserver(this); | 241 main_loop_->RemoveDestructionObserver(this); |
242 } | 242 } |
243 } | 243 } |
244 | 244 |
| 245 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::client() const { |
| 246 // TODO(boliu): Remove these? Need locks? |
| 247 DCHECK(MessageLoop::current() == main_loop_); |
| 248 DCHECK(client_); |
| 249 return client_; |
| 250 } |
| 251 |
| 252 void WebMediaPlayerImpl::setClient(WebKit::WebMediaPlayerClient* new_client) { |
| 253 // TODO(boliu): Remove these? Need locks? |
| 254 DCHECK(MessageLoop::current() == main_loop_); |
| 255 client_ = new_client; |
| 256 } |
| 257 |
245 void WebMediaPlayerImpl::load(const WebKit::WebURL& url) { | 258 void WebMediaPlayerImpl::load(const WebKit::WebURL& url) { |
246 DCHECK(MessageLoop::current() == main_loop_); | 259 DCHECK(MessageLoop::current() == main_loop_); |
247 DCHECK(proxy_); | 260 DCHECK(proxy_); |
248 | 261 |
249 // Handle any volume changes that occured before load(). | 262 // Handle any volume changes that occured before load(). |
250 setVolume(GetClient()->volume()); | 263 setVolume(client()->volume()); |
251 | 264 |
252 // Initialize the pipeline. | 265 // Initialize the pipeline. |
253 SetNetworkState(WebKit::WebMediaPlayer::Loading); | 266 SetNetworkState(WebKit::WebMediaPlayer::Loading); |
254 SetReadyState(WebKit::WebMediaPlayer::HaveNothing); | 267 SetReadyState(WebKit::WebMediaPlayer::HaveNothing); |
255 pipeline_->Start( | 268 pipeline_->Start( |
256 filter_factory_.get(), | 269 filter_factory_.get(), |
257 url.spec(), | 270 url.spec(), |
258 NewCallback(proxy_.get(), | 271 NewCallback(proxy_.get(), |
259 &WebMediaPlayerImpl::Proxy::PipelineInitializationCallback)); | 272 &WebMediaPlayerImpl::Proxy::PipelineInitializationCallback)); |
260 } | 273 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 DCHECK(MessageLoop::current() == main_loop_); | 305 DCHECK(MessageLoop::current() == main_loop_); |
293 | 306 |
294 // WebKit fires a seek(0) at the very start, however pipeline already does a | 307 // WebKit fires a seek(0) at the very start, however pipeline already does a |
295 // seek(0) internally. Avoid doing seek(0) the second time because this will | 308 // seek(0) internally. Avoid doing seek(0) the second time because this will |
296 // cause extra pre-rolling and will break servers without range request | 309 // cause extra pre-rolling and will break servers without range request |
297 // support. | 310 // support. |
298 // | 311 // |
299 // We still have to notify WebKit that time has changed otherwise | 312 // We still have to notify WebKit that time has changed otherwise |
300 // HTMLMediaElement gets into an inconsistent state. | 313 // HTMLMediaElement gets into an inconsistent state. |
301 if (pipeline_->GetCurrentTime().ToInternalValue() == 0 && seconds == 0) { | 314 if (pipeline_->GetCurrentTime().ToInternalValue() == 0 && seconds == 0) { |
302 GetClient()->timeChanged(); | 315 client()->timeChanged(); |
303 return; | 316 return; |
304 } | 317 } |
305 | 318 |
306 // Drop our ready state if the media file isn't fully loaded. | 319 // Drop our ready state if the media file isn't fully loaded. |
307 if (!pipeline_->IsLoaded()) { | 320 if (!pipeline_->IsLoaded()) { |
308 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); | 321 SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); |
309 } | 322 } |
310 | 323 |
311 // Try to preserve as much accuracy as possible. | 324 // Try to preserve as much accuracy as possible. |
312 float microseconds = seconds * base::Time::kMicrosecondsPerSecond; | 325 float microseconds = seconds * base::Time::kMicrosecondsPerSecond; |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 return WebKit::WebMediaPlayer::Unknown; | 575 return WebKit::WebMediaPlayer::Unknown; |
563 } | 576 } |
564 | 577 |
565 void WebMediaPlayerImpl::WillDestroyCurrentMessageLoop() { | 578 void WebMediaPlayerImpl::WillDestroyCurrentMessageLoop() { |
566 Destroy(); | 579 Destroy(); |
567 main_loop_ = NULL; | 580 main_loop_ = NULL; |
568 } | 581 } |
569 | 582 |
570 void WebMediaPlayerImpl::Repaint() { | 583 void WebMediaPlayerImpl::Repaint() { |
571 DCHECK(MessageLoop::current() == main_loop_); | 584 DCHECK(MessageLoop::current() == main_loop_); |
572 GetClient()->repaint(); | 585 client()->repaint(); |
573 } | 586 } |
574 | 587 |
575 void WebMediaPlayerImpl::OnPipelineInitialize() { | 588 void WebMediaPlayerImpl::OnPipelineInitialize() { |
576 DCHECK(MessageLoop::current() == main_loop_); | 589 DCHECK(MessageLoop::current() == main_loop_); |
577 if (pipeline_->GetError() == media::PIPELINE_OK) { | 590 if (pipeline_->GetError() == media::PIPELINE_OK) { |
578 // Only keep one time range starting from 0. | 591 // Only keep one time range starting from 0. |
579 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1)); | 592 WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1)); |
580 new_buffered[0].start = 0.0f; | 593 new_buffered[0].start = 0.0f; |
581 new_buffered[0].end = | 594 new_buffered[0].end = |
582 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); | 595 static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); |
(...skipping 22 matching lines...) Expand all Loading... |
605 | 618 |
606 void WebMediaPlayerImpl::OnPipelineSeek() { | 619 void WebMediaPlayerImpl::OnPipelineSeek() { |
607 DCHECK(MessageLoop::current() == main_loop_); | 620 DCHECK(MessageLoop::current() == main_loop_); |
608 if (pipeline_->GetError() == media::PIPELINE_OK) { | 621 if (pipeline_->GetError() == media::PIPELINE_OK) { |
609 // Update our paused time. | 622 // Update our paused time. |
610 if (paused_) { | 623 if (paused_) { |
611 paused_time_ = pipeline_->GetCurrentTime(); | 624 paused_time_ = pipeline_->GetCurrentTime(); |
612 } | 625 } |
613 | 626 |
614 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); | 627 SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); |
615 GetClient()->timeChanged(); | 628 client()->timeChanged(); |
616 } | 629 } |
617 } | 630 } |
618 | 631 |
619 void WebMediaPlayerImpl::OnPipelineEnded() { | 632 void WebMediaPlayerImpl::OnPipelineEnded() { |
620 DCHECK(MessageLoop::current() == main_loop_); | 633 DCHECK(MessageLoop::current() == main_loop_); |
621 if (pipeline_->GetError() == media::PIPELINE_OK) { | 634 if (pipeline_->GetError() == media::PIPELINE_OK) { |
622 GetClient()->timeChanged(); | 635 client()->timeChanged(); |
623 } | 636 } |
624 } | 637 } |
625 | 638 |
626 void WebMediaPlayerImpl::OnPipelineError() { | 639 void WebMediaPlayerImpl::OnPipelineError() { |
627 DCHECK(MessageLoop::current() == main_loop_); | 640 DCHECK(MessageLoop::current() == main_loop_); |
628 switch (pipeline_->GetError()) { | 641 switch (pipeline_->GetError()) { |
629 case media::PIPELINE_OK: | 642 case media::PIPELINE_OK: |
630 case media::PIPELINE_ERROR_INITIALIZATION_FAILED: | 643 case media::PIPELINE_ERROR_INITIALIZATION_FAILED: |
631 case media::PIPELINE_ERROR_REQUIRED_FILTER_MISSING: | 644 case media::PIPELINE_ERROR_REQUIRED_FILTER_MISSING: |
632 case media::PIPELINE_ERROR_COULD_NOT_RENDER: | 645 case media::PIPELINE_ERROR_COULD_NOT_RENDER: |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 SetNetworkState(WebKit::WebMediaPlayer::Idle); | 681 SetNetworkState(WebKit::WebMediaPlayer::Idle); |
669 } | 682 } |
670 } | 683 } |
671 } | 684 } |
672 | 685 |
673 void WebMediaPlayerImpl::SetNetworkState( | 686 void WebMediaPlayerImpl::SetNetworkState( |
674 WebKit::WebMediaPlayer::NetworkState state) { | 687 WebKit::WebMediaPlayer::NetworkState state) { |
675 DCHECK(MessageLoop::current() == main_loop_); | 688 DCHECK(MessageLoop::current() == main_loop_); |
676 // Always notify to ensure client has the latest value. | 689 // Always notify to ensure client has the latest value. |
677 network_state_ = state; | 690 network_state_ = state; |
678 GetClient()->networkStateChanged(); | 691 client()->networkStateChanged(); |
679 } | 692 } |
680 | 693 |
681 void WebMediaPlayerImpl::SetReadyState( | 694 void WebMediaPlayerImpl::SetReadyState( |
682 WebKit::WebMediaPlayer::ReadyState state) { | 695 WebKit::WebMediaPlayer::ReadyState state) { |
683 DCHECK(MessageLoop::current() == main_loop_); | 696 DCHECK(MessageLoop::current() == main_loop_); |
684 // Always notify to ensure client has the latest value. | 697 // Always notify to ensure client has the latest value. |
685 ready_state_ = state; | 698 ready_state_ = state; |
686 GetClient()->readyStateChanged(); | 699 client()->readyStateChanged(); |
687 } | 700 } |
688 | 701 |
689 void WebMediaPlayerImpl::Destroy() { | 702 void WebMediaPlayerImpl::Destroy() { |
690 DCHECK(MessageLoop::current() == main_loop_); | 703 DCHECK(MessageLoop::current() == main_loop_); |
691 | 704 |
692 // Make sure to kill the pipeline so there's no more media threads running. | 705 // Make sure to kill the pipeline so there's no more media threads running. |
693 // Note: stopping the pipeline might block for a long time. | 706 // Note: stopping the pipeline might block for a long time. |
694 pipeline_->Stop(NewCallback(this, | 707 pipeline_->Stop(NewCallback(this, |
695 &WebMediaPlayerImpl::PipelineStoppedCallback)); | 708 &WebMediaPlayerImpl::PipelineStoppedCallback)); |
696 pipeline_stopped_.Wait(); | 709 pipeline_stopped_.Wait(); |
697 pipeline_thread_.Stop(); | 710 pipeline_thread_.Stop(); |
698 | 711 |
699 // And then detach the proxy, it may live on the render thread for a little | 712 // And then detach the proxy, it may live on the render thread for a little |
700 // longer until all the tasks are finished. | 713 // longer until all the tasks are finished. |
701 if (proxy_) { | 714 if (proxy_) { |
702 proxy_->Detach(); | 715 proxy_->Detach(); |
703 proxy_ = NULL; | 716 proxy_ = NULL; |
704 } | 717 } |
705 } | 718 } |
706 | 719 |
707 void WebMediaPlayerImpl::PipelineStoppedCallback() { | 720 void WebMediaPlayerImpl::PipelineStoppedCallback() { |
708 pipeline_stopped_.Signal(); | 721 pipeline_stopped_.Signal(); |
709 } | 722 } |
710 | 723 |
711 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() { | |
712 DCHECK(MessageLoop::current() == main_loop_); | |
713 DCHECK(client_); | |
714 return client_; | |
715 } | |
716 | |
717 } // namespace webkit_glue | 724 } // namespace webkit_glue |
OLD | NEW |