Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: media/filters/ffmpeg_demuxer.h

Issue 23702007: Render inband text tracks in the media pipeline (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporate aaron's comments (10/16) Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 16 matching lines...) Expand all
27 27
28 #include "base/callback.h" 28 #include "base/callback.h"
29 #include "base/gtest_prod_util.h" 29 #include "base/gtest_prod_util.h"
30 #include "base/memory/scoped_vector.h" 30 #include "base/memory/scoped_vector.h"
31 #include "base/threading/thread.h" 31 #include "base/threading/thread.h"
32 #include "media/base/audio_decoder_config.h" 32 #include "media/base/audio_decoder_config.h"
33 #include "media/base/decoder_buffer.h" 33 #include "media/base/decoder_buffer.h"
34 #include "media/base/decoder_buffer_queue.h" 34 #include "media/base/decoder_buffer_queue.h"
35 #include "media/base/demuxer.h" 35 #include "media/base/demuxer.h"
36 #include "media/base/pipeline.h" 36 #include "media/base/pipeline.h"
37 #include "media/base/text_track.h"
37 #include "media/base/video_decoder_config.h" 38 #include "media/base/video_decoder_config.h"
38 #include "media/filters/blocking_url_protocol.h" 39 #include "media/filters/blocking_url_protocol.h"
39 40
40 // FFmpeg forward declarations. 41 // FFmpeg forward declarations.
41 struct AVPacket; 42 struct AVPacket;
42 struct AVRational; 43 struct AVRational;
43 struct AVStream; 44 struct AVStream;
44 45
45 namespace media { 46 namespace media {
46 47
(...skipping 28 matching lines...) Expand all
75 76
76 // Returns the duration of this stream. 77 // Returns the duration of this stream.
77 base::TimeDelta duration(); 78 base::TimeDelta duration();
78 79
79 // DemuxerStream implementation. 80 // DemuxerStream implementation.
80 virtual Type type() OVERRIDE; 81 virtual Type type() OVERRIDE;
81 virtual void Read(const ReadCB& read_cb) OVERRIDE; 82 virtual void Read(const ReadCB& read_cb) OVERRIDE;
82 virtual void EnableBitstreamConverter() OVERRIDE; 83 virtual void EnableBitstreamConverter() OVERRIDE;
83 virtual AudioDecoderConfig audio_decoder_config() OVERRIDE; 84 virtual AudioDecoderConfig audio_decoder_config() OVERRIDE;
84 virtual VideoDecoderConfig video_decoder_config() OVERRIDE; 85 virtual VideoDecoderConfig video_decoder_config() OVERRIDE;
86 virtual TextTrackConfig text_track_config() OVERRIDE;
85 87
86 // Returns the range of buffered data in this stream. 88 // Returns the range of buffered data in this stream.
87 Ranges<base::TimeDelta> GetBufferedRanges() const; 89 Ranges<base::TimeDelta> GetBufferedRanges() const;
88 90
89 // Returns elapsed time based on the already queued packets. 91 // Returns elapsed time based on the already queued packets.
90 // Used to determine stream duration when it's not known ahead of time. 92 // Used to determine stream duration when it's not known ahead of time.
91 base::TimeDelta GetElapsedTime() const; 93 base::TimeDelta GetElapsedTime() const;
92 94
93 // Returns true if this stream has capacity for additional data. 95 // Returns true if this stream has capacity for additional data.
94 bool HasAvailableCapacity(); 96 bool HasAvailableCapacity();
95 97
98 TextKind GetTextKind() const;
99
100 // Returns the value associated with |key| in the metadata for the avstream.
101 // Returns an empty string if the key is not present.
102 std::string GetMetadata(const char* key) const;
103
96 private: 104 private:
97 friend class FFmpegDemuxerTest; 105 friend class FFmpegDemuxerTest;
98 106
99 // Runs |read_cb_| if present with the front of |buffer_queue_|, calling 107 // Runs |read_cb_| if present with the front of |buffer_queue_|, calling
100 // NotifyCapacityAvailable() if capacity is still available. 108 // NotifyCapacityAvailable() if capacity is still available.
101 void SatisfyPendingRead(); 109 void SatisfyPendingRead();
102 110
103 // Converts an FFmpeg stream timestamp into a base::TimeDelta. 111 // Converts an FFmpeg stream timestamp into a base::TimeDelta.
104 static base::TimeDelta ConvertStreamTimestamp(const AVRational& time_base, 112 static base::TimeDelta ConvertStreamTimestamp(const AVRational& time_base,
105 int64 timestamp); 113 int64 timestamp);
(...skipping 18 matching lines...) Expand all
124 std::string encryption_key_id_; 132 std::string encryption_key_id_;
125 133
126 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerStream); 134 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerStream);
127 }; 135 };
128 136
129 class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { 137 class MEDIA_EXPORT FFmpegDemuxer : public Demuxer {
130 public: 138 public:
131 FFmpegDemuxer(const scoped_refptr<base::MessageLoopProxy>& message_loop, 139 FFmpegDemuxer(const scoped_refptr<base::MessageLoopProxy>& message_loop,
132 DataSource* data_source, 140 DataSource* data_source,
133 const NeedKeyCB& need_key_cb, 141 const NeedKeyCB& need_key_cb,
142 bool enable_text,
134 const scoped_refptr<MediaLog>& media_log); 143 const scoped_refptr<MediaLog>& media_log);
135 virtual ~FFmpegDemuxer(); 144 virtual ~FFmpegDemuxer();
136 145
137 // Demuxer implementation. 146 // Demuxer implementation.
138 virtual void Initialize(DemuxerHost* host, 147 virtual void Initialize(DemuxerHost* host,
139 const PipelineStatusCB& status_cb) OVERRIDE; 148 const PipelineStatusCB& status_cb) OVERRIDE;
140 virtual void Stop(const base::Closure& callback) OVERRIDE; 149 virtual void Stop(const base::Closure& callback) OVERRIDE;
141 virtual void Seek(base::TimeDelta time, const PipelineStatusCB& cb) OVERRIDE; 150 virtual void Seek(base::TimeDelta time, const PipelineStatusCB& cb) OVERRIDE;
142 virtual void OnAudioRendererDisabled() OVERRIDE; 151 virtual void OnAudioRendererDisabled() OVERRIDE;
143 virtual DemuxerStream* GetStream(DemuxerStream::Type type) OVERRIDE; 152 virtual DemuxerStream* GetStream(DemuxerStream::Type type) OVERRIDE;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 // Signal all FFmpegDemuxerStreams that the stream has ended. 186 // Signal all FFmpegDemuxerStreams that the stream has ended.
178 void StreamHasEnded(); 187 void StreamHasEnded();
179 188
180 // Called by |url_protocol_| whenever |data_source_| returns a read error. 189 // Called by |url_protocol_| whenever |data_source_| returns a read error.
181 void OnDataSourceError(); 190 void OnDataSourceError();
182 191
183 // Returns the stream from |streams_| that matches |type| as an 192 // Returns the stream from |streams_| that matches |type| as an
184 // FFmpegDemuxerStream. 193 // FFmpegDemuxerStream.
185 FFmpegDemuxerStream* GetFFmpegStream(DemuxerStream::Type type) const; 194 FFmpegDemuxerStream* GetFFmpegStream(DemuxerStream::Type type) const;
186 195
196 // Called after the streams have been collected from the media, to allow
197 // the text renderer to bind each text stream to the cue rendering engine.
198 void AddTextStreams();
199
187 DemuxerHost* host_; 200 DemuxerHost* host_;
188 201
189 scoped_refptr<base::MessageLoopProxy> message_loop_; 202 scoped_refptr<base::MessageLoopProxy> message_loop_;
190 base::WeakPtrFactory<FFmpegDemuxer> weak_factory_; 203 base::WeakPtrFactory<FFmpegDemuxer> weak_factory_;
191 base::WeakPtr<FFmpegDemuxer> weak_this_; 204 base::WeakPtr<FFmpegDemuxer> weak_this_;
192 205
193 // Thread on which all blocking FFmpeg operations are executed. 206 // Thread on which all blocking FFmpeg operations are executed.
194 base::Thread blocking_thread_; 207 base::Thread blocking_thread_;
195 208
196 // Tracks if there's an outstanding av_read_frame() operation. 209 // Tracks if there's an outstanding av_read_frame() operation.
(...skipping 29 matching lines...) Expand all
226 239
227 // The first timestamp of the opened media file. This is used to set the 240 // The first timestamp of the opened media file. This is used to set the
228 // starting clock value to match the timestamps in the media file. Default 241 // starting clock value to match the timestamps in the media file. Default
229 // is 0. 242 // is 0.
230 base::TimeDelta start_time_; 243 base::TimeDelta start_time_;
231 244
232 // Whether audio has been disabled for this demuxer (in which case this class 245 // Whether audio has been disabled for this demuxer (in which case this class
233 // drops packets destined for AUDIO demuxer streams on the floor). 246 // drops packets destined for AUDIO demuxer streams on the floor).
234 bool audio_disabled_; 247 bool audio_disabled_;
235 248
249 // Whether text streams have been enabled for this demuxer.
250 bool text_enabled_;
251
236 // Set if we know duration of the audio stream. Used when processing end of 252 // Set if we know duration of the audio stream. Used when processing end of
237 // stream -- at this moment we definitely know duration. 253 // stream -- at this moment we definitely know duration.
238 bool duration_known_; 254 bool duration_known_;
239 255
240 // FFmpegURLProtocol implementation and corresponding glue bits. 256 // FFmpegURLProtocol implementation and corresponding glue bits.
241 BlockingUrlProtocol url_protocol_; 257 BlockingUrlProtocol url_protocol_;
242 scoped_ptr<FFmpegGlue> glue_; 258 scoped_ptr<FFmpegGlue> glue_;
243 259
244 const NeedKeyCB need_key_cb_; 260 const NeedKeyCB need_key_cb_;
245 261
246 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxer); 262 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxer);
247 }; 263 };
248 264
249 } // namespace media 265 } // namespace media
250 266
251 #endif // MEDIA_FILTERS_FFMPEG_DEMUXER_H_ 267 #endif // MEDIA_FILTERS_FFMPEG_DEMUXER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698