| 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 #ifndef MEDIA_FILTERS_CHUNK_DEMUXER_H_ | 5 #ifndef MEDIA_FILTERS_CHUNK_DEMUXER_H_ |
| 6 #define MEDIA_FILTERS_CHUNK_DEMUXER_H_ | 6 #define MEDIA_FILTERS_CHUNK_DEMUXER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/synchronization/lock.h" | 13 #include "base/synchronization/lock.h" |
| 14 #include "media/base/byte_queue.h" | 14 #include "media/base/byte_queue.h" |
| 15 #include "media/base/demuxer.h" | 15 #include "media/base/demuxer.h" |
| 16 #include "media/base/ranges.h" |
| 16 #include "media/base/stream_parser.h" | 17 #include "media/base/stream_parser.h" |
| 17 #include "media/filters/source_buffer_stream.h" | 18 #include "media/filters/source_buffer_stream.h" |
| 18 | 19 |
| 19 namespace media { | 20 namespace media { |
| 20 | 21 |
| 21 class ChunkDemuxerClient; | 22 class ChunkDemuxerClient; |
| 22 class ChunkDemuxerStream; | 23 class ChunkDemuxerStream; |
| 23 class FFmpegURLProtocol; | 24 class FFmpegURLProtocol; |
| 24 | 25 |
| 25 // Demuxer implementation that allows chunks of media data to be passed | 26 // Demuxer implementation that allows chunks of media data to be passed |
| 26 // from JavaScript to the media stack. | 27 // from JavaScript to the media stack. |
| 27 class MEDIA_EXPORT ChunkDemuxer : public Demuxer { | 28 class MEDIA_EXPORT ChunkDemuxer : public Demuxer { |
| 28 public: | 29 public: |
| 29 enum Status { | 30 enum Status { |
| 30 kOk, // ID added w/o error. | 31 kOk, // ID added w/o error. |
| 31 kNotSupported, // Type specified is not supported. | 32 kNotSupported, // Type specified is not supported. |
| 32 kReachedIdLimit, // Reached ID limit. We can't handle any more IDs. | 33 kReachedIdLimit, // Reached ID limit. We can't handle any more IDs. |
| 33 }; | 34 }; |
| 34 | 35 |
| 35 typedef std::vector<std::pair<base::TimeDelta, base::TimeDelta> > Ranges; | |
| 36 | |
| 37 explicit ChunkDemuxer(ChunkDemuxerClient* client); | 36 explicit ChunkDemuxer(ChunkDemuxerClient* client); |
| 38 | 37 |
| 39 // Demuxer implementation. | 38 // Demuxer implementation. |
| 40 virtual void Initialize(DemuxerHost* host, | 39 virtual void Initialize(DemuxerHost* host, |
| 41 const PipelineStatusCB& cb) OVERRIDE; | 40 const PipelineStatusCB& cb) OVERRIDE; |
| 42 virtual void Stop(const base::Closure& callback) OVERRIDE; | 41 virtual void Stop(const base::Closure& callback) OVERRIDE; |
| 43 virtual void Seek(base::TimeDelta time, const PipelineStatusCB& cb) OVERRIDE; | 42 virtual void Seek(base::TimeDelta time, const PipelineStatusCB& cb) OVERRIDE; |
| 44 virtual void OnAudioRendererDisabled() OVERRIDE; | 43 virtual void OnAudioRendererDisabled() OVERRIDE; |
| 45 virtual scoped_refptr<DemuxerStream> GetStream( | 44 virtual scoped_refptr<DemuxerStream> GetStream( |
| 46 DemuxerStream::Type type) OVERRIDE; | 45 DemuxerStream::Type type) OVERRIDE; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 58 // kReachedIdLimit is returned if the demuxer cannot handle another ID right | 57 // kReachedIdLimit is returned if the demuxer cannot handle another ID right |
| 59 // now. | 58 // now. |
| 60 Status AddId(const std::string& id, const std::string& type, | 59 Status AddId(const std::string& id, const std::string& type, |
| 61 std::vector<std::string>& codecs); | 60 std::vector<std::string>& codecs); |
| 62 | 61 |
| 63 // Removed an ID & associated resources that were previously added with | 62 // Removed an ID & associated resources that were previously added with |
| 64 // AddId(). | 63 // AddId(). |
| 65 void RemoveId(const std::string& id); | 64 void RemoveId(const std::string& id); |
| 66 | 65 |
| 67 // Gets the currently buffered ranges for the specified ID. | 66 // Gets the currently buffered ranges for the specified ID. |
| 68 // Returns true if data is buffered & |ranges_out| is set to the | 67 Ranges<base::TimeDelta> GetBufferedRanges(const std::string& id) const; |
| 69 // time ranges currently buffered. | |
| 70 // Returns false if no data is buffered. | |
| 71 bool GetBufferedRanges(const std::string& id, Ranges* ranges_out) const; | |
| 72 | 68 |
| 73 // Appends media data to the source buffer associated with |id|. Returns | 69 // Appends media data to the source buffer associated with |id|. Returns |
| 74 // false if this method is called in an invalid state. | 70 // false if this method is called in an invalid state. |
| 75 bool AppendData(const std::string& id, const uint8* data, size_t length); | 71 bool AppendData(const std::string& id, const uint8* data, size_t length); |
| 76 | 72 |
| 77 // Aborts parsing the current segment and reset the parser to a state where | 73 // Aborts parsing the current segment and reset the parser to a state where |
| 78 // it can accept a new segment. | 74 // it can accept a new segment. |
| 79 void Abort(const std::string& id); | 75 void Abort(const std::string& id); |
| 80 | 76 |
| 81 // Signals an EndOfStream request. | 77 // Signals an EndOfStream request. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 void OnStreamParserInitDone(bool success, base::TimeDelta duration); | 110 void OnStreamParserInitDone(bool success, base::TimeDelta duration); |
| 115 bool OnNewConfigs(bool has_audio, bool has_video, | 111 bool OnNewConfigs(bool has_audio, bool has_video, |
| 116 const AudioDecoderConfig& audio_config, | 112 const AudioDecoderConfig& audio_config, |
| 117 const VideoDecoderConfig& video_config); | 113 const VideoDecoderConfig& video_config); |
| 118 bool OnAudioBuffers(const StreamParser::BufferQueue& buffers); | 114 bool OnAudioBuffers(const StreamParser::BufferQueue& buffers); |
| 119 bool OnVideoBuffers(const StreamParser::BufferQueue& buffers); | 115 bool OnVideoBuffers(const StreamParser::BufferQueue& buffers); |
| 120 bool OnNeedKey(scoped_array<uint8> init_data, int init_data_size); | 116 bool OnNeedKey(scoped_array<uint8> init_data, int init_data_size); |
| 121 void OnNewMediaSegment(const std::string& source_id, | 117 void OnNewMediaSegment(const std::string& source_id, |
| 122 base::TimeDelta start_timestamp); | 118 base::TimeDelta start_timestamp); |
| 123 | 119 |
| 124 // Helper functions for calculating GetBufferedRanges(). | 120 // Computes the intersection between the video & audio |
| 125 bool CopyIntoRanges( | 121 // buffered ranges. |
| 126 const SourceBufferStream::TimespanList& timespans, | 122 Ranges<base::TimeDelta> ComputeIntersection() const; |
| 127 Ranges* ranges_out) const; | |
| 128 void AddIntersectionRange( | |
| 129 SourceBufferStream::Timespan timespan_a, | |
| 130 SourceBufferStream::Timespan timespan_b, | |
| 131 bool last_range_after_ended, | |
| 132 Ranges* ranges_out) const; | |
| 133 | 123 |
| 134 mutable base::Lock lock_; | 124 mutable base::Lock lock_; |
| 135 State state_; | 125 State state_; |
| 136 | 126 |
| 137 DemuxerHost* host_; | 127 DemuxerHost* host_; |
| 138 ChunkDemuxerClient* client_; | 128 ChunkDemuxerClient* client_; |
| 139 PipelineStatusCB init_cb_; | 129 PipelineStatusCB init_cb_; |
| 140 PipelineStatusCB seek_cb_; | 130 PipelineStatusCB seek_cb_; |
| 141 | 131 |
| 142 scoped_refptr<ChunkDemuxerStream> audio_; | 132 scoped_refptr<ChunkDemuxerStream> audio_; |
| 143 scoped_refptr<ChunkDemuxerStream> video_; | 133 scoped_refptr<ChunkDemuxerStream> video_; |
| 144 | 134 |
| 145 int64 buffered_bytes_; | |
| 146 | |
| 147 base::TimeDelta duration_; | 135 base::TimeDelta duration_; |
| 148 | 136 |
| 149 typedef std::map<std::string, StreamParser*> StreamParserMap; | 137 typedef std::map<std::string, StreamParser*> StreamParserMap; |
| 150 StreamParserMap stream_parser_map_; | 138 StreamParserMap stream_parser_map_; |
| 151 | 139 |
| 152 // Used to ensure that (1) config data matches the type and codec provided in | 140 // Used to ensure that (1) config data matches the type and codec provided in |
| 153 // AddId(), (2) only 1 audio and 1 video sources are added, and (3) ids may be | 141 // AddId(), (2) only 1 audio and 1 video sources are added, and (3) ids may be |
| 154 // removed with RemoveID() but can not be re-added (yet). | 142 // removed with RemoveID() but can not be re-added (yet). |
| 155 std::string source_id_audio_; | 143 std::string source_id_audio_; |
| 156 std::string source_id_video_; | 144 std::string source_id_video_; |
| 157 | 145 |
| 158 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxer); | 146 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxer); |
| 159 }; | 147 }; |
| 160 | 148 |
| 161 } // namespace media | 149 } // namespace media |
| 162 | 150 |
| 163 #endif // MEDIA_FILTERS_CHUNK_DEMUXER_H_ | 151 #endif // MEDIA_FILTERS_CHUNK_DEMUXER_H_ |
| OLD | NEW |