| 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/chunk_demuxer.h" | 5 #include "media/filters/chunk_demuxer.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "media/base/audio_decoder_config.h" | 10 #include "media/base/audio_decoder_config.h" |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 } | 116 } |
| 117 | 117 |
| 118 class ChunkDemuxerStream : public DemuxerStream { | 118 class ChunkDemuxerStream : public DemuxerStream { |
| 119 public: | 119 public: |
| 120 typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue; | 120 typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue; |
| 121 typedef std::deque<ReadCB> ReadCBQueue; | 121 typedef std::deque<ReadCB> ReadCBQueue; |
| 122 typedef std::deque<base::Closure> ClosureQueue; | 122 typedef std::deque<base::Closure> ClosureQueue; |
| 123 | 123 |
| 124 explicit ChunkDemuxerStream(const AudioDecoderConfig& audio_config); | 124 explicit ChunkDemuxerStream(const AudioDecoderConfig& audio_config); |
| 125 explicit ChunkDemuxerStream(const VideoDecoderConfig& video_config); | 125 explicit ChunkDemuxerStream(const VideoDecoderConfig& video_config); |
| 126 virtual ~ChunkDemuxerStream(); | |
| 127 | 126 |
| 128 void Flush(); | 127 void Flush(); |
| 129 void Seek(base::TimeDelta time); | 128 void Seek(base::TimeDelta time); |
| 130 | 129 |
| 131 // Checks if it is ok to add the |buffers| to the stream. | 130 // Checks if it is ok to add the |buffers| to the stream. |
| 132 bool CanAddBuffers(const BufferQueue& buffers) const; | 131 bool CanAddBuffers(const BufferQueue& buffers) const; |
| 133 | 132 |
| 134 void AddBuffers(const BufferQueue& buffers); | 133 void AddBuffers(const BufferQueue& buffers); |
| 135 void Shutdown(); | 134 void Shutdown(); |
| 136 | 135 |
| 137 // Gets the time range buffered by this object. | 136 // Gets the time range buffered by this object. |
| 138 // Returns true if there is buffered data. |start_out| & |end_out| are set to | 137 // Returns true if there is buffered data. |start_out| & |end_out| are set to |
| 139 // the start and end time of the buffered data respectively. | 138 // the start and end time of the buffered data respectively. |
| 140 // Returns false if no data is buffered. | 139 // Returns false if no data is buffered. |
| 141 bool GetBufferedRange(base::TimeDelta* start_out, | 140 bool GetBufferedRange(base::TimeDelta* start_out, |
| 142 base::TimeDelta* end_out) const; | 141 base::TimeDelta* end_out) const; |
| 143 | 142 |
| 144 bool GetLastBufferTimestamp(base::TimeDelta* timestamp) const; | 143 bool GetLastBufferTimestamp(base::TimeDelta* timestamp) const; |
| 145 | 144 |
| 146 // DemuxerStream methods. | 145 // DemuxerStream methods. |
| 147 virtual void Read(const ReadCB& read_cb) OVERRIDE; | 146 virtual void Read(const ReadCB& read_cb) OVERRIDE; |
| 148 virtual Type type() OVERRIDE; | 147 virtual Type type() OVERRIDE; |
| 149 virtual void EnableBitstreamConverter() OVERRIDE; | 148 virtual void EnableBitstreamConverter() OVERRIDE; |
| 150 virtual const AudioDecoderConfig& audio_decoder_config() OVERRIDE; | 149 virtual const AudioDecoderConfig& audio_decoder_config() OVERRIDE; |
| 151 virtual const VideoDecoderConfig& video_decoder_config() OVERRIDE; | 150 virtual const VideoDecoderConfig& video_decoder_config() OVERRIDE; |
| 152 | 151 |
| 152 protected: |
| 153 virtual ~ChunkDemuxerStream(); |
| 154 |
| 153 private: | 155 private: |
| 154 enum State { | 156 enum State { |
| 155 RETURNING_DATA_FOR_READS, | 157 RETURNING_DATA_FOR_READS, |
| 156 WAITING_FOR_SEEK, | 158 WAITING_FOR_SEEK, |
| 157 RECEIVED_EOS_WHILE_WAITING_FOR_SEEK, // EOS = End of stream. | 159 RECEIVED_EOS_WHILE_WAITING_FOR_SEEK, // EOS = End of stream. |
| 158 RECEIVED_EOS, | 160 RECEIVED_EOS, |
| 159 RETURNING_EOS_FOR_READS, | 161 RETURNING_EOS_FOR_READS, |
| 160 SHUTDOWN, | 162 SHUTDOWN, |
| 161 }; | 163 }; |
| 162 | 164 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 } | 198 } |
| 197 | 199 |
| 198 | 200 |
| 199 ChunkDemuxerStream::ChunkDemuxerStream(const VideoDecoderConfig& video_config) | 201 ChunkDemuxerStream::ChunkDemuxerStream(const VideoDecoderConfig& video_config) |
| 200 : type_(VIDEO), | 202 : type_(VIDEO), |
| 201 state_(RETURNING_DATA_FOR_READS), | 203 state_(RETURNING_DATA_FOR_READS), |
| 202 last_buffer_timestamp_(kNoTimestamp()) { | 204 last_buffer_timestamp_(kNoTimestamp()) { |
| 203 video_config_.CopyFrom(video_config); | 205 video_config_.CopyFrom(video_config); |
| 204 } | 206 } |
| 205 | 207 |
| 206 ChunkDemuxerStream::~ChunkDemuxerStream() {} | |
| 207 | |
| 208 void ChunkDemuxerStream::Flush() { | 208 void ChunkDemuxerStream::Flush() { |
| 209 DVLOG(1) << "Flush()"; | 209 DVLOG(1) << "Flush()"; |
| 210 ReadCBQueue read_cbs; | 210 ReadCBQueue read_cbs; |
| 211 { | 211 { |
| 212 base::AutoLock auto_lock(lock_); | 212 base::AutoLock auto_lock(lock_); |
| 213 buffers_.clear(); | 213 buffers_.clear(); |
| 214 ChangeState_Locked(WAITING_FOR_SEEK); | 214 ChangeState_Locked(WAITING_FOR_SEEK); |
| 215 last_buffer_timestamp_ = kNoTimestamp(); | 215 last_buffer_timestamp_ = kNoTimestamp(); |
| 216 | 216 |
| 217 std::swap(read_cbs_, read_cbs); | 217 std::swap(read_cbs_, read_cbs); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 const VideoDecoderConfig& ChunkDemuxerStream::video_decoder_config() { | 410 const VideoDecoderConfig& ChunkDemuxerStream::video_decoder_config() { |
| 411 CHECK_EQ(type_, VIDEO); | 411 CHECK_EQ(type_, VIDEO); |
| 412 return video_config_; | 412 return video_config_; |
| 413 } | 413 } |
| 414 | 414 |
| 415 void ChunkDemuxerStream::ChangeState_Locked(State state) { | 415 void ChunkDemuxerStream::ChangeState_Locked(State state) { |
| 416 lock_.AssertAcquired(); | 416 lock_.AssertAcquired(); |
| 417 state_ = state; | 417 state_ = state; |
| 418 } | 418 } |
| 419 | 419 |
| 420 ChunkDemuxerStream::~ChunkDemuxerStream() {} |
| 421 |
| 420 void ChunkDemuxerStream::DeferRead_Locked(const ReadCB& read_cb) { | 422 void ChunkDemuxerStream::DeferRead_Locked(const ReadCB& read_cb) { |
| 421 lock_.AssertAcquired(); | 423 lock_.AssertAcquired(); |
| 422 // Wrap & store |read_cb| so that it will | 424 // Wrap & store |read_cb| so that it will |
| 423 // get called on the current MessageLoop. | 425 // get called on the current MessageLoop. |
| 424 read_cbs_.push_back(base::Bind(&RunOnMessageLoop, read_cb, | 426 read_cbs_.push_back(base::Bind(&RunOnMessageLoop, read_cb, |
| 425 MessageLoop::current())); | 427 MessageLoop::current())); |
| 426 } | 428 } |
| 427 | 429 |
| 428 void ChunkDemuxerStream::CreateReadDoneClosures_Locked(ClosureQueue* closures) { | 430 void ChunkDemuxerStream::CreateReadDoneClosures_Locked(ClosureQueue* closures) { |
| 429 lock_.AssertAcquired(); | 431 lock_.AssertAcquired(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 453 | 455 |
| 454 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client) | 456 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client) |
| 455 : state_(WAITING_FOR_INIT), | 457 : state_(WAITING_FOR_INIT), |
| 456 host_(NULL), | 458 host_(NULL), |
| 457 client_(client), | 459 client_(client), |
| 458 buffered_bytes_(0), | 460 buffered_bytes_(0), |
| 459 seek_waits_for_data_(true) { | 461 seek_waits_for_data_(true) { |
| 460 DCHECK(client); | 462 DCHECK(client); |
| 461 } | 463 } |
| 462 | 464 |
| 463 ChunkDemuxer::~ChunkDemuxer() { | |
| 464 DCHECK_NE(state_, INITIALIZED); | |
| 465 } | |
| 466 | |
| 467 void ChunkDemuxer::Initialize(DemuxerHost* host, | 465 void ChunkDemuxer::Initialize(DemuxerHost* host, |
| 468 const PipelineStatusCB& cb) { | 466 const PipelineStatusCB& cb) { |
| 469 DVLOG(1) << "Init()"; | 467 DVLOG(1) << "Init()"; |
| 470 { | 468 { |
| 471 base::AutoLock auto_lock(lock_); | 469 base::AutoLock auto_lock(lock_); |
| 472 DCHECK_EQ(state_, WAITING_FOR_INIT); | 470 DCHECK_EQ(state_, WAITING_FOR_INIT); |
| 473 host_ = host; | 471 host_ = host; |
| 474 | 472 |
| 475 ChangeState_Locked(INITIALIZING); | 473 ChangeState_Locked(INITIALIZING); |
| 476 init_cb_ = cb; | 474 init_cb_ = cb; |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 cb.Run(PIPELINE_ERROR_ABORT); | 804 cb.Run(PIPELINE_ERROR_ABORT); |
| 807 | 805 |
| 808 client_->DemuxerClosed(); | 806 client_->DemuxerClosed(); |
| 809 } | 807 } |
| 810 | 808 |
| 811 void ChunkDemuxer::ChangeState_Locked(State new_state) { | 809 void ChunkDemuxer::ChangeState_Locked(State new_state) { |
| 812 lock_.AssertAcquired(); | 810 lock_.AssertAcquired(); |
| 813 state_ = new_state; | 811 state_ = new_state; |
| 814 } | 812 } |
| 815 | 813 |
| 814 ChunkDemuxer::~ChunkDemuxer() { |
| 815 DCHECK_NE(state_, INITIALIZED); |
| 816 } |
| 817 |
| 816 void ChunkDemuxer::ReportError_Locked(PipelineStatus error) { | 818 void ChunkDemuxer::ReportError_Locked(PipelineStatus error) { |
| 817 lock_.AssertAcquired(); | 819 lock_.AssertAcquired(); |
| 818 DCHECK_NE(error, PIPELINE_OK); | 820 DCHECK_NE(error, PIPELINE_OK); |
| 819 | 821 |
| 820 ChangeState_Locked(PARSE_ERROR); | 822 ChangeState_Locked(PARSE_ERROR); |
| 821 | 823 |
| 822 PipelineStatusCB cb; | 824 PipelineStatusCB cb; |
| 823 | 825 |
| 824 if (!init_cb_.is_null()) { | 826 if (!init_cb_.is_null()) { |
| 825 std::swap(cb, init_cb_); | 827 std::swap(cb, init_cb_); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 return true; | 915 return true; |
| 914 } | 916 } |
| 915 | 917 |
| 916 bool ChunkDemuxer::OnKeyNeeded(scoped_array<uint8> init_data, | 918 bool ChunkDemuxer::OnKeyNeeded(scoped_array<uint8> init_data, |
| 917 int init_data_size) { | 919 int init_data_size) { |
| 918 client_->KeyNeeded(init_data.Pass(), init_data_size); | 920 client_->KeyNeeded(init_data.Pass(), init_data_size); |
| 919 return true; | 921 return true; |
| 920 } | 922 } |
| 921 | 923 |
| 922 } // namespace media | 924 } // namespace media |
| OLD | NEW |