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

Unified Diff: media/filters/chunk_demuxer.cc

Issue 10558011: Fix ChunkDemuxer so it properly outputs buffered ranges. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: media/filters/chunk_demuxer.cc
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
index fcb36258bd520a246fa7733a376fc79d14195cba..c7db12e76b67f725b79972b2fd4ea50fcf4a8dff 100644
--- a/media/filters/chunk_demuxer.cc
+++ b/media/filters/chunk_demuxer.cc
@@ -74,6 +74,11 @@ static const SupportedTypeInfo kSupportedTypeInfo[] = {
{ "audio/mp4", &BuildMP4Parser, kAudioMP4Codecs },
};
+
+// The fake total size we use for converting times to bytes
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 Yowza! Why not instead teach Pipeline to track bu
acolwell GONE FROM CHROMIUM 2012/06/19 06:12:34 Based on our offline discussion, I'd like to defer
+// for AddBufferedByteRange() calls.
+static int kFakeTotalBytes = 1000000;
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 If you need to keep this, prefer enum to static in
acolwell GONE FROM CHROMIUM 2012/06/19 06:12:34 Done.
+
// Checks to see if the specified |type| and |codecs| list are supported.
// Returns true if |type| and all codecs listed in |codecs| are supported.
// |factory_function| contains a function that can build a StreamParser
@@ -464,8 +469,7 @@ void ChunkDemuxerStream::CreateReadDoneClosures_Locked(ClosureQueue* closures) {
ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client)
: state_(WAITING_FOR_INIT),
host_(NULL),
- client_(client),
- buffered_bytes_(0) {
+ client_(client) {
DCHECK(client);
}
@@ -647,6 +651,25 @@ bool ChunkDemuxer::GetBufferedRanges(const std::string& id,
return CopyIntoRanges(video_->GetBufferedTime(), ranges_out);
}
+ return ComputeIntersection(ranges_out);
+}
+
+bool ChunkDemuxer::CopyIntoRanges(
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 I realize this is just a move of an existing funct
acolwell GONE FROM CHROMIUM 2012/06/19 06:12:34 I've updated the CL to use media::Ranges and elimi
+ const SourceBufferStream::TimespanList& timespans,
+ Ranges* ranges_out) const {
+ for (SourceBufferStream::TimespanList::const_iterator itr = timespans.begin();
+ itr != timespans.end(); ++itr) {
+ ranges_out->push_back(*itr);
+ }
+ return !timespans.empty();
+}
+
+bool ChunkDemuxer::ComputeIntersection(Ranges* ranges_out) const {
+ lock_.AssertAcquired();
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 ranges_out->clear() ?
acolwell GONE FROM CHROMIUM 2012/06/19 06:12:34 Done.
+
+ if (!audio_ && !video_)
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 s/&&/||/ since you unconditionally deref them a fe
acolwell GONE FROM CHROMIUM 2012/06/19 06:12:34 Done.
+ return false;
+
// Include ranges that have been buffered in both |audio_| and |video_|.
SourceBufferStream::TimespanList audio_ranges = audio_->GetBufferedTime();
SourceBufferStream::TimespanList video_ranges = video_->GetBufferedTime();
@@ -695,16 +718,6 @@ bool ChunkDemuxer::GetBufferedRanges(const std::string& id,
return success;
}
-bool ChunkDemuxer::CopyIntoRanges(
- const SourceBufferStream::TimespanList& timespans,
- Ranges* ranges_out) const {
- for (SourceBufferStream::TimespanList::const_iterator itr = timespans.begin();
- itr != timespans.end(); ++itr) {
- ranges_out->push_back(*itr);
- }
- return !timespans.empty();
-}
-
void ChunkDemuxer::AddIntersectionRange(
SourceBufferStream::Timespan timespan_a,
SourceBufferStream::Timespan timespan_b,
@@ -732,7 +745,7 @@ bool ChunkDemuxer::AppendData(const std::string& id,
DCHECK(data);
DCHECK_GT(length, 0u);
- int64 buffered_bytes = 0;
+ Ranges ranges;
PipelineStatusCB cb;
{
@@ -773,13 +786,25 @@ bool ChunkDemuxer::AppendData(const std::string& id,
std::swap(cb, seek_cb_);
}
- buffered_bytes_ += length;
- buffered_bytes = buffered_bytes_;
+ if (duration_ > base::TimeDelta() && duration_ != kInfiniteDuration()) {
+ if (audio_ && !video_) {
+ CopyIntoRanges(audio_->GetBufferedTime(), &ranges);
+ } else if (!audio_ && video_) {
+ CopyIntoRanges(video_->GetBufferedTime(), &ranges);
+ } else {
+ ComputeIntersection(&ranges);
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 Note ignored return value; a hint that CI shouldn'
acolwell GONE FROM CHROMIUM 2012/06/19 06:12:34 Done.
+ }
+ }
}
- // Notify the host of 'network activity' because we got data, using a bogus
- // range.
- host_->AddBufferedByteRange(0, buffered_bytes);
+ for (Ranges::iterator itr = ranges.begin(); itr != ranges.end(); ++itr) {
+ // Notify the host of 'network activity' because we got data.
+ int64 start =
+ kFakeTotalBytes * itr->first.InSecondsF() / duration_.InSecondsF();
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 at l.789 you needed to test for duration_ being Ti
acolwell GONE FROM CHROMIUM 2012/06/19 06:12:34 ranges won't get populated if duration_ is 0 so th
+ int64 end =
+ kFakeTotalBytes * itr->second.InSecondsF() / duration_.InSecondsF();
+ host_->AddBufferedByteRange(start, end);
+ }
if (!cb.is_null())
cb.Run(PIPELINE_OK);
@@ -948,6 +973,8 @@ void ChunkDemuxer::OnStreamParserInitDone(bool success,
(!source_id_video_.empty() && !video_))
return;
+ if (duration_ > base::TimeDelta() && duration_ != kInfiniteDuration())
+ host_->SetTotalBytes(kFakeTotalBytes);
Ami GONE FROM CHROMIUM 2012/06/18 16:18:31 Hopefully this can go away.
host_->SetDuration(duration_);
ChangeState_Locked(INITIALIZED);

Powered by Google App Engine
This is Rietveld 408576698