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

Side by Side Diff: media/webm/webm_stream_parser.cc

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/22) 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 #include "media/webm/webm_stream_parser.h" 5 #include "media/webm/webm_stream_parser.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/stl_util.h"
12 #include "media/webm/webm_cluster_parser.h" 11 #include "media/webm/webm_cluster_parser.h"
13 #include "media/webm/webm_constants.h" 12 #include "media/webm/webm_constants.h"
14 #include "media/webm/webm_content_encodings.h" 13 #include "media/webm/webm_content_encodings.h"
15 #include "media/webm/webm_crypto_helpers.h" 14 #include "media/webm/webm_crypto_helpers.h"
16 #include "media/webm/webm_info_parser.h" 15 #include "media/webm/webm_info_parser.h"
17 #include "media/webm/webm_tracks_parser.h" 16 #include "media/webm/webm_tracks_parser.h"
18 17
19 namespace media { 18 namespace media {
20 19
21 WebMStreamParser::WebMStreamParser() 20 WebMStreamParser::WebMStreamParser()
22 : state_(kWaitingForInit), 21 : state_(kWaitingForInit),
22 enable_text_tracks_(false),
23 waiting_for_buffers_(false) { 23 waiting_for_buffers_(false) {
24 } 24 }
25 25
26 WebMStreamParser::~WebMStreamParser() { 26 WebMStreamParser::~WebMStreamParser() {
27 STLDeleteValues(&text_track_map_);
28 } 27 }
29 28
30 void WebMStreamParser::Init(const InitCB& init_cb, 29 void WebMStreamParser::Init(const InitCB& init_cb,
31 const NewConfigCB& config_cb, 30 const NewConfigCB& config_cb,
32 const NewBuffersCB& new_buffers_cb, 31 const NewBuffersCB& new_buffers_cb,
33 const NewTextBuffersCB& text_cb, 32 const NewTextBuffersCB& text_cb,
34 const NeedKeyCB& need_key_cb, 33 const NeedKeyCB& need_key_cb,
35 const AddTextTrackCB& add_text_track_cb, 34 bool enable_text_tracks,
36 const NewMediaSegmentCB& new_segment_cb, 35 const NewMediaSegmentCB& new_segment_cb,
37 const base::Closure& end_of_segment_cb, 36 const base::Closure& end_of_segment_cb,
38 const LogCB& log_cb) { 37 const LogCB& log_cb) {
39 DCHECK_EQ(state_, kWaitingForInit); 38 DCHECK_EQ(state_, kWaitingForInit);
40 DCHECK(init_cb_.is_null()); 39 DCHECK(init_cb_.is_null());
41 DCHECK(!init_cb.is_null()); 40 DCHECK(!init_cb.is_null());
42 DCHECK(!config_cb.is_null()); 41 DCHECK(!config_cb.is_null());
43 DCHECK(!new_buffers_cb.is_null()); 42 DCHECK(!new_buffers_cb.is_null());
44 DCHECK(!text_cb.is_null()); 43 DCHECK(!text_cb.is_null());
45 DCHECK(!need_key_cb.is_null()); 44 DCHECK(!need_key_cb.is_null());
46 DCHECK(!new_segment_cb.is_null()); 45 DCHECK(!new_segment_cb.is_null());
47 DCHECK(!end_of_segment_cb.is_null()); 46 DCHECK(!end_of_segment_cb.is_null());
48 47
49 ChangeState(kParsingHeaders); 48 ChangeState(kParsingHeaders);
50 init_cb_ = init_cb; 49 init_cb_ = init_cb;
51 config_cb_ = config_cb; 50 config_cb_ = config_cb;
52 new_buffers_cb_ = new_buffers_cb; 51 new_buffers_cb_ = new_buffers_cb;
53 text_cb_ = text_cb; 52 text_cb_ = text_cb;
54 need_key_cb_ = need_key_cb; 53 need_key_cb_ = need_key_cb;
55 add_text_track_cb_ = add_text_track_cb; 54 enable_text_tracks_ = enable_text_tracks;
56 new_segment_cb_ = new_segment_cb; 55 new_segment_cb_ = new_segment_cb;
57 end_of_segment_cb_ = end_of_segment_cb; 56 end_of_segment_cb_ = end_of_segment_cb;
58 log_cb_ = log_cb; 57 log_cb_ = log_cb;
59 } 58 }
60 59
61 void WebMStreamParser::Flush() { 60 void WebMStreamParser::Flush() {
62 DCHECK_NE(state_, kWaitingForInit); 61 DCHECK_NE(state_, kWaitingForInit);
63 62
64 byte_queue_.Reset(); 63 byte_queue_.Reset();
65 64
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 WebMInfoParser info_parser; 167 WebMInfoParser info_parser;
169 result = info_parser.Parse(cur, cur_size); 168 result = info_parser.Parse(cur, cur_size);
170 169
171 if (result <= 0) 170 if (result <= 0)
172 return result; 171 return result;
173 172
174 cur += result; 173 cur += result;
175 cur_size -= result; 174 cur_size -= result;
176 bytes_parsed += result; 175 bytes_parsed += result;
177 176
178 WebMTracksParser tracks_parser(log_cb_, add_text_track_cb_.is_null()); 177 WebMTracksParser tracks_parser(log_cb_, !enable_text_tracks_);
179 result = tracks_parser.Parse(cur, cur_size); 178 result = tracks_parser.Parse(cur, cur_size);
180 179
181 if (result <= 0) 180 if (result <= 0)
182 return result; 181 return result;
183 182
184 bytes_parsed += result; 183 bytes_parsed += result;
185 184
186 base::TimeDelta duration = kInfiniteDuration(); 185 base::TimeDelta duration = kInfiniteDuration();
187 186
188 if (info_parser.duration() > 0) { 187 if (info_parser.duration() > 0) {
189 double mult = info_parser.timecode_scale() / 1000.0; 188 double mult = info_parser.timecode_scale() / 1000.0;
190 int64 duration_in_us = info_parser.duration() * mult; 189 int64 duration_in_us = info_parser.duration() * mult;
191 duration = base::TimeDelta::FromMicroseconds(duration_in_us); 190 duration = base::TimeDelta::FromMicroseconds(duration_in_us);
192 } 191 }
193 192
194 const AudioDecoderConfig& audio_config = tracks_parser.audio_decoder_config(); 193 const AudioDecoderConfig& audio_config = tracks_parser.audio_decoder_config();
195 if (audio_config.is_encrypted()) 194 if (audio_config.is_encrypted())
196 FireNeedKey(tracks_parser.audio_encryption_key_id()); 195 FireNeedKey(tracks_parser.audio_encryption_key_id());
197 196
198 const VideoDecoderConfig& video_config = tracks_parser.video_decoder_config(); 197 const VideoDecoderConfig& video_config = tracks_parser.video_decoder_config();
199 if (video_config.is_encrypted()) 198 if (video_config.is_encrypted())
200 FireNeedKey(tracks_parser.video_encryption_key_id()); 199 FireNeedKey(tracks_parser.video_encryption_key_id());
201 200
202 if (!config_cb_.Run(audio_config, video_config)) { 201 TextTrackConfigMap text_track_config_map;
203 DVLOG(1) << "New config data isn't allowed.";
204 return -1;
205 }
206 202
207 typedef WebMTracksParser::TextTracks TextTracks; 203 typedef WebMTracksParser::TextTracks TextTracks;
208 const TextTracks& text_tracks = tracks_parser.text_tracks(); 204 const TextTracks& text_tracks = tracks_parser.text_tracks();
209 205
210 for (TextTracks::const_iterator itr = text_tracks.begin(); 206 for (TextTracks::const_iterator itr = text_tracks.begin();
211 itr != text_tracks.end(); ++itr) { 207 itr != text_tracks.end(); ++itr) {
212 const WebMTracksParser::TextTrackInfo& text_track_info = itr->second; 208 const WebMTracksParser::TextTrackInfo& text_track_info = itr->second;
213 209
214 // TODO(matthewjheaney): verify that WebVTT uses ISO 639-2 for lang 210 // TODO(matthewjheaney): verify that WebVTT uses ISO 639-2 for lang
215 scoped_ptr<TextTrack> text_track =
216 add_text_track_cb_.Run(text_track_info.kind,
217 text_track_info.name,
218 text_track_info.language);
219 211
220 // Assume ownership of pointer, and cache the text track object, for use 212 text_track_config_map.insert(
221 // later when we have text track buffers. (The text track objects are 213 std::make_pair(itr->first,
222 // deallocated in the dtor for this class.) 214 TextTrackConfig(text_track_info.kind,
215 text_track_info.name,
216 text_track_info.language)));
217 }
223 218
224 if (text_track) 219 if (!config_cb_.Run(audio_config, video_config, text_track_config_map)) {
225 text_track_map_.insert(std::make_pair(itr->first, text_track.release())); 220 DVLOG(1) << "New config data isn't allowed.";
221 return -1;
226 } 222 }
227 223
228 cluster_parser_.reset(new WebMClusterParser( 224 cluster_parser_.reset(new WebMClusterParser(
229 info_parser.timecode_scale(), 225 info_parser.timecode_scale(),
230 tracks_parser.audio_track_num(), 226 tracks_parser.audio_track_num(),
231 tracks_parser.video_track_num(), 227 tracks_parser.video_track_num(),
232 text_tracks, 228 text_tracks,
233 tracks_parser.ignored_tracks(), 229 tracks_parser.ignored_tracks(),
234 tracks_parser.audio_encryption_key_id(), 230 tracks_parser.audio_encryption_key_id(),
235 tracks_parser.video_encryption_key_id(), 231 tracks_parser.video_encryption_key_id(),
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 return -1; 290 return -1;
295 } 291 }
296 292
297 WebMClusterParser::TextTrackIterator text_track_iter = 293 WebMClusterParser::TextTrackIterator text_track_iter =
298 cluster_parser_->CreateTextTrackIterator(); 294 cluster_parser_->CreateTextTrackIterator();
299 295
300 int text_track_num; 296 int text_track_num;
301 const BufferQueue* text_buffers; 297 const BufferQueue* text_buffers;
302 298
303 while (text_track_iter(&text_track_num, &text_buffers)) { 299 while (text_track_iter(&text_track_num, &text_buffers)) {
304 TextTrackMap::iterator find_result = text_track_map_.find(text_track_num); 300 if (!text_buffers->empty() && !text_cb_.Run(text_track_num, *text_buffers))
305
306 if (find_result == text_track_map_.end())
307 continue;
308
309 TextTrack* const text_track = find_result->second;
310
311 if (!text_buffers->empty() && !text_cb_.Run(text_track, *text_buffers))
312 return -1; 301 return -1;
313 } 302 }
314 303
315 if (cluster_ended) 304 if (cluster_ended)
316 end_of_segment_cb_.Run(); 305 end_of_segment_cb_.Run();
317 306
318 return bytes_parsed; 307 return bytes_parsed;
319 } 308 }
320 309
321 void WebMStreamParser::FireNeedKey(const std::string& key_id) { 310 void WebMStreamParser::FireNeedKey(const std::string& key_id) {
322 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); 311 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end());
323 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); 312 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector);
324 } 313 }
325 314
326 } // namespace media 315 } // namespace media
OLDNEW
« media/webm/webm_stream_parser.h ('K') | « media/webm/webm_stream_parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698