Index: media/filters/chunk_demuxer.cc |
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
index 067fc0eeea75ac72196934ee7e283f6ab01c6dd5..907b0bdcd394c1c3b2e6fdae27058593af26f224 100644 |
--- a/media/filters/chunk_demuxer.cc |
+++ b/media/filters/chunk_demuxer.cc |
@@ -523,8 +523,7 @@ ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client) |
DCHECK(client); |
} |
-void ChunkDemuxer::Initialize(DemuxerHost* host, |
- const PipelineStatusCB& cb) { |
+void ChunkDemuxer::Initialize(DemuxerHost* host, const PipelineStatusCB& cb) { |
DVLOG(1) << "Init()"; |
{ |
base::AutoLock auto_lock(lock_); |
@@ -788,13 +787,7 @@ bool ChunkDemuxer::AppendData(const std::string& id, |
std::swap(cb, seek_cb_); |
} |
- if (audio_ && !video_) { |
- ranges = audio_->GetBufferedRanges(); |
- } else if (!audio_ && video_) { |
- ranges = video_->GetBufferedRanges(); |
- } else { |
- ranges = ComputeIntersection(); |
- } |
+ ranges = GetBufferedRanges(); |
} |
for (size_t i = 0; i < ranges.size(); ++i) |
@@ -968,15 +961,13 @@ void ChunkDemuxer::OnStreamParserInitDone(bool success, TimeDelta duration) { |
} |
if (duration > duration_) |
- duration_ = duration; |
+ UpdateDuration(duration); |
// Wait until all streams have initialized. |
if ((!source_id_audio_.empty() && !audio_) || |
(!source_id_video_.empty() && !video_)) |
return; |
- host_->SetDuration(duration_); |
- |
ChangeState_Locked(WAITING_FOR_START_TIME); |
} |
@@ -1035,6 +1026,8 @@ bool ChunkDemuxer::OnAudioBuffers(const StreamParser::BufferQueue& buffers) { |
AdjustBufferTimestamps( |
buffers, source_info_map_[source_id_audio_].timestamp_offset); |
+ IncreaseDurationIfNecessary(buffers); |
+ |
return audio_->Append(buffers); |
} |
@@ -1049,6 +1042,8 @@ bool ChunkDemuxer::OnVideoBuffers(const StreamParser::BufferQueue& buffers) { |
AdjustBufferTimestamps( |
buffers, source_info_map_[source_id_video_].timestamp_offset); |
+ IncreaseDurationIfNecessary(buffers); |
+ |
return video_->Append(buffers); |
} |
@@ -1093,6 +1088,9 @@ void ChunkDemuxer::OnNewMediaSegment(const std::string& source_id, |
video_->Seek(start_time_); |
} |
+ if (start_time_ > duration_) |
+ UpdateDuration(start_time_); |
acolwell GONE FROM CHROMIUM
2012/07/27 00:03:23
nit: Could this be up where start_time_ is initial
vrk (LEFT CHROMIUM)
2012/07/28 01:42:05
Done.
|
+ |
// The demuxer is now initialized after the |start_timestamp_| was set. |
ChangeState_Locked(INITIALIZED); |
base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
@@ -1123,4 +1121,32 @@ bool ChunkDemuxer::IsValidId(const std::string& source_id) const { |
stream_parser_map_.count(source_id) > 0u; |
} |
+void ChunkDemuxer::UpdateDuration(base::TimeDelta new_duration) { |
+ duration_ = new_duration; |
acolwell GONE FROM CHROMIUM
2012/07/27 00:03:23
DCHECK(duration_ != new_duration) to make sure cod
vrk (LEFT CHROMIUM)
2012/07/28 01:42:05
Done.
|
+ host_->SetDuration(new_duration); |
acolwell GONE FROM CHROMIUM
2012/07/27 00:03:23
Does this cause double duration notifications on m
vrk (LEFT CHROMIUM)
2012/07/28 01:42:05
Yes this happens!
|
+} |
+ |
+void ChunkDemuxer::IncreaseDurationIfNecessary( |
+ const StreamParser::BufferQueue& buffers) { |
+ DCHECK(!buffers.empty()); |
+ if (buffers.back()->GetTimestamp() <= duration_) |
+ return; |
+ |
+ Ranges<TimeDelta> ranges = GetBufferedRanges(); |
+ base::TimeDelta last_timestamp_buffered = ranges.end(ranges.size() - 1); |
+ DCHECK(last_timestamp_buffered > duration_); |
acolwell GONE FROM CHROMIUM
2012/07/27 00:03:23
I don't think this is right. The buffers aren't ap
vrk (LEFT CHROMIUM)
2012/07/28 01:42:05
AHH you are right! I must have fiddled with this b
|
+ UpdateDuration(last_timestamp_buffered); |
+} |
+ |
+Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges() const { |
+ lock_.AssertAcquired(); |
+ |
+ if (audio_ && !video_) |
+ return audio_->GetBufferedRanges(); |
+ else if (!audio_ && video_) |
+ return video_->GetBufferedRanges(); |
+ |
+ return ComputeIntersection(); |
+} |
+ |
} // namespace media |