OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/formats/webm/webm_stream_parser.h" | 5 #include "media/formats/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/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
237 | 237 |
238 return bytes_parsed; | 238 return bytes_parsed; |
239 } | 239 } |
240 | 240 |
241 int WebMStreamParser::ParseCluster(const uint8* data, int size) { | 241 int WebMStreamParser::ParseCluster(const uint8* data, int size) { |
242 if (!cluster_parser_) | 242 if (!cluster_parser_) |
243 return -1; | 243 return -1; |
244 | 244 |
245 int id; | 245 int id; |
246 int64 element_size; | 246 int64 element_size; |
247 int result = WebMParseElementHeader(data, size, &id, &element_size); | 247 int bytes_parsed = WebMParseElementHeader(data, size, &id, &element_size); |
248 | 248 |
249 if (result <= 0) | 249 if (bytes_parsed <= 0) |
250 return result; | 250 return bytes_parsed; |
251 | 251 |
252 // TODO(matthewjheaney): implement support for chapters | 252 // TODO(matthewjheaney): implement support for chapters |
253 if (id == kWebMIdCues || id == kWebMIdChapters) { | 253 if (id == kWebMIdCues || id == kWebMIdChapters) { |
254 // TODO(wolenetz): Handle unknown-sized cluster parse completion correctly. | 254 // TODO(wolenetz): Handle unknown-sized cluster parse completion correctly. |
255 // See http://crbug.com/335676. | 255 // See http://crbug.com/335676. |
256 if (size < (result + element_size)) { | 256 if (size < (bytes_parsed + element_size)) { |
257 // We don't have the whole element yet. Signal we need more data. | 257 // We don't have the whole element yet. Signal we need more data. |
258 return 0; | 258 return 0; |
259 } | 259 } |
260 // Skip the element. | 260 // Skip the element. |
261 return result + element_size; | 261 return bytes_parsed + element_size; |
262 } | 262 } |
263 | 263 |
264 if (id == kWebMIdEBMLHeader) { | 264 if (id == kWebMIdEBMLHeader) { |
265 // TODO(wolenetz): Handle unknown-sized cluster parse completion correctly. | 265 // TODO(wolenetz): Handle unknown-sized cluster parse completion correctly. |
266 // See http://crbug.com/335676. | 266 // See http://crbug.com/335676. |
267 ChangeState(kParsingHeaders); | 267 ChangeState(kParsingHeaders); |
268 return 0; | 268 return 0; |
269 } | 269 } |
270 | 270 |
271 int bytes_parsed = cluster_parser_->Parse(data, size); | 271 int result = 0; |
272 bool cluster_ended; | |
273 do { | |
274 bytes_parsed = cluster_parser_->Parse(data, size); | |
272 | 275 |
273 if (bytes_parsed <= 0) | 276 if (bytes_parsed < 0) |
274 return bytes_parsed; | 277 return bytes_parsed; |
275 | 278 |
276 // If cluster detected, immediately notify new segment if we have not already | 279 // If cluster detected, immediately notify new segment if we have not |
277 // done this. | 280 // already done this. |
278 if (id == kWebMIdCluster && !parsing_cluster_) { | 281 if (id == kWebMIdCluster && !parsing_cluster_) { |
279 parsing_cluster_ = true; | 282 parsing_cluster_ = true; |
280 new_segment_cb_.Run(); | 283 new_segment_cb_.Run(); |
281 } | 284 } |
282 | 285 |
283 const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers(); | 286 const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers(); |
284 const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers(); | 287 const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers(); |
285 const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers(); | 288 const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers(); |
286 | 289 |
287 bool cluster_ended = cluster_parser_->cluster_ended(); | 290 cluster_ended = cluster_parser_->cluster_ended(); |
288 | 291 |
289 if ((!audio_buffers.empty() || !video_buffers.empty() || !text_map.empty()) && | 292 if ((!audio_buffers.empty() || !video_buffers.empty() || |
290 !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) { | 293 !text_map.empty()) && |
291 return -1; | 294 !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) { |
292 } | 295 return -1; |
296 } | |
293 | 297 |
294 if (cluster_ended) { | 298 if (cluster_ended) { |
295 parsing_cluster_ = false; | 299 parsing_cluster_ = false; |
296 end_of_segment_cb_.Run(); | 300 end_of_segment_cb_.Run(); |
297 } | 301 } |
298 | 302 |
299 return bytes_parsed; | 303 result += bytes_parsed; |
304 data += bytes_parsed; | |
305 size -= bytes_parsed; | |
306 | |
307 // WebMClusterParser returns 0 if |data| starts with a beginning of a new | |
308 // cluster. Try parsing again in that case. | |
309 } while (bytes_parsed > 0 || cluster_ended); | |
wolenetz
2014/06/12 21:32:48
This looks wrong. Yes, in the case of a new append
Sergey Ulanov
2014/06/13 00:26:08
Done.
| |
310 | |
311 return result; | |
300 } | 312 } |
301 | 313 |
302 void WebMStreamParser::FireNeedKey(const std::string& key_id) { | 314 void WebMStreamParser::FireNeedKey(const std::string& key_id) { |
303 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); | 315 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); |
304 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); | 316 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); |
305 } | 317 } |
306 | 318 |
307 } // namespace media | 319 } // namespace media |
OLD | NEW |