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 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |