| 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 // Enters the end of stream state. After delivering remaining queued buffers | 79 // Enters the end of stream state. After delivering remaining queued buffers |
| 80 // only end of stream buffers will be delivered. | 80 // only end of stream buffers will be delivered. |
| 81 void SetEndOfStream(); | 81 void SetEndOfStream(); |
| 82 | 82 |
| 83 // Drops queued buffers and clears end of stream state. | 83 // Drops queued buffers and clears end of stream state. |
| 84 void FlushBuffers(); | 84 void FlushBuffers(); |
| 85 | 85 |
| 86 // Empties the queues and ignores any additional calls to Read(). | 86 // Empties the queues and ignores any additional calls to Read(). |
| 87 void Stop(); | 87 void Stop(); |
| 88 | 88 |
| 89 // Aborts any pending reads. |
| 90 void Abort(); |
| 91 |
| 89 base::TimeDelta duration() const { return duration_; } | 92 base::TimeDelta duration() const { return duration_; } |
| 90 | 93 |
| 91 // Enables fixes for files with negative timestamps. Normally all timestamps | 94 // Enables fixes for files with negative timestamps. Normally all timestamps |
| 92 // are rebased against FFmpegDemuxer::start_time() whenever that value is | 95 // are rebased against FFmpegDemuxer::start_time() whenever that value is |
| 93 // negative. When this fix is enabled, only AUDIO stream packets will be | 96 // negative. When this fix is enabled, only AUDIO stream packets will be |
| 94 // rebased to time zero, all other stream types will use the muxed timestamp. | 97 // rebased to time zero, all other stream types will use the muxed timestamp. |
| 95 // | 98 // |
| 96 // Further, when no codec delay is present, all AUDIO packets which originally | 99 // Further, when no codec delay is present, all AUDIO packets which originally |
| 97 // had negative timestamps will be marked for post-decode discard. When codec | 100 // had negative timestamps will be marked for post-decode discard. When codec |
| 98 // delay is present, it is assumed the decoder will handle discard and does | 101 // delay is present, it is assumed the decoder will handle discard and does |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 const EncryptedMediaInitDataCB& encrypted_media_init_data_cb, | 207 const EncryptedMediaInitDataCB& encrypted_media_init_data_cb, |
| 205 const MediaTracksUpdatedCB& media_tracks_updated_cb, | 208 const MediaTracksUpdatedCB& media_tracks_updated_cb, |
| 206 const scoped_refptr<MediaLog>& media_log); | 209 const scoped_refptr<MediaLog>& media_log); |
| 207 ~FFmpegDemuxer() override; | 210 ~FFmpegDemuxer() override; |
| 208 | 211 |
| 209 // Demuxer implementation. | 212 // Demuxer implementation. |
| 210 std::string GetDisplayName() const override; | 213 std::string GetDisplayName() const override; |
| 211 void Initialize(DemuxerHost* host, | 214 void Initialize(DemuxerHost* host, |
| 212 const PipelineStatusCB& status_cb, | 215 const PipelineStatusCB& status_cb, |
| 213 bool enable_text_tracks) override; | 216 bool enable_text_tracks) override; |
| 217 void AbortPendingReads() override; |
| 214 void Stop() override; | 218 void Stop() override; |
| 215 void StartWaitingForSeek(base::TimeDelta seek_time) override; | 219 void StartWaitingForSeek(base::TimeDelta seek_time) override; |
| 216 void CancelPendingSeek(base::TimeDelta seek_time) override; | 220 void CancelPendingSeek(base::TimeDelta seek_time) override; |
| 217 void Seek(base::TimeDelta time, const PipelineStatusCB& cb) override; | 221 void Seek(base::TimeDelta time, const PipelineStatusCB& cb) override; |
| 218 base::Time GetTimelineOffset() const override; | 222 base::Time GetTimelineOffset() const override; |
| 219 DemuxerStream* GetStream(DemuxerStream::Type type) override; | 223 DemuxerStream* GetStream(DemuxerStream::Type type) override; |
| 220 base::TimeDelta GetStartTime() const override; | 224 base::TimeDelta GetStartTime() const override; |
| 221 int64_t GetMemoryUsage() const override; | 225 int64_t GetMemoryUsage() const override; |
| 222 | 226 |
| 223 // Calls |encrypted_media_init_data_cb_| with the initialization data | 227 // Calls |encrypted_media_init_data_cb_| with the initialization data |
| (...skipping 19 matching lines...) Expand all Loading... |
| 243 | 247 |
| 244 private: | 248 private: |
| 245 // To allow tests access to privates. | 249 // To allow tests access to privates. |
| 246 friend class FFmpegDemuxerTest; | 250 friend class FFmpegDemuxerTest; |
| 247 | 251 |
| 248 // FFmpeg callbacks during initialization. | 252 // FFmpeg callbacks during initialization. |
| 249 void OnOpenContextDone(const PipelineStatusCB& status_cb, bool result); | 253 void OnOpenContextDone(const PipelineStatusCB& status_cb, bool result); |
| 250 void OnFindStreamInfoDone(const PipelineStatusCB& status_cb, int result); | 254 void OnFindStreamInfoDone(const PipelineStatusCB& status_cb, int result); |
| 251 | 255 |
| 252 // FFmpeg callbacks during seeking. | 256 // FFmpeg callbacks during seeking. |
| 253 void OnSeekFrameDone(const PipelineStatusCB& cb, int result); | 257 void OnSeekFrameDone(int result); |
| 254 | 258 |
| 255 // FFmpeg callbacks during reading + helper method to initiate reads. | 259 // FFmpeg callbacks during reading + helper method to initiate reads. |
| 256 void ReadFrameIfNeeded(); | 260 void ReadFrameIfNeeded(); |
| 257 void OnReadFrameDone(ScopedAVPacket packet, int result); | 261 void OnReadFrameDone(ScopedAVPacket packet, int result); |
| 258 | 262 |
| 259 // Returns true iff any stream has additional capacity. Note that streams can | 263 // Returns true iff any stream has additional capacity. Note that streams can |
| 260 // go over capacity depending on how the file is muxed. | 264 // go over capacity depending on how the file is muxed. |
| 261 bool StreamsHaveAvailableCapacity(); | 265 bool StreamsHaveAvailableCapacity(); |
| 262 | 266 |
| 263 // Returns true if the maximum allowed memory usage has been reached. | 267 // Returns true if the maximum allowed memory usage has been reached. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 287 base::Thread blocking_thread_; | 291 base::Thread blocking_thread_; |
| 288 | 292 |
| 289 // Tracks if there's an outstanding av_read_frame() operation. | 293 // Tracks if there's an outstanding av_read_frame() operation. |
| 290 // | 294 // |
| 291 // TODO(scherkus): Allow more than one read in flight for higher read | 295 // TODO(scherkus): Allow more than one read in flight for higher read |
| 292 // throughput using demuxer_bench to verify improvements. | 296 // throughput using demuxer_bench to verify improvements. |
| 293 bool pending_read_; | 297 bool pending_read_; |
| 294 | 298 |
| 295 // Tracks if there's an outstanding av_seek_frame() operation. Used to discard | 299 // Tracks if there's an outstanding av_seek_frame() operation. Used to discard |
| 296 // results of pre-seek av_read_frame() operations. | 300 // results of pre-seek av_read_frame() operations. |
| 297 bool pending_seek_; | 301 PipelineStatusCB pending_seek_cb_; |
| 298 | 302 |
| 299 // |streams_| mirrors the AVStream array in AVFormatContext. It contains | 303 // |streams_| mirrors the AVStream array in AVFormatContext. It contains |
| 300 // FFmpegDemuxerStreams encapsluating AVStream objects at the same index. | 304 // FFmpegDemuxerStreams encapsluating AVStream objects at the same index. |
| 301 // | 305 // |
| 302 // Since we only support a single audio and video stream, |streams_| will | 306 // Since we only support a single audio and video stream, |streams_| will |
| 303 // contain NULL entries for additional audio/video streams as well as for | 307 // contain NULL entries for additional audio/video streams as well as for |
| 304 // stream types that we do not currently support. | 308 // stream types that we do not currently support. |
| 305 // | 309 // |
| 306 // Once initialized, operations on FFmpegDemuxerStreams should be carried out | 310 // Once initialized, operations on FFmpegDemuxerStreams should be carried out |
| 307 // on the demuxer thread. | 311 // on the demuxer thread. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 | 355 |
| 352 // NOTE: Weak pointers must be invalidated before all other member variables. | 356 // NOTE: Weak pointers must be invalidated before all other member variables. |
| 353 base::WeakPtrFactory<FFmpegDemuxer> weak_factory_; | 357 base::WeakPtrFactory<FFmpegDemuxer> weak_factory_; |
| 354 | 358 |
| 355 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxer); | 359 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxer); |
| 356 }; | 360 }; |
| 357 | 361 |
| 358 } // namespace media | 362 } // namespace media |
| 359 | 363 |
| 360 #endif // MEDIA_FILTERS_FFMPEG_DEMUXER_H_ | 364 #endif // MEDIA_FILTERS_FFMPEG_DEMUXER_H_ |
| OLD | NEW |