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

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

Issue 13419002: Media Source dispatches inband text tracks (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporated Frank's comments Created 7 years, 8 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"
(...skipping 11 matching lines...) Expand all
22 waiting_for_buffers_(false) { 22 waiting_for_buffers_(false) {
23 } 23 }
24 24
25 WebMStreamParser::~WebMStreamParser() {} 25 WebMStreamParser::~WebMStreamParser() {}
26 26
27 void WebMStreamParser::Init(const InitCB& init_cb, 27 void WebMStreamParser::Init(const InitCB& init_cb,
28 const NewConfigCB& config_cb, 28 const NewConfigCB& config_cb,
29 const NewBuffersCB& audio_cb, 29 const NewBuffersCB& audio_cb,
30 const NewBuffersCB& video_cb, 30 const NewBuffersCB& video_cb,
31 const NeedKeyCB& need_key_cb, 31 const NeedKeyCB& need_key_cb,
32 const TextTrackCB& text_track_cb,
33 const NewBuffersCB& text_cb,
32 const NewMediaSegmentCB& new_segment_cb, 34 const NewMediaSegmentCB& new_segment_cb,
33 const base::Closure& end_of_segment_cb, 35 const base::Closure& end_of_segment_cb,
34 const LogCB& log_cb) { 36 const LogCB& log_cb) {
35 DCHECK_EQ(state_, kWaitingForInit); 37 DCHECK_EQ(state_, kWaitingForInit);
36 DCHECK(init_cb_.is_null()); 38 DCHECK(init_cb_.is_null());
37 DCHECK(!init_cb.is_null()); 39 DCHECK(!init_cb.is_null());
38 DCHECK(!config_cb.is_null()); 40 DCHECK(!config_cb.is_null());
39 DCHECK(!audio_cb.is_null() || !video_cb.is_null()); 41 DCHECK(!audio_cb.is_null() || !video_cb.is_null());
40 DCHECK(!need_key_cb.is_null()); 42 DCHECK(!need_key_cb.is_null());
41 DCHECK(!new_segment_cb.is_null()); 43 DCHECK(!new_segment_cb.is_null());
42 DCHECK(!end_of_segment_cb.is_null()); 44 DCHECK(!end_of_segment_cb.is_null());
43 45
44 ChangeState(kParsingHeaders); 46 ChangeState(kParsingHeaders);
45 init_cb_ = init_cb; 47 init_cb_ = init_cb;
46 config_cb_ = config_cb; 48 config_cb_ = config_cb;
47 audio_cb_ = audio_cb; 49 audio_cb_ = audio_cb;
48 video_cb_ = video_cb; 50 video_cb_ = video_cb;
49 need_key_cb_ = need_key_cb; 51 need_key_cb_ = need_key_cb;
52 text_track_cb_ = text_track_cb;
53 text_cb_ = text_cb;
50 new_segment_cb_ = new_segment_cb; 54 new_segment_cb_ = new_segment_cb;
51 end_of_segment_cb_ = end_of_segment_cb; 55 end_of_segment_cb_ = end_of_segment_cb;
52 log_cb_ = log_cb; 56 log_cb_ = log_cb;
53 } 57 }
54 58
55 void WebMStreamParser::Flush() { 59 void WebMStreamParser::Flush() {
56 DCHECK_NE(state_, kWaitingForInit); 60 DCHECK_NE(state_, kWaitingForInit);
57 61
58 byte_queue_.Reset(); 62 byte_queue_.Reset();
59 63
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 195
192 const VideoDecoderConfig& video_config = tracks_parser.video_decoder_config(); 196 const VideoDecoderConfig& video_config = tracks_parser.video_decoder_config();
193 if (video_config.is_encrypted()) 197 if (video_config.is_encrypted())
194 FireNeedKey(tracks_parser.video_encryption_key_id()); 198 FireNeedKey(tracks_parser.video_encryption_key_id());
195 199
196 if (!config_cb_.Run(audio_config, video_config)) { 200 if (!config_cb_.Run(audio_config, video_config)) {
197 DVLOG(1) << "New config data isn't allowed."; 201 DVLOG(1) << "New config data isn't allowed.";
198 return -1; 202 return -1;
199 } 203 }
200 204
205 const std::set<int>& text_tracks = tracks_parser.text_tracks();
206
207 if (!text_tracks.empty()) {
208 // TODO(matthewjheaney): resolve cardinality, and track kind, name, lang
209 text_track_cb_.Run(kTextSubtitles, "", "");
acolwell GONE FROM CHROMIUM 2013/04/05 16:29:23 If text_track_cb_ returns a NewBuffersCB then you
Matthew Heaney (Chromium) 2013/05/09 03:53:11 OK, I implemented this roughly as you describe.
210 }
211
201 cluster_parser_.reset(new WebMClusterParser( 212 cluster_parser_.reset(new WebMClusterParser(
202 info_parser.timecode_scale(), 213 info_parser.timecode_scale(),
203 tracks_parser.audio_track_num(), 214 tracks_parser.audio_track_num(),
204 tracks_parser.video_track_num(), 215 tracks_parser.video_track_num(),
205 tracks_parser.text_tracks(), 216 tracks_parser.text_tracks(),
206 tracks_parser.ignored_tracks(), 217 tracks_parser.ignored_tracks(),
207 tracks_parser.audio_encryption_key_id(), 218 tracks_parser.audio_encryption_key_id(),
208 tracks_parser.video_encryption_key_id(), 219 tracks_parser.video_encryption_key_id(),
209 log_cb_)); 220 log_cb_));
210 221
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 new_segment_cb_.Run(cluster_start_time); 272 new_segment_cb_.Run(cluster_start_time);
262 waiting_for_buffers_ = false; 273 waiting_for_buffers_ = false;
263 } 274 }
264 275
265 if (!audio_buffers.empty() && !audio_cb_.Run(audio_buffers)) 276 if (!audio_buffers.empty() && !audio_cb_.Run(audio_buffers))
266 return -1; 277 return -1;
267 278
268 if (!video_buffers.empty() && !video_cb_.Run(video_buffers)) 279 if (!video_buffers.empty() && !video_cb_.Run(video_buffers))
269 return -1; 280 return -1;
270 281
282 WebMClusterParser::TextTrackIterator tt_iter =
283 cluster_parser_->CreateTextTrackIterator();
284
285 int tt_num;
286 const BufferQueue* tt_buffers;
287
288 // TODO(matthewjheaney): resolve cardinality
289 if (tt_iter(&tt_num, &tt_buffers)) {
290 if (!text_cb_.Run(*tt_buffers))
291 return -1;
292 }
293
271 if (cluster_ended) 294 if (cluster_ended)
272 end_of_segment_cb_.Run(); 295 end_of_segment_cb_.Run();
273 296
274 return bytes_parsed; 297 return bytes_parsed;
275 } 298 }
276 299
277 void WebMStreamParser::FireNeedKey(const std::string& key_id) { 300 void WebMStreamParser::FireNeedKey(const std::string& key_id) {
278 int key_id_size = key_id.size(); 301 int key_id_size = key_id.size();
279 DCHECK_GT(key_id_size, 0); 302 DCHECK_GT(key_id_size, 0);
280 scoped_array<uint8> key_id_array(new uint8[key_id_size]); 303 scoped_array<uint8> key_id_array(new uint8[key_id_size]);
281 memcpy(key_id_array.get(), key_id.data(), key_id_size); 304 memcpy(key_id_array.get(), key_id.data(), key_id_size);
282 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_array.Pass(), key_id_size); 305 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_array.Pass(), key_id_size);
283 } 306 }
284 307
285 } // namespace media 308 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698