OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/pipeline.h" | 5 #include "media/base/pipeline.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
74 playback_rate_(0.0f), | 74 playback_rate_(0.0f), |
75 clock_(new Clock(&default_clock_)), | 75 clock_(new Clock(&default_clock_)), |
76 waiting_for_clock_update_(false), | 76 waiting_for_clock_update_(false), |
77 status_(PIPELINE_OK), | 77 status_(PIPELINE_OK), |
78 has_audio_(false), | 78 has_audio_(false), |
79 has_video_(false), | 79 has_video_(false), |
80 state_(kCreated), | 80 state_(kCreated), |
81 audio_ended_(false), | 81 audio_ended_(false), |
82 video_ended_(false), | 82 video_ended_(false), |
83 audio_disabled_(false), | 83 audio_disabled_(false), |
84 demuxer_(NULL), | |
84 creation_time_(base::Time::Now()) { | 85 creation_time_(base::Time::Now()) { |
85 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); | 86 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); |
86 media_log_->AddEvent( | 87 media_log_->AddEvent( |
87 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED)); | 88 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED)); |
88 } | 89 } |
89 | 90 |
90 Pipeline::~Pipeline() { | 91 Pipeline::~Pipeline() { |
91 // TODO(scherkus): Reenable after figuring out why this is firing, see | 92 // TODO(scherkus): Reenable after figuring out why this is firing, see |
92 // http://crbug.com/148405 | 93 // http://crbug.com/148405 |
93 #if 0 | 94 #if 0 |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
577 bound_fns.Push(base::Bind( | 578 bound_fns.Push(base::Bind( |
578 &AudioRenderer::Flush, base::Unretained(audio_renderer_.get()))); | 579 &AudioRenderer::Flush, base::Unretained(audio_renderer_.get()))); |
579 } | 580 } |
580 if (video_renderer_) { | 581 if (video_renderer_) { |
581 bound_fns.Push(base::Bind( | 582 bound_fns.Push(base::Bind( |
582 &VideoRenderer::Flush, base::Unretained(video_renderer_.get()))); | 583 &VideoRenderer::Flush, base::Unretained(video_renderer_.get()))); |
583 } | 584 } |
584 | 585 |
585 // Seek demuxer. | 586 // Seek demuxer. |
586 bound_fns.Push(base::Bind( | 587 bound_fns.Push(base::Bind( |
587 &Demuxer::Seek, demuxer_, seek_timestamp)); | 588 &Demuxer::Seek, base::Unretained(demuxer_), seek_timestamp)); |
588 | 589 |
589 // Preroll renderers. | 590 // Preroll renderers. |
590 if (audio_renderer_) { | 591 if (audio_renderer_) { |
591 bound_fns.Push(base::Bind( | 592 bound_fns.Push(base::Bind( |
592 &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()), | 593 &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()), |
593 seek_timestamp)); | 594 seek_timestamp)); |
594 } | 595 } |
595 | 596 |
596 if (video_renderer_) { | 597 if (video_renderer_) { |
597 bound_fns.Push(base::Bind( | 598 bound_fns.Push(base::Bind( |
(...skipping 23 matching lines...) Expand all Loading... | |
621 } | 622 } |
622 | 623 |
623 pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); | 624 pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); |
624 } | 625 } |
625 | 626 |
626 void Pipeline::DoStop(const PipelineStatusCB& done_cb) { | 627 void Pipeline::DoStop(const PipelineStatusCB& done_cb) { |
627 DCHECK(message_loop_->BelongsToCurrentThread()); | 628 DCHECK(message_loop_->BelongsToCurrentThread()); |
628 DCHECK(!pending_callbacks_.get()); | 629 DCHECK(!pending_callbacks_.get()); |
629 SerialRunner::Queue bound_fns; | 630 SerialRunner::Queue bound_fns; |
630 | 631 |
631 if (demuxer_) | 632 if (demuxer_) { |
632 bound_fns.Push(base::Bind(&Demuxer::Stop, demuxer_)); | 633 bound_fns.Push(base::Bind( |
634 &Demuxer::Stop, base::Unretained(demuxer_))); | |
635 } | |
633 | 636 |
634 if (audio_renderer_) { | 637 if (audio_renderer_) { |
635 bound_fns.Push(base::Bind( | 638 bound_fns.Push(base::Bind( |
636 &AudioRenderer::Stop, base::Unretained(audio_renderer_.get()))); | 639 &AudioRenderer::Stop, base::Unretained(audio_renderer_.get()))); |
637 } | 640 } |
638 | 641 |
639 if (video_renderer_) { | 642 if (video_renderer_) { |
640 bound_fns.Push(base::Bind( | 643 bound_fns.Push(base::Bind( |
641 &VideoRenderer::Stop, base::Unretained(video_renderer_.get()))); | 644 &VideoRenderer::Stop, base::Unretained(video_renderer_.get()))); |
642 } | 645 } |
643 | 646 |
644 pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); | 647 pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); |
645 } | 648 } |
646 | 649 |
647 void Pipeline::OnStopCompleted(PipelineStatus status) { | 650 void Pipeline::OnStopCompleted(PipelineStatus status) { |
648 DCHECK(message_loop_->BelongsToCurrentThread()); | 651 DCHECK(message_loop_->BelongsToCurrentThread()); |
649 DCHECK_EQ(state_, kStopping); | 652 DCHECK_EQ(state_, kStopping); |
650 { | 653 { |
651 base::AutoLock l(lock_); | 654 base::AutoLock l(lock_); |
652 running_ = false; | 655 running_ = false; |
653 } | 656 } |
654 | 657 |
655 SetState(kStopped); | 658 SetState(kStopped); |
656 pending_callbacks_.reset(); | 659 pending_callbacks_.reset(); |
657 filter_collection_.reset(); | 660 filter_collection_.reset(); |
658 audio_renderer_.reset(); | 661 audio_renderer_.reset(); |
659 video_renderer_.reset(); | 662 video_renderer_.reset(); |
660 demuxer_ = NULL; | |
acolwell GONE FROM CHROMIUM
2013/04/19 18:17:59
nit: Any harm in keeping this? It will trigger an
scherkus (not reviewing)
2013/04/19 23:18:45
Done.
| |
661 | 663 |
662 // If we stop during initialization/seeking we want to run |seek_cb_| | 664 // If we stop during initialization/seeking we want to run |seek_cb_| |
663 // followed by |stop_cb_| so we don't leave outstanding callbacks around. | 665 // followed by |stop_cb_| so we don't leave outstanding callbacks around. |
664 if (!seek_cb_.is_null()) { | 666 if (!seek_cb_.is_null()) { |
665 base::ResetAndReturn(&seek_cb_).Run(status_); | 667 base::ResetAndReturn(&seek_cb_).Run(status_); |
666 error_cb_.Reset(); | 668 error_cb_.Reset(); |
667 } | 669 } |
668 if (!stop_cb_.is_null()) { | 670 if (!stop_cb_.is_null()) { |
669 base::ResetAndReturn(&stop_cb_).Run(); | 671 base::ResetAndReturn(&stop_cb_).Run(); |
670 error_cb_.Reset(); | 672 error_cb_.Reset(); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
904 void Pipeline::InitializeDemuxer(const PipelineStatusCB& done_cb) { | 906 void Pipeline::InitializeDemuxer(const PipelineStatusCB& done_cb) { |
905 DCHECK(message_loop_->BelongsToCurrentThread()); | 907 DCHECK(message_loop_->BelongsToCurrentThread()); |
906 | 908 |
907 demuxer_ = filter_collection_->GetDemuxer(); | 909 demuxer_ = filter_collection_->GetDemuxer(); |
908 demuxer_->Initialize(this, done_cb); | 910 demuxer_->Initialize(this, done_cb); |
909 } | 911 } |
910 | 912 |
911 void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) { | 913 void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) { |
912 DCHECK(message_loop_->BelongsToCurrentThread()); | 914 DCHECK(message_loop_->BelongsToCurrentThread()); |
913 | 915 |
914 scoped_refptr<DemuxerStream> stream = | |
915 demuxer_->GetStream(DemuxerStream::AUDIO); | |
916 DCHECK(stream); | |
917 | |
918 audio_renderer_ = filter_collection_->GetAudioRenderer(); | 916 audio_renderer_ = filter_collection_->GetAudioRenderer(); |
919 audio_renderer_->Initialize( | 917 audio_renderer_->Initialize( |
920 stream, | 918 demuxer_->GetStream(DemuxerStream::AUDIO), |
921 done_cb, | 919 done_cb, |
922 base::Bind(&Pipeline::OnUpdateStatistics, this), | 920 base::Bind(&Pipeline::OnUpdateStatistics, this), |
923 base::Bind(&Pipeline::OnAudioUnderflow, this), | 921 base::Bind(&Pipeline::OnAudioUnderflow, this), |
924 base::Bind(&Pipeline::OnAudioTimeUpdate, this), | 922 base::Bind(&Pipeline::OnAudioTimeUpdate, this), |
925 base::Bind(&Pipeline::OnAudioRendererEnded, this), | 923 base::Bind(&Pipeline::OnAudioRendererEnded, this), |
926 base::Bind(&Pipeline::OnAudioDisabled, this), | 924 base::Bind(&Pipeline::OnAudioDisabled, this), |
927 base::Bind(&Pipeline::SetError, this)); | 925 base::Bind(&Pipeline::SetError, this)); |
928 } | 926 } |
929 | 927 |
930 void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) { | 928 void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) { |
931 DCHECK(message_loop_->BelongsToCurrentThread()); | 929 DCHECK(message_loop_->BelongsToCurrentThread()); |
932 | 930 |
933 scoped_refptr<DemuxerStream> stream = | 931 scoped_refptr<DemuxerStream> stream = |
934 demuxer_->GetStream(DemuxerStream::VIDEO); | 932 demuxer_->GetStream(DemuxerStream::VIDEO); |
935 DCHECK(stream); | |
936 | 933 |
937 { | 934 { |
938 // Get an initial natural size so we have something when we signal | 935 // Get an initial natural size so we have something when we signal |
939 // the kHaveMetadata buffering state. | 936 // the kHaveMetadata buffering state. |
940 base::AutoLock l(lock_); | 937 base::AutoLock l(lock_); |
941 natural_size_ = stream->video_decoder_config().natural_size(); | 938 natural_size_ = stream->video_decoder_config().natural_size(); |
942 } | 939 } |
943 | 940 |
944 video_renderer_ = filter_collection_->GetVideoRenderer(); | 941 video_renderer_ = filter_collection_->GetVideoRenderer(); |
945 video_renderer_->Initialize( | 942 video_renderer_->Initialize( |
(...skipping 25 matching lines...) Expand all Loading... | |
971 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() { | 968 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() { |
972 lock_.AssertAcquired(); | 969 lock_.AssertAcquired(); |
973 if (!waiting_for_clock_update_) | 970 if (!waiting_for_clock_update_) |
974 return; | 971 return; |
975 | 972 |
976 waiting_for_clock_update_ = false; | 973 waiting_for_clock_update_ = false; |
977 clock_->Play(); | 974 clock_->Play(); |
978 } | 975 } |
979 | 976 |
980 } // namespace media | 977 } // namespace media |
OLD | NEW |