Index: media/base/pipeline_impl.cc |
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc |
index 5f4705b5d2639c6b4b2dd65bceacc72178d26d9c..adc46faf1ba24720a3b6432425660247a99b5f77 100644 |
--- a/media/base/pipeline_impl.cc |
+++ b/media/base/pipeline_impl.cc |
@@ -47,6 +47,7 @@ PipelineImpl::PipelineImpl( |
renderer_ended_(false), |
text_renderer_ended_(false), |
demuxer_(NULL), |
+ client_(nullptr), |
cdm_context_(nullptr), |
weak_factory_(this) { |
weak_this_ = weak_factory_.GetWeakPtr(); |
@@ -63,19 +64,10 @@ PipelineImpl::~PipelineImpl() { |
void PipelineImpl::Start(Demuxer* demuxer, |
scoped_ptr<Renderer> renderer, |
- const base::Closure& ended_cb, |
- const PipelineStatusCB& error_cb, |
- const PipelineStatusCB& seek_cb, |
- const PipelineMetadataCB& metadata_cb, |
- const BufferingStateCB& buffering_state_cb, |
- const base::Closure& duration_change_cb, |
- const AddTextTrackCB& add_text_track_cb, |
- const base::Closure& waiting_for_decryption_key_cb) { |
- DCHECK(!ended_cb.is_null()); |
- DCHECK(!error_cb.is_null()); |
+ Client* client, |
+ const PipelineStatusCB& seek_cb) { |
+ DCHECK(client); |
DCHECK(!seek_cb.is_null()); |
- DCHECK(!metadata_cb.is_null()); |
- DCHECK(!buffering_state_cb.is_null()); |
base::AutoLock auto_lock(lock_); |
CHECK(!running_) << "Media pipeline is already running"; |
@@ -83,15 +75,8 @@ void PipelineImpl::Start(Demuxer* demuxer, |
demuxer_ = demuxer; |
renderer_ = std::move(renderer); |
- ended_cb_ = ended_cb; |
- error_cb_ = error_cb; |
+ client_ = client; |
seek_cb_ = seek_cb; |
- metadata_cb_ = metadata_cb; |
- buffering_state_cb_ = buffering_state_cb; |
- duration_change_cb_ = duration_change_cb; |
- add_text_track_cb_ = add_text_track_cb; |
- waiting_for_decryption_key_cb_ = waiting_for_decryption_key_cb; |
- |
task_runner_->PostTask(FROM_HERE, |
base::Bind(&PipelineImpl::StartTask, weak_this_)); |
} |
@@ -314,8 +299,7 @@ void PipelineImpl::SetDuration(TimeDelta duration) { |
base::AutoLock auto_lock(lock_); |
duration_ = duration; |
- if (!duration_change_cb_.is_null()) |
- duration_change_cb_.Run(); |
+ client_->OnDurationChange(); |
} |
void PipelineImpl::StateTransitionTask(PipelineStatus status) { |
@@ -471,17 +455,16 @@ void PipelineImpl::OnStopCompleted(PipelineStatus status) { |
// If we stop during initialization/seeking/suspending we don't want to leave |
// outstanding callbacks around. |
+ bool status_reported = false; |
if (!seek_cb_.is_null()) { |
base::ResetAndReturn(&seek_cb_).Run(status_); |
- error_cb_.Reset(); |
+ status_reported = true; |
} |
if (!suspend_cb_.is_null()) { |
base::ResetAndReturn(&suspend_cb_).Run(status_); |
- error_cb_.Reset(); |
+ status_reported = true; |
} |
if (!stop_cb_.is_null()) { |
- error_cb_.Reset(); |
- |
// Invalid all weak pointers so it's safe to destroy |this| on the render |
// main thread. |
weak_factory_.InvalidateWeakPtrs(); |
@@ -492,9 +475,9 @@ void PipelineImpl::OnStopCompleted(PipelineStatus status) { |
// executing |stop_cb_|. |
return; |
} |
- if (!error_cb_.is_null()) { |
+ if (!status_reported) { |
DCHECK_NE(status_, PIPELINE_OK); |
- base::ResetAndReturn(&error_cb_).Run(status_); |
+ client_->OnError(status_); |
} |
} |
@@ -516,6 +499,10 @@ void PipelineImpl::OnUpdateStatistics(const PipelineStatistics& stats_delta) { |
statistics_.video_memory_usage += stats_delta.video_memory_usage; |
} |
+void PipelineImpl::OnWaitingForDecryptionKey() { |
+ client_->OnWaitingForDecryptionKey(); |
+} |
+ |
void PipelineImpl::StartTask() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -782,7 +769,7 @@ void PipelineImpl::RunEndedCallbackIfNeeded() { |
return; |
DCHECK_EQ(status_, PIPELINE_OK); |
- ended_cb_.Run(); |
+ client_->OnEnded(); |
} |
scoped_ptr<TextRenderer> PipelineImpl::CreateTextRenderer() { |
@@ -814,7 +801,7 @@ void PipelineImpl::RemoveTextStreamTask(DemuxerStream* text_stream) { |
void PipelineImpl::OnAddTextTrack(const TextTrackConfig& config, |
const AddTextTrackDoneCB& done_cb) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- add_text_track_cb_.Run(config, done_cb); |
+ client_->OnAddTextTrack(config, done_cb); |
} |
void PipelineImpl::InitializeDemuxer(const PipelineStatusCB& done_cb) { |
@@ -844,7 +831,7 @@ void PipelineImpl::InitializeRenderer(const PipelineStatusCB& done_cb) { |
base::Bind(&PipelineImpl::BufferingStateChanged, weak_this_), |
base::Bind(&PipelineImpl::OnRendererEnded, weak_this_), |
base::Bind(&PipelineImpl::OnError, weak_this_), |
- waiting_for_decryption_key_cb_); |
+ base::Bind(&PipelineImpl::OnWaitingForDecryptionKey, weak_this_)); |
} |
void PipelineImpl::ReportMetadata() { |
@@ -860,13 +847,13 @@ void PipelineImpl::ReportMetadata() { |
if (demuxer_->GetStream(DemuxerStream::AUDIO)) { |
metadata.has_audio = true; |
} |
- metadata_cb_.Run(metadata); |
+ client_->OnMetadata(metadata); |
} |
void PipelineImpl::BufferingStateChanged(BufferingState new_buffering_state) { |
DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") "; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- buffering_state_cb_.Run(new_buffering_state); |
+ client_->OnBufferingStateChange(new_buffering_state); |
} |
} // namespace media |