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

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: Alternative implementation, introducing DataSourceHost::AddBufferedTimeRange(). 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/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());
}

Powered by Google App Engine
This is Rietveld 408576698