| Index: media/filters/ffmpeg_demuxer.cc
|
| ===================================================================
|
| --- media/filters/ffmpeg_demuxer.cc (revision 145962)
|
| +++ media/filters/ffmpeg_demuxer.cc (working copy)
|
| @@ -30,13 +30,15 @@
|
| //
|
| // FFmpegDemuxerStream
|
| //
|
| -FFmpegDemuxerStream::FFmpegDemuxerStream(FFmpegDemuxer* demuxer,
|
| - AVStream* stream)
|
| +FFmpegDemuxerStream::FFmpegDemuxerStream(
|
| + FFmpegDemuxer* demuxer,
|
| + AVStream* stream)
|
| : demuxer_(demuxer),
|
| stream_(stream),
|
| type_(UNKNOWN),
|
| discontinuous_(false),
|
| - stopped_(false) {
|
| + stopped_(false),
|
| + last_packet_timestamp_(kNoTimestamp()) {
|
| DCHECK(demuxer_);
|
|
|
| // Determine our media format.
|
| @@ -94,6 +96,14 @@
|
| stream_->time_base, packet->pts));
|
| buffer->SetDuration(ConvertStreamTimestamp(
|
| stream_->time_base, packet->duration));
|
| + if (buffer->GetTimestamp() != kNoTimestamp() &&
|
| + last_packet_timestamp_ != kNoTimestamp() &&
|
| + last_packet_timestamp_ < buffer->GetTimestamp()) {
|
| + buffered_ranges_.Add(last_packet_timestamp_, buffer->GetTimestamp());
|
| + demuxer_->message_loop()->PostTask(FROM_HERE, base::Bind(
|
| + &FFmpegDemuxer::NotifyBufferingChanged, demuxer_));
|
| + }
|
| + last_packet_timestamp_ = buffer->GetTimestamp();
|
| }
|
|
|
| buffer_queue_.push_back(buffer);
|
| @@ -106,6 +116,7 @@
|
| base::AutoLock auto_lock(lock_);
|
| DCHECK(read_queue_.empty()) << "Read requests should be empty";
|
| buffer_queue_.clear();
|
| + last_packet_timestamp_ = kNoTimestamp();
|
| }
|
|
|
| void FFmpegDemuxerStream::Stop() {
|
| @@ -235,6 +246,11 @@
|
| return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts);
|
| }
|
|
|
| +Ranges<base::TimeDelta> FFmpegDemuxerStream::GetBufferedRanges() {
|
| + base::AutoLock auto_lock(lock_);
|
| + return buffered_ranges_;
|
| +}
|
| +
|
| // static
|
| base::TimeDelta FFmpegDemuxerStream::ConvertStreamTimestamp(
|
| const AVRational& time_base, int64 timestamp) {
|
| @@ -707,4 +723,22 @@
|
| read_event_.Signal();
|
| }
|
|
|
| +void FFmpegDemuxer::NotifyBufferingChanged() {
|
| + DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| + Ranges<base::TimeDelta> buffered;
|
| + scoped_refptr<DemuxerStream> audio =
|
| + audio_disabled_ ? NULL : GetStream(DemuxerStream::AUDIO);
|
| + scoped_refptr<DemuxerStream> video = GetStream(DemuxerStream::VIDEO);
|
| + if (audio && video) {
|
| + buffered = audio->GetBufferedRanges().IntersectionWith(
|
| + video->GetBufferedRanges());
|
| + } else if (audio) {
|
| + buffered = audio->GetBufferedRanges();
|
| + } else if (video) {
|
| + buffered = video->GetBufferedRanges();
|
| + }
|
| + for (size_t i = 0; i < buffered.size(); ++i)
|
| + host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i));
|
| +}
|
| +
|
| } // namespace media
|
|
|