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 // Implements the Demuxer interface using FFmpeg's libavformat. At this time | 5 // Implements the Demuxer interface using FFmpeg's libavformat. At this time |
6 // will support demuxing any audio/video format thrown at it. The streams | 6 // will support demuxing any audio/video format thrown at it. The streams |
7 // output mime types audio/x-ffmpeg and video/x-ffmpeg and include an integer | 7 // output mime types audio/x-ffmpeg and video/x-ffmpeg and include an integer |
8 // key FFmpegCodecID which contains the CodecID enumeration value. The CodecIDs | 8 // key FFmpegCodecID which contains the CodecID enumeration value. The CodecIDs |
9 // can be used to create and initialize the corresponding FFmpeg decoder. | 9 // can be used to create and initialize the corresponding FFmpeg decoder. |
10 // | 10 // |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 | 79 |
80 // Enables fixes for ogg files with negative timestamps. For AUDIO streams, | 80 // Enables fixes for ogg files with negative timestamps. For AUDIO streams, |
81 // all packets with negative timestamps will be marked for post-decode | 81 // all packets with negative timestamps will be marked for post-decode |
82 // discard. For all other stream types, if FFmpegDemuxer::start_time() is | 82 // discard. For all other stream types, if FFmpegDemuxer::start_time() is |
83 // negative, it will not be used to shift timestamps during EnqueuePacket(). | 83 // negative, it will not be used to shift timestamps during EnqueuePacket(). |
84 void enable_negative_timestamp_fixups_for_ogg() { | 84 void enable_negative_timestamp_fixups_for_ogg() { |
85 fixup_negative_ogg_timestamps_ = true; | 85 fixup_negative_ogg_timestamps_ = true; |
86 } | 86 } |
87 | 87 |
88 // DemuxerStream implementation. | 88 // DemuxerStream implementation. |
89 Type type() override; | 89 Type type() const override; |
| 90 Liveness liveness() const override; |
90 void Read(const ReadCB& read_cb) override; | 91 void Read(const ReadCB& read_cb) override; |
91 void EnableBitstreamConverter() override; | 92 void EnableBitstreamConverter() override; |
92 bool SupportsConfigChanges() override; | 93 bool SupportsConfigChanges() override; |
93 AudioDecoderConfig audio_decoder_config() override; | 94 AudioDecoderConfig audio_decoder_config() override; |
94 VideoDecoderConfig video_decoder_config() override; | 95 VideoDecoderConfig video_decoder_config() override; |
95 VideoRotation video_rotation() override; | 96 VideoRotation video_rotation() override; |
96 | 97 |
| 98 void SetLiveness(Liveness liveness); |
| 99 |
97 // Returns the range of buffered data in this stream. | 100 // Returns the range of buffered data in this stream. |
98 Ranges<base::TimeDelta> GetBufferedRanges() const; | 101 Ranges<base::TimeDelta> GetBufferedRanges() const; |
99 | 102 |
100 // Returns elapsed time based on the already queued packets. | 103 // Returns elapsed time based on the already queued packets. |
101 // Used to determine stream duration when it's not known ahead of time. | 104 // Used to determine stream duration when it's not known ahead of time. |
102 base::TimeDelta GetElapsedTime() const; | 105 base::TimeDelta GetElapsedTime() const; |
103 | 106 |
104 // Returns true if this stream has capacity for additional data. | 107 // Returns true if this stream has capacity for additional data. |
105 bool HasAvailableCapacity(); | 108 bool HasAvailableCapacity(); |
106 | 109 |
(...skipping 22 matching lines...) Expand all Loading... |
129 | 132 |
130 // Create new bitstream converter, destroying active converter if present. | 133 // Create new bitstream converter, destroying active converter if present. |
131 void InitBitstreamConverter(); | 134 void InitBitstreamConverter(); |
132 | 135 |
133 FFmpegDemuxer* demuxer_; | 136 FFmpegDemuxer* demuxer_; |
134 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 137 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
135 AVStream* stream_; | 138 AVStream* stream_; |
136 AudioDecoderConfig audio_config_; | 139 AudioDecoderConfig audio_config_; |
137 VideoDecoderConfig video_config_; | 140 VideoDecoderConfig video_config_; |
138 Type type_; | 141 Type type_; |
| 142 Liveness liveness_; |
139 base::TimeDelta duration_; | 143 base::TimeDelta duration_; |
140 bool end_of_stream_; | 144 bool end_of_stream_; |
141 base::TimeDelta last_packet_timestamp_; | 145 base::TimeDelta last_packet_timestamp_; |
142 base::TimeDelta last_packet_duration_; | 146 base::TimeDelta last_packet_duration_; |
143 Ranges<base::TimeDelta> buffered_ranges_; | 147 Ranges<base::TimeDelta> buffered_ranges_; |
144 VideoRotation video_rotation_; | 148 VideoRotation video_rotation_; |
145 | 149 |
146 DecoderBufferQueue buffer_queue_; | 150 DecoderBufferQueue buffer_queue_; |
147 ReadCB read_cb_; | 151 ReadCB read_cb_; |
148 | 152 |
(...skipping 17 matching lines...) Expand all Loading... |
166 | 170 |
167 // Demuxer implementation. | 171 // Demuxer implementation. |
168 void Initialize(DemuxerHost* host, | 172 void Initialize(DemuxerHost* host, |
169 const PipelineStatusCB& status_cb, | 173 const PipelineStatusCB& status_cb, |
170 bool enable_text_tracks) override; | 174 bool enable_text_tracks) override; |
171 void Stop() override; | 175 void Stop() override; |
172 void Seek(base::TimeDelta time, const PipelineStatusCB& cb) override; | 176 void Seek(base::TimeDelta time, const PipelineStatusCB& cb) override; |
173 base::Time GetTimelineOffset() const override; | 177 base::Time GetTimelineOffset() const override; |
174 DemuxerStream* GetStream(DemuxerStream::Type type) override; | 178 DemuxerStream* GetStream(DemuxerStream::Type type) override; |
175 base::TimeDelta GetStartTime() const override; | 179 base::TimeDelta GetStartTime() const override; |
176 Liveness GetLiveness() const override; | |
177 | 180 |
178 // Calls |need_key_cb_| with the initialization data encountered in the file. | 181 // Calls |need_key_cb_| with the initialization data encountered in the file. |
179 void FireNeedKey(const std::string& init_data_type, | 182 void FireNeedKey(const std::string& init_data_type, |
180 const std::string& encryption_key_id); | 183 const std::string& encryption_key_id); |
181 | 184 |
182 // Allow FFmpegDemuxerStream to notify us when there is updated information | 185 // Allow FFmpegDemuxerStream to notify us when there is updated information |
183 // about capacity and what buffered data is available. | 186 // about capacity and what buffered data is available. |
184 void NotifyCapacityAvailable(); | 187 void NotifyCapacityAvailable(); |
185 void NotifyBufferingChanged(); | 188 void NotifyBufferingChanged(); |
186 | 189 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 void OnDataSourceError(); | 221 void OnDataSourceError(); |
219 | 222 |
220 // Returns the stream from |streams_| that matches |type| as an | 223 // Returns the stream from |streams_| that matches |type| as an |
221 // FFmpegDemuxerStream. | 224 // FFmpegDemuxerStream. |
222 FFmpegDemuxerStream* GetFFmpegStream(DemuxerStream::Type type) const; | 225 FFmpegDemuxerStream* GetFFmpegStream(DemuxerStream::Type type) const; |
223 | 226 |
224 // Called after the streams have been collected from the media, to allow | 227 // Called after the streams have been collected from the media, to allow |
225 // the text renderer to bind each text stream to the cue rendering engine. | 228 // the text renderer to bind each text stream to the cue rendering engine. |
226 void AddTextStreams(); | 229 void AddTextStreams(); |
227 | 230 |
| 231 void SetLiveness(DemuxerStream::Liveness liveness); |
| 232 |
228 DemuxerHost* host_; | 233 DemuxerHost* host_; |
229 | 234 |
230 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 235 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
231 | 236 |
232 // Thread on which all blocking FFmpeg operations are executed. | 237 // Thread on which all blocking FFmpeg operations are executed. |
233 base::Thread blocking_thread_; | 238 base::Thread blocking_thread_; |
234 | 239 |
235 // Tracks if there's an outstanding av_read_frame() operation. | 240 // Tracks if there's an outstanding av_read_frame() operation. |
236 // | 241 // |
237 // TODO(scherkus): Allow more than one read in flight for higher read | 242 // TODO(scherkus): Allow more than one read in flight for higher read |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 // point occurs after its associated start time. Otherwise it will use | 281 // point occurs after its associated start time. Otherwise it will use |
277 // |fallback_stream_for_seeking_|. | 282 // |fallback_stream_for_seeking_|. |
278 typedef std::pair<int, base::TimeDelta> StreamSeekInfo; | 283 typedef std::pair<int, base::TimeDelta> StreamSeekInfo; |
279 StreamSeekInfo preferred_stream_for_seeking_; | 284 StreamSeekInfo preferred_stream_for_seeking_; |
280 StreamSeekInfo fallback_stream_for_seeking_; | 285 StreamSeekInfo fallback_stream_for_seeking_; |
281 | 286 |
282 // The Time associated with timestamp 0. Set to a null | 287 // The Time associated with timestamp 0. Set to a null |
283 // time if the file doesn't have an association to Time. | 288 // time if the file doesn't have an association to Time. |
284 base::Time timeline_offset_; | 289 base::Time timeline_offset_; |
285 | 290 |
286 // Liveness of the stream. | |
287 Liveness liveness_; | |
288 | |
289 // Whether text streams have been enabled for this demuxer. | 291 // Whether text streams have been enabled for this demuxer. |
290 bool text_enabled_; | 292 bool text_enabled_; |
291 | 293 |
292 // Set if we know duration of the audio stream. Used when processing end of | 294 // Set if we know duration of the audio stream. Used when processing end of |
293 // stream -- at this moment we definitely know duration. | 295 // stream -- at this moment we definitely know duration. |
294 bool duration_known_; | 296 bool duration_known_; |
295 | 297 |
296 // FFmpegURLProtocol implementation and corresponding glue bits. | 298 // FFmpegURLProtocol implementation and corresponding glue bits. |
297 scoped_ptr<BlockingUrlProtocol> url_protocol_; | 299 scoped_ptr<BlockingUrlProtocol> url_protocol_; |
298 scoped_ptr<FFmpegGlue> glue_; | 300 scoped_ptr<FFmpegGlue> glue_; |
299 | 301 |
300 const NeedKeyCB need_key_cb_; | 302 const NeedKeyCB need_key_cb_; |
301 | 303 |
302 // NOTE: Weak pointers must be invalidated before all other member variables. | 304 // NOTE: Weak pointers must be invalidated before all other member variables. |
303 base::WeakPtrFactory<FFmpegDemuxer> weak_factory_; | 305 base::WeakPtrFactory<FFmpegDemuxer> weak_factory_; |
304 | 306 |
305 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxer); | 307 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxer); |
306 }; | 308 }; |
307 | 309 |
308 } // namespace media | 310 } // namespace media |
309 | 311 |
310 #endif // MEDIA_FILTERS_FFMPEG_DEMUXER_H_ | 312 #endif // MEDIA_FILTERS_FFMPEG_DEMUXER_H_ |
OLD | NEW |