OLD | NEW |
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 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 base::AutoLock auto_lock(lock_); | 230 base::AutoLock auto_lock(lock_); |
231 DCHECK(stopped_); | 231 DCHECK(stopped_); |
232 DCHECK(read_queue_.empty()); | 232 DCHECK(read_queue_.empty()); |
233 DCHECK(buffer_queue_.empty()); | 233 DCHECK(buffer_queue_.empty()); |
234 } | 234 } |
235 | 235 |
236 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const { | 236 base::TimeDelta FFmpegDemuxerStream::GetElapsedTime() const { |
237 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts); | 237 return ConvertStreamTimestamp(stream_->time_base, stream_->cur_dts); |
238 } | 238 } |
239 | 239 |
240 Ranges<base::TimeDelta> FFmpegDemuxerStream::GetBufferedRanges() { | 240 Ranges<base::TimeDelta> FFmpegDemuxerStream::GetBufferedRanges() const { |
241 base::AutoLock auto_lock(lock_); | 241 base::AutoLock auto_lock(lock_); |
242 return buffered_ranges_; | 242 return buffered_ranges_; |
243 } | 243 } |
244 | 244 |
245 // static | 245 // static |
246 base::TimeDelta FFmpegDemuxerStream::ConvertStreamTimestamp( | 246 base::TimeDelta FFmpegDemuxerStream::ConvertStreamTimestamp( |
247 const AVRational& time_base, int64 timestamp) { | 247 const AVRational& time_base, int64 timestamp) { |
248 if (timestamp == static_cast<int64>(AV_NOPTS_VALUE)) | 248 if (timestamp == static_cast<int64>(AV_NOPTS_VALUE)) |
249 return kNoTimestamp(); | 249 return kNoTimestamp(); |
250 | 250 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 } | 316 } |
317 | 317 |
318 void FFmpegDemuxer::Initialize(DemuxerHost* host, | 318 void FFmpegDemuxer::Initialize(DemuxerHost* host, |
319 const PipelineStatusCB& status_cb) { | 319 const PipelineStatusCB& status_cb) { |
320 message_loop_->PostTask(FROM_HERE, base::Bind( | 320 message_loop_->PostTask(FROM_HERE, base::Bind( |
321 &FFmpegDemuxer::InitializeTask, this, host, status_cb)); | 321 &FFmpegDemuxer::InitializeTask, this, host, status_cb)); |
322 } | 322 } |
323 | 323 |
324 scoped_refptr<DemuxerStream> FFmpegDemuxer::GetStream( | 324 scoped_refptr<DemuxerStream> FFmpegDemuxer::GetStream( |
325 DemuxerStream::Type type) { | 325 DemuxerStream::Type type) { |
326 StreamVector::iterator iter; | 326 return GetFFmpegStream(type); |
| 327 } |
| 328 |
| 329 scoped_refptr<FFmpegDemuxerStream> FFmpegDemuxer::GetFFmpegStream( |
| 330 DemuxerStream::Type type) const { |
| 331 StreamVector::const_iterator iter; |
327 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { | 332 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { |
328 if (*iter && (*iter)->type() == type) { | 333 if (*iter && (*iter)->type() == type) { |
329 return *iter; | 334 return *iter; |
330 } | 335 } |
331 } | 336 } |
332 return NULL; | 337 return NULL; |
333 } | 338 } |
334 | 339 |
335 base::TimeDelta FFmpegDemuxer::GetStartTime() const { | 340 base::TimeDelta FFmpegDemuxer::GetStartTime() const { |
336 return start_time_; | 341 return start_time_; |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 } | 715 } |
711 | 716 |
712 void FFmpegDemuxer::SignalReadCompleted(int size) { | 717 void FFmpegDemuxer::SignalReadCompleted(int size) { |
713 last_read_bytes_ = size; | 718 last_read_bytes_ = size; |
714 read_event_.Signal(); | 719 read_event_.Signal(); |
715 } | 720 } |
716 | 721 |
717 void FFmpegDemuxer::NotifyBufferingChanged() { | 722 void FFmpegDemuxer::NotifyBufferingChanged() { |
718 DCHECK_EQ(MessageLoop::current(), message_loop_); | 723 DCHECK_EQ(MessageLoop::current(), message_loop_); |
719 Ranges<base::TimeDelta> buffered; | 724 Ranges<base::TimeDelta> buffered; |
720 scoped_refptr<DemuxerStream> audio = | 725 scoped_refptr<FFmpegDemuxerStream> audio = |
721 audio_disabled_ ? NULL : GetStream(DemuxerStream::AUDIO); | 726 audio_disabled_ ? NULL : GetFFmpegStream(DemuxerStream::AUDIO); |
722 scoped_refptr<DemuxerStream> video = GetStream(DemuxerStream::VIDEO); | 727 scoped_refptr<FFmpegDemuxerStream> video = |
| 728 GetFFmpegStream(DemuxerStream::VIDEO); |
723 if (audio && video) { | 729 if (audio && video) { |
724 buffered = audio->GetBufferedRanges().IntersectionWith( | 730 buffered = audio->GetBufferedRanges().IntersectionWith( |
725 video->GetBufferedRanges()); | 731 video->GetBufferedRanges()); |
726 } else if (audio) { | 732 } else if (audio) { |
727 buffered = audio->GetBufferedRanges(); | 733 buffered = audio->GetBufferedRanges(); |
728 } else if (video) { | 734 } else if (video) { |
729 buffered = video->GetBufferedRanges(); | 735 buffered = video->GetBufferedRanges(); |
730 } | 736 } |
731 for (size_t i = 0; i < buffered.size(); ++i) | 737 for (size_t i = 0; i < buffered.size(); ++i) |
732 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); | 738 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); |
733 } | 739 } |
734 | 740 |
735 } // namespace media | 741 } // namespace media |
OLD | NEW |