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

Unified Diff: media/filters/ffmpeg_demuxer.cc

Issue 10581050: Ensure media's buffered ranges always have a range that includes currentTime. (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
« no previous file with comments | « media/filters/ffmpeg_demuxer.h ('k') | media/filters/ffmpeg_demuxer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/ffmpeg_demuxer.cc
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index 16c5447ae65ffa122e9c4887d36dd6f5290545d2..ece726aef5c7d897dae8067124043568b6a83169 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -30,13 +30,17 @@ namespace media {
//
// FFmpegDemuxerStream
//
-FFmpegDemuxerStream::FFmpegDemuxerStream(FFmpegDemuxer* demuxer,
- AVStream* stream)
- : demuxer_(demuxer),
+FFmpegDemuxerStream::FFmpegDemuxerStream(
+ const NotifyBufferedCB& notify_buffered_cb,
+ FFmpegDemuxer* demuxer,
+ AVStream* stream)
+ : notify_buffered_cb_(notify_buffered_cb),
+ demuxer_(demuxer),
stream_(stream),
type_(UNKNOWN),
discontinuous_(false),
- stopped_(false) {
+ stopped_(false),
+ last_packet_timestamp_(kNoTimestamp()) {
DCHECK(demuxer_);
// Determine our media format.
@@ -94,6 +98,11 @@ void FFmpegDemuxerStream::EnqueuePacket(
stream_->time_base, packet->pts));
buffer->SetDuration(ConvertStreamTimestamp(
stream_->time_base, packet->duration));
+ if (last_packet_timestamp_ != kNoTimestamp() &&
+ last_packet_timestamp_ < buffer->GetTimestamp()) {
+ notify_buffered_cb_.Run(last_packet_timestamp_, buffer->GetTimestamp());
+ }
+ last_packet_timestamp_ = buffer->GetTimestamp();
}
buffer_queue_.push_back(buffer);
@@ -106,6 +115,7 @@ void FFmpegDemuxerStream::FlushBuffers() {
base::AutoLock auto_lock(lock_);
DCHECK(read_queue_.empty()) << "Read requests should be empty";
buffer_queue_.clear();
+ last_packet_timestamp_ = kNoTimestamp();
}
void FFmpegDemuxerStream::Stop() {
@@ -479,6 +489,7 @@ void FFmpegDemuxer::InitializeTask(DemuxerHost* host,
// Create demuxer stream entries for each possible AVStream.
streams_.resize(format_context_->nb_streams);
+ buffered_times_.resize(streams_.size());
bool found_audio_stream = false;
bool found_video_stream = false;
@@ -507,7 +518,9 @@ void FFmpegDemuxer::InitializeTask(DemuxerHost* host,
AVStream* stream = format_context_->streams[i];
scoped_refptr<FFmpegDemuxerStream> demuxer_stream(
- new FFmpegDemuxerStream(this, stream));
+ new FFmpegDemuxerStream(
+ base::Bind(&FFmpegDemuxer::NotifyBufferedRange, this, i),
+ this, stream));
streams_[i] = demuxer_stream;
max_duration = std::max(max_duration, demuxer_stream->duration());
@@ -707,4 +720,15 @@ void FFmpegDemuxer::SignalReadCompleted(int size) {
read_event_.Signal();
}
+void FFmpegDemuxer::NotifyBufferedRange(
+ int stream_id, base::TimeDelta start, base::TimeDelta end) {
+ buffered_times_[stream_id].Add(start, end);
scherkus (not reviewing) 2012/06/22 06:13:51 I think each FDS stream should hold onto its own r
Ami GONE FROM CHROMIUM 2012/06/22 17:15:32 Done.
+
+ Ranges<base::TimeDelta> buffered = buffered_times_[0];
+ for (size_t i = 1; i < streams_.size(); ++i)
+ buffered = buffered.IntersectionWith(buffered_times_[i]);
+ for (size_t i = 0; i < buffered.size(); ++i)
+ host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i));
+}
+
} // namespace media
« no previous file with comments | « media/filters/ffmpeg_demuxer.h ('k') | media/filters/ffmpeg_demuxer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698