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

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/12) 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),
23 waiting_for_buffers_(false) { 22 waiting_for_buffers_(false) {
24 } 23 }
25 24
26 WebMStreamParser::~WebMStreamParser() { 25 WebMStreamParser::~WebMStreamParser() {
27 STLDeleteValues(&text_track_map_);
28 } 26 }
29 27
30 void WebMStreamParser::Init(const InitCB& init_cb, 28 void WebMStreamParser::Init(const InitCB& init_cb,
31 const NewConfigCB& config_cb, 29 const NewConfigCB& config_cb,
32 const NewBuffersCB& new_buffers_cb, 30 const NewBuffersCB& new_buffers_cb,
33 const NewTextBuffersCB& text_cb, 31 const NewTextBuffersCB& text_cb,
34 const NeedKeyCB& need_key_cb, 32 const NeedKeyCB& need_key_cb,
35 const AddTextTrackCB& add_text_track_cb, 33 const NewTextTrackCB& new_text_track_cb,
36 const NewMediaSegmentCB& new_segment_cb, 34 const NewMediaSegmentCB& new_segment_cb,
37 const base::Closure& end_of_segment_cb, 35 const base::Closure& end_of_segment_cb,
38 const LogCB& log_cb) { 36 const LogCB& log_cb) {
39 DCHECK_EQ(state_, kWaitingForInit); 37 DCHECK_EQ(state_, kWaitingForInit);
40 DCHECK(init_cb_.is_null()); 38 DCHECK(init_cb_.is_null());
41 DCHECK(!init_cb.is_null()); 39 DCHECK(!init_cb.is_null());
42 DCHECK(!config_cb.is_null()); 40 DCHECK(!config_cb.is_null());
43 DCHECK(!new_buffers_cb.is_null()); 41 DCHECK(!new_buffers_cb.is_null());
44 DCHECK(!text_cb.is_null()); 42 DCHECK(!text_cb.is_null());
45 DCHECK(!need_key_cb.is_null()); 43 DCHECK(!need_key_cb.is_null());
46 DCHECK(!new_segment_cb.is_null()); 44 DCHECK(!new_segment_cb.is_null());
47 DCHECK(!end_of_segment_cb.is_null()); 45 DCHECK(!end_of_segment_cb.is_null());
48 46
49 ChangeState(kParsingHeaders); 47 ChangeState(kParsingHeaders);
50 init_cb_ = init_cb; 48 init_cb_ = init_cb;
51 config_cb_ = config_cb; 49 config_cb_ = config_cb;
52 new_buffers_cb_ = new_buffers_cb; 50 new_buffers_cb_ = new_buffers_cb;
53 text_cb_ = text_cb; 51 text_cb_ = text_cb;
54 need_key_cb_ = need_key_cb; 52 need_key_cb_ = need_key_cb;
55 add_text_track_cb_ = add_text_track_cb; 53 new_text_track_cb_ = new_text_track_cb;
56 new_segment_cb_ = new_segment_cb; 54 new_segment_cb_ = new_segment_cb;
57 end_of_segment_cb_ = end_of_segment_cb; 55 end_of_segment_cb_ = end_of_segment_cb;
58 log_cb_ = log_cb; 56 log_cb_ = log_cb;
59 } 57 }
60 58
61 void WebMStreamParser::Flush() { 59 void WebMStreamParser::Flush() {
62 DCHECK_NE(state_, kWaitingForInit); 60 DCHECK_NE(state_, kWaitingForInit);
63 61
64 byte_queue_.Reset(); 62 byte_queue_.Reset();
65 63
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 WebMInfoParser info_parser; 166 WebMInfoParser info_parser;
169 result = info_parser.Parse(cur, cur_size); 167 result = info_parser.Parse(cur, cur_size);
170 168
171 if (result <= 0) 169 if (result <= 0)
172 return result; 170 return result;
173 171
174 cur += result; 172 cur += result;
175 cur_size -= result; 173 cur_size -= result;
176 bytes_parsed += result; 174 bytes_parsed += result;
177 175
178 WebMTracksParser tracks_parser(log_cb_, add_text_track_cb_.is_null()); 176 WebMTracksParser tracks_parser(log_cb_, new_text_track_cb_.is_null());
179 result = tracks_parser.Parse(cur, cur_size); 177 result = tracks_parser.Parse(cur, cur_size);
180 178
181 if (result <= 0) 179 if (result <= 0)
182 return result; 180 return result;
183 181
184 bytes_parsed += result; 182 bytes_parsed += result;
185 183
186 base::TimeDelta duration = kInfiniteDuration(); 184 base::TimeDelta duration = kInfiniteDuration();
187 185
188 if (info_parser.duration() > 0) { 186 if (info_parser.duration() > 0) {
(...skipping 16 matching lines...) Expand all
205 } 203 }
206 204
207 typedef WebMTracksParser::TextTracks TextTracks; 205 typedef WebMTracksParser::TextTracks TextTracks;
208 const TextTracks& text_tracks = tracks_parser.text_tracks(); 206 const TextTracks& text_tracks = tracks_parser.text_tracks();
209 207
210 for (TextTracks::const_iterator itr = text_tracks.begin(); 208 for (TextTracks::const_iterator itr = text_tracks.begin();
211 itr != text_tracks.end(); ++itr) { 209 itr != text_tracks.end(); ++itr) {
212 const WebMTracksParser::TextTrackInfo& text_track_info = itr->second; 210 const WebMTracksParser::TextTrackInfo& text_track_info = itr->second;
213 211
214 // TODO(matthewjheaney): verify that WebVTT uses ISO 639-2 for lang 212 // TODO(matthewjheaney): verify that WebVTT uses ISO 639-2 for lang
215 scoped_ptr<TextTrack> text_track = 213 new_text_track_cb_.Run(itr->first,
216 add_text_track_cb_.Run(text_track_info.kind, 214 text_track_info.kind,
217 text_track_info.name, 215 text_track_info.name,
218 text_track_info.language); 216 text_track_info.language);
219
220 // Assume ownership of pointer, and cache the text track object, for use
221 // later when we have text track buffers. (The text track objects are
222 // deallocated in the dtor for this class.)
223
224 if (text_track)
225 text_track_map_.insert(std::make_pair(itr->first, text_track.release()));
226 } 217 }
227 218
228 cluster_parser_.reset(new WebMClusterParser( 219 cluster_parser_.reset(new WebMClusterParser(
229 info_parser.timecode_scale(), 220 info_parser.timecode_scale(),
230 tracks_parser.audio_track_num(), 221 tracks_parser.audio_track_num(),
231 tracks_parser.video_track_num(), 222 tracks_parser.video_track_num(),
232 text_tracks, 223 text_tracks,
233 tracks_parser.ignored_tracks(), 224 tracks_parser.ignored_tracks(),
234 tracks_parser.audio_encryption_key_id(), 225 tracks_parser.audio_encryption_key_id(),
235 tracks_parser.video_encryption_key_id(), 226 tracks_parser.video_encryption_key_id(),
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 return -1; 285 return -1;
295 } 286 }
296 287
297 WebMClusterParser::TextTrackIterator text_track_iter = 288 WebMClusterParser::TextTrackIterator text_track_iter =
298 cluster_parser_->CreateTextTrackIterator(); 289 cluster_parser_->CreateTextTrackIterator();
299 290
300 int text_track_num; 291 int text_track_num;
301 const BufferQueue* text_buffers; 292 const BufferQueue* text_buffers;
302 293
303 while (text_track_iter(&text_track_num, &text_buffers)) { 294 while (text_track_iter(&text_track_num, &text_buffers)) {
304 TextTrackMap::iterator find_result = text_track_map_.find(text_track_num); 295 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; 296 return -1;
313 } 297 }
314 298
315 if (cluster_ended) 299 if (cluster_ended)
316 end_of_segment_cb_.Run(); 300 end_of_segment_cb_.Run();
317 301
318 return bytes_parsed; 302 return bytes_parsed;
319 } 303 }
320 304
321 void WebMStreamParser::FireNeedKey(const std::string& key_id) { 305 void WebMStreamParser::FireNeedKey(const std::string& key_id) {
322 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); 306 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end());
323 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); 307 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector);
324 } 308 }
325 309
326 } // namespace media 310 } // namespace media
OLDNEW
« media/filters/pipeline_integration_test_base.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