| 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 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 state_ = next_state; | 253 state_ = next_state; |
| 254 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(next_state)); | 254 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(next_state)); |
| 255 } | 255 } |
| 256 | 256 |
| 257 #define RETURN_STRING(state) case state: return #state; | 257 #define RETURN_STRING(state) case state: return #state; |
| 258 | 258 |
| 259 const char* Pipeline::GetStateString(State state) { | 259 const char* Pipeline::GetStateString(State state) { |
| 260 switch (state) { | 260 switch (state) { |
| 261 RETURN_STRING(kCreated); | 261 RETURN_STRING(kCreated); |
| 262 RETURN_STRING(kInitDemuxer); | 262 RETURN_STRING(kInitDemuxer); |
| 263 RETURN_STRING(kInitAudioDecoder); | |
| 264 RETURN_STRING(kInitAudioRenderer); | 263 RETURN_STRING(kInitAudioRenderer); |
| 265 RETURN_STRING(kInitVideoRenderer); | 264 RETURN_STRING(kInitVideoRenderer); |
| 266 RETURN_STRING(kInitPrerolling); | 265 RETURN_STRING(kInitPrerolling); |
| 267 RETURN_STRING(kSeeking); | 266 RETURN_STRING(kSeeking); |
| 268 RETURN_STRING(kStarting); | 267 RETURN_STRING(kStarting); |
| 269 RETURN_STRING(kStarted); | 268 RETURN_STRING(kStarted); |
| 270 RETURN_STRING(kStopping); | 269 RETURN_STRING(kStopping); |
| 271 RETURN_STRING(kStopped); | 270 RETURN_STRING(kStopped); |
| 272 } | 271 } |
| 273 NOTREACHED(); | 272 NOTREACHED(); |
| 274 return "INVALID"; | 273 return "INVALID"; |
| 275 } | 274 } |
| 276 | 275 |
| 277 #undef RETURN_STRING | 276 #undef RETURN_STRING |
| 278 | 277 |
| 279 Pipeline::State Pipeline::GetNextState() const { | 278 Pipeline::State Pipeline::GetNextState() const { |
| 280 DCHECK(message_loop_->BelongsToCurrentThread()); | 279 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 281 DCHECK(stop_cb_.is_null()) | 280 DCHECK(stop_cb_.is_null()) |
| 282 << "State transitions don't happen when stopping"; | 281 << "State transitions don't happen when stopping"; |
| 283 DCHECK_EQ(status_, PIPELINE_OK) | 282 DCHECK_EQ(status_, PIPELINE_OK) |
| 284 << "State transitions don't happen when there's an error: " << status_; | 283 << "State transitions don't happen when there's an error: " << status_; |
| 285 | 284 |
| 286 switch (state_) { | 285 switch (state_) { |
| 287 case kCreated: | 286 case kCreated: |
| 288 return kInitDemuxer; | 287 return kInitDemuxer; |
| 289 | 288 |
| 290 case kInitDemuxer: | 289 case kInitDemuxer: |
| 291 if (demuxer_->GetStream(DemuxerStream::AUDIO)) | 290 if (demuxer_->GetStream(DemuxerStream::AUDIO)) |
| 292 return kInitAudioDecoder; | 291 return kInitAudioRenderer; |
| 293 if (demuxer_->GetStream(DemuxerStream::VIDEO)) | 292 if (demuxer_->GetStream(DemuxerStream::VIDEO)) |
| 294 return kInitVideoRenderer; | 293 return kInitVideoRenderer; |
| 295 return kInitPrerolling; | 294 return kInitPrerolling; |
| 296 | 295 |
| 297 case kInitAudioDecoder: | |
| 298 return kInitAudioRenderer; | |
| 299 | |
| 300 case kInitAudioRenderer: | 296 case kInitAudioRenderer: |
| 301 if (demuxer_->GetStream(DemuxerStream::VIDEO)) | 297 if (demuxer_->GetStream(DemuxerStream::VIDEO)) |
| 302 return kInitVideoRenderer; | 298 return kInitVideoRenderer; |
| 303 return kInitPrerolling; | 299 return kInitPrerolling; |
| 304 | 300 |
| 305 case kInitVideoRenderer: | 301 case kInitVideoRenderer: |
| 306 return kInitPrerolling; | 302 return kInitPrerolling; |
| 307 | 303 |
| 308 case kInitPrerolling: | 304 case kInitPrerolling: |
| 309 return kStarting; | 305 return kStarting; |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 pending_callbacks_.reset(); | 445 pending_callbacks_.reset(); |
| 450 | 446 |
| 451 PipelineStatusCB done_cb = base::Bind(&Pipeline::OnStateTransition, this); | 447 PipelineStatusCB done_cb = base::Bind(&Pipeline::OnStateTransition, this); |
| 452 | 448 |
| 453 // Switch states, performing any entrance actions for the new state as well. | 449 // Switch states, performing any entrance actions for the new state as well. |
| 454 SetState(GetNextState()); | 450 SetState(GetNextState()); |
| 455 switch (state_) { | 451 switch (state_) { |
| 456 case kInitDemuxer: | 452 case kInitDemuxer: |
| 457 return InitializeDemuxer(done_cb); | 453 return InitializeDemuxer(done_cb); |
| 458 | 454 |
| 459 case kInitAudioDecoder: | |
| 460 return InitializeAudioDecoder(done_cb); | |
| 461 | |
| 462 case kInitAudioRenderer: | 455 case kInitAudioRenderer: |
| 463 return InitializeAudioRenderer(done_cb); | 456 return InitializeAudioRenderer(done_cb); |
| 464 | 457 |
| 465 case kInitVideoRenderer: | 458 case kInitVideoRenderer: |
| 466 return InitializeVideoRenderer(done_cb); | 459 return InitializeVideoRenderer(done_cb); |
| 467 | 460 |
| 468 case kInitPrerolling: | 461 case kInitPrerolling: |
| 469 filter_collection_.reset(); | 462 filter_collection_.reset(); |
| 470 { | 463 { |
| 471 base::AutoLock l(lock_); | 464 base::AutoLock l(lock_); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 DCHECK(message_loop_->BelongsToCurrentThread()); | 611 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 619 DCHECK_EQ(state_, kStopping); | 612 DCHECK_EQ(state_, kStopping); |
| 620 { | 613 { |
| 621 base::AutoLock l(lock_); | 614 base::AutoLock l(lock_); |
| 622 running_ = false; | 615 running_ = false; |
| 623 } | 616 } |
| 624 | 617 |
| 625 SetState(kStopped); | 618 SetState(kStopped); |
| 626 pending_callbacks_.reset(); | 619 pending_callbacks_.reset(); |
| 627 filter_collection_.reset(); | 620 filter_collection_.reset(); |
| 628 audio_decoder_ = NULL; | |
| 629 audio_renderer_ = NULL; | 621 audio_renderer_ = NULL; |
| 630 video_renderer_ = NULL; | 622 video_renderer_ = NULL; |
| 631 demuxer_ = NULL; | 623 demuxer_ = NULL; |
| 632 | 624 |
| 633 // If we stop during initialization/seeking we want to run |seek_cb_| | 625 // If we stop during initialization/seeking we want to run |seek_cb_| |
| 634 // followed by |stop_cb_| so we don't leave outstanding callbacks around. | 626 // followed by |stop_cb_| so we don't leave outstanding callbacks around. |
| 635 if (!seek_cb_.is_null()) { | 627 if (!seek_cb_.is_null()) { |
| 636 base::ResetAndReturn(&seek_cb_).Run(status_); | 628 base::ResetAndReturn(&seek_cb_).Run(status_); |
| 637 error_cb_.Reset(); | 629 error_cb_.Reset(); |
| 638 } | 630 } |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 StartClockIfWaitingForTimeUpdate_Locked(); | 868 StartClockIfWaitingForTimeUpdate_Locked(); |
| 877 } | 869 } |
| 878 | 870 |
| 879 void Pipeline::InitializeDemuxer(const PipelineStatusCB& done_cb) { | 871 void Pipeline::InitializeDemuxer(const PipelineStatusCB& done_cb) { |
| 880 DCHECK(message_loop_->BelongsToCurrentThread()); | 872 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 881 | 873 |
| 882 demuxer_ = filter_collection_->GetDemuxer(); | 874 demuxer_ = filter_collection_->GetDemuxer(); |
| 883 demuxer_->Initialize(this, done_cb); | 875 demuxer_->Initialize(this, done_cb); |
| 884 } | 876 } |
| 885 | 877 |
| 886 void Pipeline::InitializeAudioDecoder(const PipelineStatusCB& done_cb) { | 878 void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) { |
| 887 DCHECK(message_loop_->BelongsToCurrentThread()); | 879 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 888 | 880 |
| 889 scoped_refptr<DemuxerStream> stream = | 881 scoped_refptr<DemuxerStream> stream = |
| 890 demuxer_->GetStream(DemuxerStream::AUDIO); | 882 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 891 DCHECK(stream); | 883 DCHECK(stream); |
| 892 | 884 |
| 893 filter_collection_->SelectAudioDecoder(&audio_decoder_); | |
| 894 audio_decoder_->Initialize( | |
| 895 stream, done_cb, base::Bind(&Pipeline::OnUpdateStatistics, this)); | |
| 896 } | |
| 897 | |
| 898 void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) { | |
| 899 DCHECK(message_loop_->BelongsToCurrentThread()); | |
| 900 DCHECK(audio_decoder_); | |
| 901 | |
| 902 filter_collection_->SelectAudioRenderer(&audio_renderer_); | 885 filter_collection_->SelectAudioRenderer(&audio_renderer_); |
| 903 audio_renderer_->Initialize( | 886 audio_renderer_->Initialize( |
| 904 audio_decoder_, | 887 stream, |
| 888 *filter_collection_->GetAudioDecoders(), |
| 905 done_cb, | 889 done_cb, |
| 890 base::Bind(&Pipeline::OnUpdateStatistics, this), |
| 906 base::Bind(&Pipeline::OnAudioUnderflow, this), | 891 base::Bind(&Pipeline::OnAudioUnderflow, this), |
| 907 base::Bind(&Pipeline::OnAudioTimeUpdate, this), | 892 base::Bind(&Pipeline::OnAudioTimeUpdate, this), |
| 908 base::Bind(&Pipeline::OnAudioRendererEnded, this), | 893 base::Bind(&Pipeline::OnAudioRendererEnded, this), |
| 909 base::Bind(&Pipeline::OnAudioDisabled, this), | 894 base::Bind(&Pipeline::OnAudioDisabled, this), |
| 910 base::Bind(&Pipeline::SetError, this)); | 895 base::Bind(&Pipeline::SetError, this)); |
| 896 filter_collection_->GetAudioDecoders()->clear(); |
| 911 } | 897 } |
| 912 | 898 |
| 913 void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) { | 899 void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) { |
| 914 DCHECK(message_loop_->BelongsToCurrentThread()); | 900 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 915 | 901 |
| 916 scoped_refptr<DemuxerStream> stream = | 902 scoped_refptr<DemuxerStream> stream = |
| 917 demuxer_->GetStream(DemuxerStream::VIDEO); | 903 demuxer_->GetStream(DemuxerStream::VIDEO); |
| 918 DCHECK(stream); | 904 DCHECK(stream); |
| 919 | 905 |
| 920 { | 906 { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 956 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() { | 942 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() { |
| 957 lock_.AssertAcquired(); | 943 lock_.AssertAcquired(); |
| 958 if (!waiting_for_clock_update_) | 944 if (!waiting_for_clock_update_) |
| 959 return; | 945 return; |
| 960 | 946 |
| 961 waiting_for_clock_update_ = false; | 947 waiting_for_clock_update_ = false; |
| 962 clock_->Play(); | 948 clock_->Play(); |
| 963 } | 949 } |
| 964 | 950 |
| 965 } // namespace media | 951 } // namespace media |
| OLD | NEW |