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

Side by Side Diff: media/base/pipeline.cc

Issue 13813016: Remove reference counting from media::Demuxer and friends. (Closed) Base URL: http://git.chromium.org/chromium/src.git@vd_scoped
Patch Set: demuxer only Created 7 years, 8 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
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698