| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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 <limits> | 7 #include <limits> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 new media::CompositeDataSourceFactory()); | 333 new media::CompositeDataSourceFactory()); |
| 334 | 334 |
| 335 if (use_simple_data_source) { | 335 if (use_simple_data_source) { |
| 336 data_source_factory->AddFactory(simple_data_source_factory.release()); | 336 data_source_factory->AddFactory(simple_data_source_factory.release()); |
| 337 data_source_factory->AddFactory(buffered_data_source_factory.release()); | 337 data_source_factory->AddFactory(buffered_data_source_factory.release()); |
| 338 } else { | 338 } else { |
| 339 data_source_factory->AddFactory(buffered_data_source_factory.release()); | 339 data_source_factory->AddFactory(buffered_data_source_factory.release()); |
| 340 data_source_factory->AddFactory(simple_data_source_factory.release()); | 340 data_source_factory->AddFactory(simple_data_source_factory.release()); |
| 341 } | 341 } |
| 342 | 342 |
| 343 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAdaptive)) { |
| 344 chunk_demuxer_factory_.reset(new media::ChunkDemuxerFactory( |
| 345 data_source_factory->Clone())); |
| 346 } |
| 347 |
| 343 scoped_ptr<media::DemuxerFactory> demuxer_factory( | 348 scoped_ptr<media::DemuxerFactory> demuxer_factory( |
| 344 new media::FFmpegDemuxerFactory(data_source_factory.release(), | 349 new media::FFmpegDemuxerFactory(data_source_factory.release(), |
| 345 pipeline_message_loop)); | 350 pipeline_message_loop)); |
| 346 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAdaptive)) { | 351 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAdaptive)) { |
| 347 demuxer_factory.reset(new media::AdaptiveDemuxerFactory( | 352 demuxer_factory.reset(new media::AdaptiveDemuxerFactory( |
| 348 demuxer_factory.release())); | 353 demuxer_factory.release())); |
| 349 } | 354 } |
| 350 filter_collection_->SetDemuxerFactory(demuxer_factory.release()); | 355 filter_collection_->SetDemuxerFactory(demuxer_factory.release()); |
| 351 | 356 |
| 352 // Add in the default filter factories. | 357 // Add in the default filter factories. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 377 // Remove the default decoder | 382 // Remove the default decoder |
| 378 scoped_refptr<media::VideoDecoder> old_videodecoder; | 383 scoped_refptr<media::VideoDecoder> old_videodecoder; |
| 379 filter_collection_->SelectVideoDecoder(&old_videodecoder); | 384 filter_collection_->SelectVideoDecoder(&old_videodecoder); |
| 380 media::RTCVideoDecoder* rtc_video_decoder = | 385 media::RTCVideoDecoder* rtc_video_decoder = |
| 381 new media::RTCVideoDecoder( | 386 new media::RTCVideoDecoder( |
| 382 message_loop_factory_->GetMessageLoop("VideoDecoderThread"), | 387 message_loop_factory_->GetMessageLoop("VideoDecoderThread"), |
| 383 url.spec()); | 388 url.spec()); |
| 384 filter_collection_->AddVideoDecoder(rtc_video_decoder); | 389 filter_collection_->AddVideoDecoder(rtc_video_decoder); |
| 385 } | 390 } |
| 386 | 391 |
| 392 if (chunk_demuxer_factory_.get() && |
| 393 chunk_demuxer_factory_->IsUrlSupported(url.spec())) { |
| 394 media_data_sink_.reset(chunk_demuxer_factory_->CreateMediaDataSink()); |
| 395 filter_collection_->SetDemuxerFactory(chunk_demuxer_factory_.release()); |
| 396 } |
| 397 |
| 387 // Handle any volume changes that occured before load(). | 398 // Handle any volume changes that occured before load(). |
| 388 setVolume(GetClient()->volume()); | 399 setVolume(GetClient()->volume()); |
| 389 // Get the preload value. | 400 // Get the preload value. |
| 390 setPreload(GetClient()->preload()); | 401 setPreload(GetClient()->preload()); |
| 391 | 402 |
| 392 // Initialize the pipeline. | 403 // Initialize the pipeline. |
| 393 SetNetworkState(WebKit::WebMediaPlayer::Loading); | 404 SetNetworkState(WebKit::WebMediaPlayer::Loading); |
| 394 SetReadyState(WebKit::WebMediaPlayer::HaveNothing); | 405 SetReadyState(WebKit::WebMediaPlayer::HaveNothing); |
| 395 pipeline_->Start( | 406 pipeline_->Start( |
| 396 filter_collection_.release(), | 407 filter_collection_.release(), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 411 } | 422 } |
| 412 | 423 |
| 413 void WebMediaPlayerImpl::pause() { | 424 void WebMediaPlayerImpl::pause() { |
| 414 DCHECK(MessageLoop::current() == main_loop_); | 425 DCHECK(MessageLoop::current() == main_loop_); |
| 415 | 426 |
| 416 paused_ = true; | 427 paused_ = true; |
| 417 pipeline_->SetPlaybackRate(0.0f); | 428 pipeline_->SetPlaybackRate(0.0f); |
| 418 paused_time_ = pipeline_->GetCurrentTime(); | 429 paused_time_ = pipeline_->GetCurrentTime(); |
| 419 } | 430 } |
| 420 | 431 |
| 432 bool WebMediaPlayerImpl::addData(const unsigned char* data, unsigned length) { |
| 433 DCHECK(MessageLoop::current() == main_loop_); |
| 434 |
| 435 if (!media_data_sink_.get()) |
| 436 return false; |
| 437 |
| 438 return media_data_sink_->AddData(data, length); |
| 439 } |
| 440 |
| 421 bool WebMediaPlayerImpl::supportsFullscreen() const { | 441 bool WebMediaPlayerImpl::supportsFullscreen() const { |
| 422 DCHECK(MessageLoop::current() == main_loop_); | 442 DCHECK(MessageLoop::current() == main_loop_); |
| 423 return true; | 443 return true; |
| 424 } | 444 } |
| 425 | 445 |
| 426 bool WebMediaPlayerImpl::supportsSave() const { | 446 bool WebMediaPlayerImpl::supportsSave() const { |
| 427 DCHECK(MessageLoop::current() == main_loop_); | 447 DCHECK(MessageLoop::current() == main_loop_); |
| 428 return true; | 448 return true; |
| 429 } | 449 } |
| 430 | 450 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 445 | 465 |
| 446 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); | 466 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); |
| 447 | 467 |
| 448 // Update our paused time. | 468 // Update our paused time. |
| 449 if (paused_) { | 469 if (paused_) { |
| 450 paused_time_ = seek_time; | 470 paused_time_ = seek_time; |
| 451 } | 471 } |
| 452 | 472 |
| 453 seeking_ = true; | 473 seeking_ = true; |
| 454 | 474 |
| 475 if (media_data_sink_.get()) |
| 476 media_data_sink_->Flush(); |
| 477 |
| 455 // Kick off the asynchronous seek! | 478 // Kick off the asynchronous seek! |
| 456 pipeline_->Seek( | 479 pipeline_->Seek( |
| 457 seek_time, | 480 seek_time, |
| 458 NewCallback(proxy_.get(), | 481 NewCallback(proxy_.get(), |
| 459 &WebMediaPlayerImpl::Proxy::PipelineSeekCallback)); | 482 &WebMediaPlayerImpl::Proxy::PipelineSeekCallback)); |
| 460 } | 483 } |
| 461 | 484 |
| 462 void WebMediaPlayerImpl::setEndTime(float seconds) { | 485 void WebMediaPlayerImpl::setEndTime(float seconds) { |
| 463 DCHECK(MessageLoop::current() == main_loop_); | 486 DCHECK(MessageLoop::current() == main_loop_); |
| 464 | 487 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 DCHECK(MessageLoop::current() == main_loop_); | 583 DCHECK(MessageLoop::current() == main_loop_); |
| 561 | 584 |
| 562 base::TimeDelta duration = pipeline_->GetMediaDuration(); | 585 base::TimeDelta duration = pipeline_->GetMediaDuration(); |
| 563 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds) | 586 if (duration.InMicroseconds() == media::Limits::kMaxTimeInMicroseconds) |
| 564 return std::numeric_limits<float>::infinity(); | 587 return std::numeric_limits<float>::infinity(); |
| 565 return static_cast<float>(duration.InSecondsF()); | 588 return static_cast<float>(duration.InSecondsF()); |
| 566 } | 589 } |
| 567 | 590 |
| 568 float WebMediaPlayerImpl::currentTime() const { | 591 float WebMediaPlayerImpl::currentTime() const { |
| 569 DCHECK(MessageLoop::current() == main_loop_); | 592 DCHECK(MessageLoop::current() == main_loop_); |
| 570 | |
| 571 if (paused_) { | 593 if (paused_) { |
| 572 return static_cast<float>(paused_time_.InSecondsF()); | 594 return static_cast<float>(paused_time_.InSecondsF()); |
| 573 } | 595 } |
| 574 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF()); | 596 return static_cast<float>(pipeline_->GetCurrentTime().InSecondsF()); |
| 575 } | 597 } |
| 576 | 598 |
| 577 int WebMediaPlayerImpl::dataRate() const { | 599 int WebMediaPlayerImpl::dataRate() const { |
| 578 DCHECK(MessageLoop::current() == main_loop_); | 600 DCHECK(MessageLoop::current() == main_loop_); |
| 579 | 601 |
| 580 // TODO(hclam): Add this method call if pipeline has it in the interface. | 602 // TODO(hclam): Add this method call if pipeline has it in the interface. |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 } | 923 } |
| 902 | 924 |
| 903 void WebMediaPlayerImpl::Destroy() { | 925 void WebMediaPlayerImpl::Destroy() { |
| 904 DCHECK(MessageLoop::current() == main_loop_); | 926 DCHECK(MessageLoop::current() == main_loop_); |
| 905 | 927 |
| 906 // Tell the data source to abort any pending reads so that the pipeline is | 928 // Tell the data source to abort any pending reads so that the pipeline is |
| 907 // not blocked when issuing stop commands to the other filters. | 929 // not blocked when issuing stop commands to the other filters. |
| 908 if (proxy_) | 930 if (proxy_) |
| 909 proxy_->AbortDataSources(); | 931 proxy_->AbortDataSources(); |
| 910 | 932 |
| 933 if (media_data_sink_.get()) |
| 934 media_data_sink_->Shutdown(); |
| 935 |
| 911 // Make sure to kill the pipeline so there's no more media threads running. | 936 // Make sure to kill the pipeline so there's no more media threads running. |
| 912 // Note: stopping the pipeline might block for a long time. | 937 // Note: stopping the pipeline might block for a long time. |
| 913 if (pipeline_) { | 938 if (pipeline_) { |
| 914 media::PipelineStatusNotification note; | 939 media::PipelineStatusNotification note; |
| 915 pipeline_->Stop(note.Callback()); | 940 pipeline_->Stop(note.Callback()); |
| 916 note.Wait(); | 941 note.Wait(); |
| 917 } | 942 } |
| 918 | 943 |
| 919 message_loop_factory_.reset(); | 944 message_loop_factory_.reset(); |
| 920 | 945 |
| 921 // And then detach the proxy, it may live on the render thread for a little | 946 // And then detach the proxy, it may live on the render thread for a little |
| 922 // longer until all the tasks are finished. | 947 // longer until all the tasks are finished. |
| 923 if (proxy_) { | 948 if (proxy_) { |
| 924 proxy_->Detach(); | 949 proxy_->Detach(); |
| 925 proxy_ = NULL; | 950 proxy_ = NULL; |
| 926 } | 951 } |
| 927 } | 952 } |
| 928 | 953 |
| 929 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() { | 954 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() { |
| 930 DCHECK(MessageLoop::current() == main_loop_); | 955 DCHECK(MessageLoop::current() == main_loop_); |
| 931 DCHECK(client_); | 956 DCHECK(client_); |
| 932 return client_; | 957 return client_; |
| 933 } | 958 } |
| 934 | 959 |
| 935 } // namespace webkit_glue | 960 } // namespace webkit_glue |
| OLD | NEW |