Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index 16c5447ae65ffa122e9c4887d36dd6f5290545d2..f7a084a75d792304ff9aedb2aa800256970705fa 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -30,9 +30,12 @@ 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), |
@@ -92,8 +95,17 @@ void FFmpegDemuxerStream::EnqueuePacket( |
buffer = DecoderBuffer::CopyFrom(packet->data, packet->size); |
buffer->SetTimestamp(ConvertStreamTimestamp( |
stream_->time_base, packet->pts)); |
- buffer->SetDuration(ConvertStreamTimestamp( |
- stream_->time_base, packet->duration)); |
+ buffer->SetDuration(std::max( |
+ base::TimeDelta(), ConvertStreamTimestamp( |
scherkus (not reviewing)
2012/06/21 21:57:04
this means duration can no longer be kNoTimestamp(
Ami GONE FROM CHROMIUM
2012/06/21 22:49:02
That's interesting that you say that.
What would y
scherkus (not reviewing)
2012/06/21 22:58:22
How negative were these durations? Were they −9,22
Ami GONE FROM CHROMIUM
2012/06/21 23:18:11
They were between 0 and -1.
|
+ stream_->time_base, packet->duration))); |
+ if (last_packet_timestamp_ > base::TimeDelta() && |
scherkus (not reviewing)
2012/06/21 21:57:04
timestamps can be negative -- do you mean to check
Ami GONE FROM CHROMIUM
2012/06/21 22:49:02
No, I meant to check for TimeDelta() (to detect a
scherkus (not reviewing)
2012/06/21 22:58:22
Why not use kNoTS() to detect a flush isntead of z
Ami GONE FROM CHROMIUM
2012/06/21 23:18:11
Done.
|
+ last_packet_timestamp_ < buffer->GetTimestamp()) { |
+ DCHECK(buffer->GetDuration() >= base::TimeDelta()) |
scherkus (not reviewing)
2012/06/21 21:57:04
ditto around here
Ami GONE FROM CHROMIUM
2012/06/21 22:49:02
This is leftover from debugging the aforementioned
|
+ << buffer->GetDuration().ToInternalValue(); |
+ notify_buffered_cb_.Run(last_packet_timestamp_, |
+ buffer->GetTimestamp() + buffer->GetDuration()); |
+ } |
+ last_packet_timestamp_ = buffer->GetTimestamp(); |
} |
buffer_queue_.push_back(buffer); |
@@ -106,6 +118,7 @@ void FFmpegDemuxerStream::FlushBuffers() { |
base::AutoLock auto_lock(lock_); |
DCHECK(read_queue_.empty()) << "Read requests should be empty"; |
buffer_queue_.clear(); |
+ last_packet_timestamp_ = base::TimeDelta(); |
scherkus (not reviewing)
2012/06/21 21:57:04
kNoTS() here + ctor initializer list?
|
} |
void FFmpegDemuxerStream::Stop() { |
@@ -507,7 +520,10 @@ void FFmpegDemuxer::InitializeTask(DemuxerHost* host, |
AVStream* stream = format_context_->streams[i]; |
scoped_refptr<FFmpegDemuxerStream> demuxer_stream( |
- new FFmpegDemuxerStream(this, stream)); |
+ new FFmpegDemuxerStream( |
+ base::Bind(&DemuxerHost::AddBufferedTimeRange, |
+ base::Unretained(host_)), |
+ this, stream)); |
streams_[i] = demuxer_stream; |
max_duration = std::max(max_duration, demuxer_stream->duration()); |
@@ -638,6 +654,7 @@ void FFmpegDemuxer::DemuxTask() { |
(!audio_disabled_ || |
streams_[packet->stream_index]->type() != DemuxerStream::AUDIO)) { |
FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index]; |
+ |
demuxer_stream->EnqueuePacket(packet.Pass()); |
} |