| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // Implements a Demuxer that can switch among different data sources mid-stream. | 5 // Implements a Demuxer that can switch among different data sources mid-stream. |
| 6 // Uses FFmpegDemuxer under the covers, so see the caveats at the top of | 6 // Uses FFmpegDemuxer under the covers, so see the caveats at the top of |
| 7 // ffmpeg_demuxer.h. | 7 // ffmpeg_demuxer.h. |
| 8 | 8 |
| 9 #include "media/filters/chunk_demuxer.h" | 9 #include "media/filters/chunk_demuxer.h" |
| 10 | 10 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 void AddBuffers(const BufferQueue& buffers); | 73 void AddBuffers(const BufferQueue& buffers); |
| 74 void Shutdown(); | 74 void Shutdown(); |
| 75 | 75 |
| 76 bool GetLastBufferTimestamp(base::TimeDelta* timestamp) const; | 76 bool GetLastBufferTimestamp(base::TimeDelta* timestamp) const; |
| 77 | 77 |
| 78 // DemuxerStream methods. | 78 // DemuxerStream methods. |
| 79 virtual void Read(const ReadCallback& read_callback); | 79 virtual void Read(const ReadCallback& read_callback); |
| 80 virtual Type type(); | 80 virtual Type type(); |
| 81 virtual void EnableBitstreamConverter(); | 81 virtual void EnableBitstreamConverter(); |
| 82 virtual AVStream* GetAVStream(); | 82 virtual AVStream* GetAVStream(); |
| 83 virtual const AudioDecoderConfig& audio_decoder_config(); |
| 83 | 84 |
| 84 private: | 85 private: |
| 85 static void RunCallback(ReadCallback cb, scoped_refptr<Buffer> buffer); | 86 static void RunCallback(ReadCallback cb, scoped_refptr<Buffer> buffer); |
| 86 | 87 |
| 87 Type type_; | 88 Type type_; |
| 88 AVStream* av_stream_; | 89 AVStream* av_stream_; |
| 90 AudioDecoderConfig audio_config_; |
| 89 | 91 |
| 90 mutable base::Lock lock_; | 92 mutable base::Lock lock_; |
| 91 ReadCBQueue read_cbs_; | 93 ReadCBQueue read_cbs_; |
| 92 BufferQueue buffers_; | 94 BufferQueue buffers_; |
| 93 bool shutdown_called_; | 95 bool shutdown_called_; |
| 94 bool received_end_of_stream_; | 96 bool received_end_of_stream_; |
| 95 | 97 |
| 96 // Keeps track of the timestamp of the last buffer we have | 98 // Keeps track of the timestamp of the last buffer we have |
| 97 // added to |buffers_|. This is used to enforce buffers with strictly | 99 // added to |buffers_|. This is used to enforce buffers with strictly |
| 98 // monotonically increasing timestamps. | 100 // monotonically increasing timestamps. |
| 99 base::TimeDelta last_buffer_timestamp_; | 101 base::TimeDelta last_buffer_timestamp_; |
| 100 | 102 |
| 101 DISALLOW_IMPLICIT_CONSTRUCTORS(ChunkDemuxerStream); | 103 DISALLOW_IMPLICIT_CONSTRUCTORS(ChunkDemuxerStream); |
| 102 }; | 104 }; |
| 103 | 105 |
| 104 ChunkDemuxerStream::ChunkDemuxerStream(Type type, AVStream* stream) | 106 ChunkDemuxerStream::ChunkDemuxerStream(Type type, AVStream* stream) |
| 105 : type_(type), | 107 : type_(type), |
| 106 av_stream_(stream), | 108 av_stream_(stream), |
| 107 shutdown_called_(false), | 109 shutdown_called_(false), |
| 108 received_end_of_stream_(false), | 110 received_end_of_stream_(false), |
| 109 last_buffer_timestamp_(kNoTimestamp) { | 111 last_buffer_timestamp_(kNoTimestamp) { |
| 112 if (type_ == AUDIO) { |
| 113 AVCodecContextToAudioDecoderConfig(stream->codec, &audio_config_); |
| 114 } |
| 110 } | 115 } |
| 111 | 116 |
| 112 ChunkDemuxerStream::~ChunkDemuxerStream() {} | 117 ChunkDemuxerStream::~ChunkDemuxerStream() {} |
| 113 | 118 |
| 114 void ChunkDemuxerStream::Flush() { | 119 void ChunkDemuxerStream::Flush() { |
| 115 VLOG(1) << "Flush()"; | 120 VLOG(1) << "Flush()"; |
| 116 base::AutoLock auto_lock(lock_); | 121 base::AutoLock auto_lock(lock_); |
| 117 buffers_.clear(); | 122 buffers_.clear(); |
| 118 received_end_of_stream_ = false; | 123 received_end_of_stream_ = false; |
| 119 last_buffer_timestamp_ = kNoTimestamp; | 124 last_buffer_timestamp_ = kNoTimestamp; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 DCHECK(buffer.get()); | 279 DCHECK(buffer.get()); |
| 275 read_callback.Run(buffer); | 280 read_callback.Run(buffer); |
| 276 } | 281 } |
| 277 | 282 |
| 278 DemuxerStream::Type ChunkDemuxerStream::type() { return type_; } | 283 DemuxerStream::Type ChunkDemuxerStream::type() { return type_; } |
| 279 | 284 |
| 280 void ChunkDemuxerStream::EnableBitstreamConverter() {} | 285 void ChunkDemuxerStream::EnableBitstreamConverter() {} |
| 281 | 286 |
| 282 AVStream* ChunkDemuxerStream::GetAVStream() { return av_stream_; } | 287 AVStream* ChunkDemuxerStream::GetAVStream() { return av_stream_; } |
| 283 | 288 |
| 289 const AudioDecoderConfig& ChunkDemuxerStream::audio_decoder_config() { |
| 290 CHECK_EQ(type_, AUDIO); |
| 291 return audio_config_; |
| 292 } |
| 293 |
| 284 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client) | 294 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client) |
| 285 : state_(WAITING_FOR_INIT), | 295 : state_(WAITING_FOR_INIT), |
| 286 client_(client), | 296 client_(client), |
| 287 format_context_(NULL), | 297 format_context_(NULL), |
| 288 buffered_bytes_(0), | 298 buffered_bytes_(0), |
| 289 seek_waits_for_data_(true) { | 299 seek_waits_for_data_(true) { |
| 290 DCHECK(client); | 300 DCHECK(client); |
| 291 } | 301 } |
| 292 | 302 |
| 293 ChunkDemuxer::~ChunkDemuxer() { | 303 ChunkDemuxer::~ChunkDemuxer() { |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 base::AutoUnlock auto_unlock(lock_); | 724 base::AutoUnlock auto_unlock(lock_); |
| 715 if (cb.is_null()) { | 725 if (cb.is_null()) { |
| 716 host()->SetError(error); | 726 host()->SetError(error); |
| 717 return; | 727 return; |
| 718 } | 728 } |
| 719 cb.Run(error); | 729 cb.Run(error); |
| 720 } | 730 } |
| 721 } | 731 } |
| 722 | 732 |
| 723 } // namespace media | 733 } // namespace media |
| OLD | NEW |