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 |