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

Side by Side Diff: media/filters/ffmpeg_demuxer.cc

Issue 10829108: Cap sourceBuffered() on duration and truncate duration on EoS (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated test Created 8 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/ffmpeg_demuxer.h" 5 #include "media/filters/ffmpeg_demuxer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 base::AutoLock auto_lock(lock_); 231 base::AutoLock auto_lock(lock_);
232 DCHECK(stopped_); 232 DCHECK(stopped_);
233 DCHECK(read_queue_.empty()); 233 DCHECK(read_queue_.empty());
234 DCHECK(buffer_queue_.empty()); 234 DCHECK(buffer_queue_.empty());
235 } 235 }
236 236
237 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const { 237 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const {
238 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts); 238 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts);
239 } 239 }
240 240
241 Ranges<base::TimeDelta> FFmpegDemuxerStream::GetBufferedRanges() { 241 Ranges<base::TimeDelta> FFmpegDemuxerStream::GetBufferedRanges() const {
242 base::AutoLock auto_lock(lock_); 242 base::AutoLock auto_lock(lock_);
243 return buffered_ranges_; 243 return buffered_ranges_;
244 } 244 }
245 245
246 // static 246 // static
247 base::TimeDelta FFmpegDemuxerStream::ConvertStreamTimestamp( 247 base::TimeDelta FFmpegDemuxerStream::ConvertStreamTimestamp(
248 const AVRational& time_base, int64 timestamp) { 248 const AVRational& time_base, int64 timestamp) {
249 if (timestamp == static_cast<int64>(AV_NOPTS_VALUE)) 249 if (timestamp == static_cast<int64>(AV_NOPTS_VALUE))
250 return kNoTimestamp(); 250 return kNoTimestamp();
251 251
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 } 317 }
318 318
319 void FFmpegDemuxer::Initialize(DemuxerHost* host, 319 void FFmpegDemuxer::Initialize(DemuxerHost* host,
320 const PipelineStatusCB& status_cb) { 320 const PipelineStatusCB& status_cb) {
321 message_loop_->PostTask(FROM_HERE, base::Bind( 321 message_loop_->PostTask(FROM_HERE, base::Bind(
322 &FFmpegDemuxer::InitializeTask, this, host, status_cb)); 322 &FFmpegDemuxer::InitializeTask, this, host, status_cb));
323 } 323 }
324 324
325 scoped_refptr<DemuxerStream> FFmpegDemuxer::GetStream( 325 scoped_refptr<DemuxerStream> FFmpegDemuxer::GetStream(
326 DemuxerStream::Type type) { 326 DemuxerStream::Type type) {
327 StreamVector::iterator iter; 327 return GetFFmpegStream(type);
328 }
329
330 scoped_refptr<FFmpegDemuxerStream> FFmpegDemuxer::GetFFmpegStream(
331 DemuxerStream::Type type) const {
332 StreamVector::const_iterator iter;
328 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { 333 for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
329 if (*iter && (*iter)->type() == type) { 334 if (*iter && (*iter)->type() == type) {
330 return *iter; 335 return *iter;
331 } 336 }
332 } 337 }
333 return NULL; 338 return NULL;
334 } 339 }
335 340
336 base::TimeDelta FFmpegDemuxer::GetStartTime() const { 341 base::TimeDelta FFmpegDemuxer::GetStartTime() const {
337 return start_time_; 342 return start_time_;
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 } 716 }
712 717
713 void FFmpegDemuxer::SignalReadCompleted(int size) { 718 void FFmpegDemuxer::SignalReadCompleted(int size) {
714 last_read_bytes_ = size; 719 last_read_bytes_ = size;
715 read_event_.Signal(); 720 read_event_.Signal();
716 } 721 }
717 722
718 void FFmpegDemuxer::NotifyBufferingChanged() { 723 void FFmpegDemuxer::NotifyBufferingChanged() {
719 DCHECK_EQ(MessageLoop::current(), message_loop_); 724 DCHECK_EQ(MessageLoop::current(), message_loop_);
720 Ranges<base::TimeDelta> buffered; 725 Ranges<base::TimeDelta> buffered;
721 scoped_refptr<DemuxerStream> audio = 726 scoped_refptr<FFmpegDemuxerStream> audio =
722 audio_disabled_ ? NULL : GetStream(DemuxerStream::AUDIO); 727 audio_disabled_ ? NULL : GetFFmpegStream(DemuxerStream::AUDIO);
723 scoped_refptr<DemuxerStream> video = GetStream(DemuxerStream::VIDEO); 728 scoped_refptr<FFmpegDemuxerStream> video =
729 GetFFmpegStream(DemuxerStream::VIDEO);
724 if (audio && video) { 730 if (audio && video) {
725 buffered = audio->GetBufferedRanges().IntersectionWith( 731 buffered = audio->GetBufferedRanges().IntersectionWith(
726 video->GetBufferedRanges()); 732 video->GetBufferedRanges());
727 } else if (audio) { 733 } else if (audio) {
728 buffered = audio->GetBufferedRanges(); 734 buffered = audio->GetBufferedRanges();
729 } else if (video) { 735 } else if (video) {
730 buffered = video->GetBufferedRanges(); 736 buffered = video->GetBufferedRanges();
731 } 737 }
732 for (size_t i = 0; i < buffered.size(); ++i) 738 for (size_t i = 0; i < buffered.size(); ++i)
733 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); 739 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i));
734 } 740 }
735 741
736 } // namespace media 742 } // namespace media
OLDNEW
« media/filters/chunk_demuxer_unittest.cc ('K') | « media/filters/ffmpeg_demuxer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698