Index: media/base/pipeline.cc |
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc |
index 24868cfac2c7941c714459e51b99360297d1df99..ca00baf5e756c8b037f97ac0ceb12be016aa1d7e 100644 |
--- a/media/base/pipeline.cc |
+++ b/media/base/pipeline.cc |
@@ -92,14 +92,15 @@ Pipeline::~Pipeline() { |
void Pipeline::Start(scoped_ptr<FilterCollection> collection, |
const PipelineStatusCB& ended_cb, |
const PipelineStatusCB& error_cb, |
- const PipelineStatusCB& start_cb) { |
+ const PipelineStatusCB& start_cb, |
+ const base::Closure& new_duration_cb) { |
base::AutoLock auto_lock(lock_); |
CHECK(!running_) << "Media pipeline is already running"; |
running_ = true; |
message_loop_->PostTask(FROM_HERE, base::Bind( |
&Pipeline::StartTask, this, base::Passed(&collection), |
- ended_cb, error_cb, start_cb)); |
+ ended_cb, error_cb, start_cb, new_duration_cb)); |
} |
void Pipeline::Stop(const base::Closure& stop_cb) { |
@@ -419,8 +420,15 @@ void Pipeline::SetDuration(TimeDelta duration) { |
MediaLogEvent::DURATION_SET, "duration", duration)); |
UMA_HISTOGRAM_LONG_TIMES("Media.Duration", duration); |
- base::AutoLock auto_lock(lock_); |
- clock_->SetDuration(duration); |
+ base::TimeDelta old_duration; |
+ { |
+ base::AutoLock auto_lock(lock_); |
+ old_duration = clock_->Duration(); |
+ clock_->SetDuration(duration); |
+ } |
+ |
+ if (old_duration != duration && !new_duration_cb_.is_null()) |
+ new_duration_cb_.Run(); |
} |
void Pipeline::SetTotalBytes(int64 total_bytes) { |
@@ -580,13 +588,15 @@ void Pipeline::OnUpdateStatistics(const PipelineStatistics& stats) { |
void Pipeline::StartTask(scoped_ptr<FilterCollection> filter_collection, |
const PipelineStatusCB& ended_cb, |
const PipelineStatusCB& error_cb, |
- const PipelineStatusCB& start_cb) { |
+ const PipelineStatusCB& start_cb, |
+ const base::Closure& new_duration_cb) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
DCHECK_EQ(kCreated, state_); |
filter_collection_ = filter_collection.Pass(); |
ended_cb_ = ended_cb; |
error_cb_ = error_cb; |
seek_cb_ = start_cb; |
+ new_duration_cb_ = new_duration_cb; |
// Kick off initialization. |
pipeline_init_state_.reset(new PipelineInitState()); |