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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "media/base/decrypt_config.h" | 9 #include "media/base/decrypt_config.h" |
10 #include "media/formats/webm/cluster_builder.h" | 10 #include "media/formats/webm/cluster_builder.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 struct BlockInfo { | 29 struct BlockInfo { |
30 int track_num; | 30 int track_num; |
31 int timestamp; | 31 int timestamp; |
32 int duration; | 32 int duration; |
33 bool use_simple_block; | 33 bool use_simple_block; |
34 }; | 34 }; |
35 | 35 |
36 static const BlockInfo kDefaultBlockInfo[] = { | 36 static const BlockInfo kDefaultBlockInfo[] = { |
37 { kAudioTrackNum, 0, 23, true }, | 37 { kAudioTrackNum, 0, 23, true }, |
38 { kAudioTrackNum, 23, 23, true }, | 38 { kAudioTrackNum, 23, 23, true }, |
39 { kVideoTrackNum, 33, 34, true }, | 39 { kVideoTrackNum, 33, 34, true }, // Assumes not using DefaultDuration |
40 { kAudioTrackNum, 46, 23, true }, | 40 { kAudioTrackNum, 46, 23, true }, |
41 { kVideoTrackNum, 67, 33, false }, | 41 { kVideoTrackNum, 67, 33, false }, |
42 { kAudioTrackNum, 69, 23, false }, | 42 { kAudioTrackNum, 69, 23, false }, |
43 { kVideoTrackNum, 100, 33, false }, | 43 { kVideoTrackNum, 100, 33, false }, |
44 }; | 44 }; |
45 | 45 |
46 static const uint8 kEncryptedFrame[] = { | 46 static const uint8 kEncryptedFrame[] = { |
47 0x01, // Block is encrypted | 47 0x01, // Block is encrypted |
48 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 // IV | 48 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 // IV |
49 }; | 49 }; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 LOG(ERROR) << "Unexpected track number " << block_info[i].track_num; | 114 LOG(ERROR) << "Unexpected track number " << block_info[i].track_num; |
115 return false; | 115 return false; |
116 } | 116 } |
117 | 117 |
118 if (*offset >= buffers->size()) | 118 if (*offset >= buffers->size()) |
119 return false; | 119 return false; |
120 | 120 |
121 scoped_refptr<StreamParserBuffer> buffer = (*buffers)[(*offset)++]; | 121 scoped_refptr<StreamParserBuffer> buffer = (*buffers)[(*offset)++]; |
122 | 122 |
123 EXPECT_EQ(block_info[i].timestamp, buffer->timestamp().InMilliseconds()); | 123 EXPECT_EQ(block_info[i].timestamp, buffer->timestamp().InMilliseconds()); |
124 | 124 EXPECT_EQ(block_info[i].duration, buffer->duration().InMilliseconds()); |
125 if (!block_info[i].use_simple_block) | |
126 EXPECT_NE(kNoTimestamp(), buffer->duration()); | |
127 | |
128 if (buffer->duration() != kNoTimestamp()) | |
129 EXPECT_EQ(block_info[i].duration, buffer->duration().InMilliseconds()); | |
130 | |
131 EXPECT_EQ(expected_type, buffer->type()); | 125 EXPECT_EQ(expected_type, buffer->type()); |
132 EXPECT_EQ(block_info[i].track_num, buffer->track_id()); | 126 EXPECT_EQ(block_info[i].track_num, buffer->track_id()); |
133 } | 127 } |
134 | 128 |
135 return true; | 129 return true; |
136 } | 130 } |
137 | 131 |
138 static bool VerifyBuffers(const scoped_ptr<WebMClusterParser>& parser, | 132 static bool VerifyBuffers(const scoped_ptr<WebMClusterParser>& parser, |
139 const BlockInfo* block_info, | 133 const BlockInfo* block_info, |
140 int block_count) { | 134 int block_count) { |
141 const WebMClusterParser::TextBufferQueueMap& text_map = | 135 const WebMClusterParser::TextBufferQueueMap& text_map = |
142 parser->GetTextBuffers(); | 136 parser->GetTextBuffers(); |
143 const WebMClusterParser::BufferQueue* text_buffers; | 137 const WebMClusterParser::BufferQueue* text_buffers; |
144 const WebMClusterParser::BufferQueue no_text_buffers; | 138 const WebMClusterParser::BufferQueue no_text_buffers; |
145 if (!text_map.empty()) | 139 if (!text_map.empty()) |
146 text_buffers = &(text_map.rbegin()->second); | 140 text_buffers = &(text_map.rbegin()->second); |
147 else | 141 else |
148 text_buffers = &no_text_buffers; | 142 text_buffers = &no_text_buffers; |
149 | 143 |
150 return VerifyBuffers(parser->audio_buffers(), | 144 return VerifyBuffers(parser->GetAudioBuffers(), |
151 parser->video_buffers(), | 145 parser->GetVideoBuffers(), |
152 *text_buffers, | 146 *text_buffers, |
153 block_info, | 147 block_info, |
154 block_count); | 148 block_count); |
155 } | 149 } |
156 | 150 |
157 static bool VerifyTextBuffers( | 151 static bool VerifyTextBuffers( |
158 const scoped_ptr<WebMClusterParser>& parser, | 152 const scoped_ptr<WebMClusterParser>& parser, |
159 const BlockInfo* block_info_ptr, | 153 const BlockInfo* block_info_ptr, |
160 int block_count, | 154 int block_count, |
161 int text_track_num, | 155 int text_track_num, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 itr != src.end(); ++itr) { | 193 itr != src.end(); ++itr) { |
200 dest->push_back(*itr); | 194 dest->push_back(*itr); |
201 } | 195 } |
202 } | 196 } |
203 | 197 |
204 class WebMClusterParserTest : public testing::Test { | 198 class WebMClusterParserTest : public testing::Test { |
205 public: | 199 public: |
206 WebMClusterParserTest() | 200 WebMClusterParserTest() |
207 : parser_(new WebMClusterParser(kTimecodeScale, | 201 : parser_(new WebMClusterParser(kTimecodeScale, |
208 kAudioTrackNum, | 202 kAudioTrackNum, |
| 203 kNoTimestamp(), |
209 kVideoTrackNum, | 204 kVideoTrackNum, |
| 205 kNoTimestamp(), |
210 WebMTracksParser::TextTracks(), | 206 WebMTracksParser::TextTracks(), |
211 std::set<int64>(), | 207 std::set<int64>(), |
212 std::string(), | 208 std::string(), |
213 std::string(), | 209 std::string(), |
214 LogCB())) {} | 210 LogCB())) {} |
215 | 211 |
216 protected: | 212 protected: |
217 scoped_ptr<WebMClusterParser> parser_; | 213 scoped_ptr<WebMClusterParser> parser_; |
218 }; | 214 }; |
219 | 215 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 ASSERT_GE(result, 0); | 261 ASSERT_GE(result, 0); |
266 ASSERT_LE(result, parse_size); | 262 ASSERT_LE(result, parse_size); |
267 | 263 |
268 if (result == 0) { | 264 if (result == 0) { |
269 // The parser needs more data so increase the parse_size a little. | 265 // The parser needs more data so increase the parse_size a little. |
270 parse_size += default_parse_size; | 266 parse_size += default_parse_size; |
271 parse_size = std::min(parse_size, size); | 267 parse_size = std::min(parse_size, size); |
272 continue; | 268 continue; |
273 } | 269 } |
274 | 270 |
275 AppendToEnd(parser_->audio_buffers(), &audio_buffers); | 271 AppendToEnd(parser_->GetAudioBuffers(), &audio_buffers); |
276 AppendToEnd(parser_->video_buffers(), &video_buffers); | 272 AppendToEnd(parser_->GetVideoBuffers(), &video_buffers); |
277 | 273 |
278 parse_size = default_parse_size; | 274 parse_size = default_parse_size; |
279 | 275 |
280 data += result; | 276 data += result; |
281 size -= result; | 277 size -= result; |
282 } | 278 } |
283 ASSERT_TRUE(VerifyBuffers(audio_buffers, video_buffers, | 279 ASSERT_TRUE(VerifyBuffers(audio_buffers, video_buffers, |
284 no_text_buffers, kDefaultBlockInfo, | 280 no_text_buffers, kDefaultBlockInfo, |
285 block_count)); | 281 block_count)); |
286 } | 282 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 EXPECT_EQ(cluster->size(), result); | 327 EXPECT_EQ(cluster->size(), result); |
332 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); | 328 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); |
333 } | 329 } |
334 | 330 |
335 TEST_F(WebMClusterParserTest, IgnoredTracks) { | 331 TEST_F(WebMClusterParserTest, IgnoredTracks) { |
336 std::set<int64> ignored_tracks; | 332 std::set<int64> ignored_tracks; |
337 ignored_tracks.insert(kTextTrackNum); | 333 ignored_tracks.insert(kTextTrackNum); |
338 | 334 |
339 parser_.reset(new WebMClusterParser(kTimecodeScale, | 335 parser_.reset(new WebMClusterParser(kTimecodeScale, |
340 kAudioTrackNum, | 336 kAudioTrackNum, |
| 337 kNoTimestamp(), |
341 kVideoTrackNum, | 338 kVideoTrackNum, |
| 339 kNoTimestamp(), |
342 WebMTracksParser::TextTracks(), | 340 WebMTracksParser::TextTracks(), |
343 ignored_tracks, | 341 ignored_tracks, |
344 std::string(), | 342 std::string(), |
345 std::string(), | 343 std::string(), |
346 LogCB())); | 344 LogCB())); |
347 | 345 |
348 const BlockInfo kInputBlockInfo[] = { | 346 const BlockInfo kInputBlockInfo[] = { |
349 { kAudioTrackNum, 0, 23, true }, | 347 { kAudioTrackNum, 0, 23, true }, |
350 { kAudioTrackNum, 23, 23, true }, | 348 { kAudioTrackNum, 23, 23, true }, |
351 { kVideoTrackNum, 33, 33, true }, | 349 { kVideoTrackNum, 33, 34, true }, |
352 { kTextTrackNum, 33, 99, true }, | 350 { kTextTrackNum, 33, 99, true }, |
353 { kAudioTrackNum, 46, 23, true }, | 351 { kAudioTrackNum, 46, 23, true }, |
354 { kVideoTrackNum, 67, 33, true }, | 352 { kVideoTrackNum, 67, 34, true }, |
355 }; | 353 }; |
356 int input_block_count = arraysize(kInputBlockInfo); | 354 int input_block_count = arraysize(kInputBlockInfo); |
357 | 355 |
358 const BlockInfo kOutputBlockInfo[] = { | 356 const BlockInfo kOutputBlockInfo[] = { |
359 { kAudioTrackNum, 0, 23, true }, | 357 { kAudioTrackNum, 0, 23, true }, |
360 { kAudioTrackNum, 23, 23, true }, | 358 { kAudioTrackNum, 23, 23, true }, |
361 { kVideoTrackNum, 33, 33, true }, | 359 { kVideoTrackNum, 33, 34, true }, |
362 { kAudioTrackNum, 46, 23, true }, | 360 { kAudioTrackNum, 46, 23, true }, |
363 { kVideoTrackNum, 67, 33, true }, | 361 { kVideoTrackNum, 67, 34, true }, |
364 }; | 362 }; |
365 int output_block_count = arraysize(kOutputBlockInfo); | 363 int output_block_count = arraysize(kOutputBlockInfo); |
366 | 364 |
367 scoped_ptr<Cluster> cluster( | 365 scoped_ptr<Cluster> cluster( |
368 CreateCluster(0, kInputBlockInfo, input_block_count)); | 366 CreateCluster(0, kInputBlockInfo, input_block_count)); |
369 | 367 |
370 int result = parser_->Parse(cluster->data(), cluster->size()); | 368 int result = parser_->Parse(cluster->data(), cluster->size()); |
371 EXPECT_EQ(cluster->size(), result); | 369 EXPECT_EQ(cluster->size(), result); |
372 ASSERT_TRUE(VerifyBuffers(parser_, kOutputBlockInfo, output_block_count)); | 370 ASSERT_TRUE(VerifyBuffers(parser_, kOutputBlockInfo, output_block_count)); |
373 } | 371 } |
374 | 372 |
375 TEST_F(WebMClusterParserTest, ParseTextTracks) { | 373 TEST_F(WebMClusterParserTest, ParseTextTracks) { |
376 typedef WebMTracksParser::TextTracks TextTracks; | 374 typedef WebMTracksParser::TextTracks TextTracks; |
377 TextTracks text_tracks; | 375 TextTracks text_tracks; |
378 | 376 |
379 text_tracks.insert(std::make_pair(TextTracks::key_type(kTextTrackNum), | 377 text_tracks.insert(std::make_pair(TextTracks::key_type(kTextTrackNum), |
380 TextTrackConfig(kTextSubtitles, "", "", | 378 TextTrackConfig(kTextSubtitles, "", "", |
381 ""))); | 379 ""))); |
382 | 380 |
383 parser_.reset(new WebMClusterParser(kTimecodeScale, | 381 parser_.reset(new WebMClusterParser(kTimecodeScale, |
384 kAudioTrackNum, | 382 kAudioTrackNum, |
| 383 kNoTimestamp(), |
385 kVideoTrackNum, | 384 kVideoTrackNum, |
| 385 kNoTimestamp(), |
386 text_tracks, | 386 text_tracks, |
387 std::set<int64>(), | 387 std::set<int64>(), |
388 std::string(), | 388 std::string(), |
389 std::string(), | 389 std::string(), |
390 LogCB())); | 390 LogCB())); |
391 | 391 |
392 const BlockInfo kInputBlockInfo[] = { | 392 const BlockInfo kInputBlockInfo[] = { |
393 { kAudioTrackNum, 0, 23, true }, | 393 { kAudioTrackNum, 0, 23, true }, |
394 { kAudioTrackNum, 23, 23, true }, | 394 { kAudioTrackNum, 23, 23, true }, |
395 { kVideoTrackNum, 33, 33, true }, | 395 { kVideoTrackNum, 33, 34, true }, |
396 { kTextTrackNum, 33, 42, false }, | 396 { kTextTrackNum, 33, 42, false }, |
397 { kAudioTrackNum, 46, 23, true }, | 397 { kAudioTrackNum, 46, 23, true }, |
398 { kTextTrackNum, 55, 44, false }, | 398 { kTextTrackNum, 55, 44, false }, |
399 { kVideoTrackNum, 67, 33, true }, | 399 { kVideoTrackNum, 67, 34, true }, |
400 }; | 400 }; |
401 int input_block_count = arraysize(kInputBlockInfo); | 401 int input_block_count = arraysize(kInputBlockInfo); |
402 | 402 |
403 scoped_ptr<Cluster> cluster( | 403 scoped_ptr<Cluster> cluster( |
404 CreateCluster(0, kInputBlockInfo, input_block_count)); | 404 CreateCluster(0, kInputBlockInfo, input_block_count)); |
405 | 405 |
406 int result = parser_->Parse(cluster->data(), cluster->size()); | 406 int result = parser_->Parse(cluster->data(), cluster->size()); |
407 EXPECT_EQ(cluster->size(), result); | 407 EXPECT_EQ(cluster->size(), result); |
408 ASSERT_TRUE(VerifyBuffers(parser_, kInputBlockInfo, input_block_count)); | 408 ASSERT_TRUE(VerifyBuffers(parser_, kInputBlockInfo, input_block_count)); |
409 } | 409 } |
410 | 410 |
411 TEST_F(WebMClusterParserTest, TextTracksSimpleBlock) { | 411 TEST_F(WebMClusterParserTest, TextTracksSimpleBlock) { |
412 typedef WebMTracksParser::TextTracks TextTracks; | 412 typedef WebMTracksParser::TextTracks TextTracks; |
413 WebMTracksParser::TextTracks text_tracks; | 413 WebMTracksParser::TextTracks text_tracks; |
414 | 414 |
415 text_tracks.insert(std::make_pair(TextTracks::key_type(kTextTrackNum), | 415 text_tracks.insert(std::make_pair(TextTracks::key_type(kTextTrackNum), |
416 TextTrackConfig(kTextSubtitles, "", "", | 416 TextTrackConfig(kTextSubtitles, "", "", |
417 ""))); | 417 ""))); |
418 | 418 |
419 parser_.reset(new WebMClusterParser(kTimecodeScale, | 419 parser_.reset(new WebMClusterParser(kTimecodeScale, |
420 kAudioTrackNum, | 420 kAudioTrackNum, |
| 421 kNoTimestamp(), |
421 kVideoTrackNum, | 422 kVideoTrackNum, |
| 423 kNoTimestamp(), |
422 text_tracks, | 424 text_tracks, |
423 std::set<int64>(), | 425 std::set<int64>(), |
424 std::string(), | 426 std::string(), |
425 std::string(), | 427 std::string(), |
426 LogCB())); | 428 LogCB())); |
427 | 429 |
428 const BlockInfo kInputBlockInfo[] = { | 430 const BlockInfo kInputBlockInfo[] = { |
429 { kTextTrackNum, 33, 42, true }, | 431 { kTextTrackNum, 33, 42, true }, |
430 }; | 432 }; |
431 int input_block_count = arraysize(kInputBlockInfo); | 433 int input_block_count = arraysize(kInputBlockInfo); |
(...skipping 15 matching lines...) Expand all Loading... |
447 text_tracks.insert(std::make_pair(TextTracks::key_type(kSubtitleTextTrackNum), | 449 text_tracks.insert(std::make_pair(TextTracks::key_type(kSubtitleTextTrackNum), |
448 TextTrackConfig(kTextSubtitles, "", "", | 450 TextTrackConfig(kTextSubtitles, "", "", |
449 ""))); | 451 ""))); |
450 | 452 |
451 text_tracks.insert(std::make_pair(TextTracks::key_type(kCaptionTextTrackNum), | 453 text_tracks.insert(std::make_pair(TextTracks::key_type(kCaptionTextTrackNum), |
452 TextTrackConfig(kTextCaptions, "", "", | 454 TextTrackConfig(kTextCaptions, "", "", |
453 ""))); | 455 ""))); |
454 | 456 |
455 parser_.reset(new WebMClusterParser(kTimecodeScale, | 457 parser_.reset(new WebMClusterParser(kTimecodeScale, |
456 kAudioTrackNum, | 458 kAudioTrackNum, |
| 459 kNoTimestamp(), |
457 kVideoTrackNum, | 460 kVideoTrackNum, |
| 461 kNoTimestamp(), |
458 text_tracks, | 462 text_tracks, |
459 std::set<int64>(), | 463 std::set<int64>(), |
460 std::string(), | 464 std::string(), |
461 std::string(), | 465 std::string(), |
462 LogCB())); | 466 LogCB())); |
463 | 467 |
464 const BlockInfo kInputBlockInfo[] = { | 468 const BlockInfo kInputBlockInfo[] = { |
465 { kAudioTrackNum, 0, 23, true }, | 469 { kAudioTrackNum, 0, 23, true }, |
466 { kAudioTrackNum, 23, 23, true }, | 470 { kAudioTrackNum, 23, 23, true }, |
467 { kVideoTrackNum, 33, 33, true }, | 471 { kVideoTrackNum, 33, 34, true }, |
468 { kSubtitleTextTrackNum, 33, 42, false }, | 472 { kSubtitleTextTrackNum, 33, 42, false }, |
469 { kAudioTrackNum, 46, 23, true }, | 473 { kAudioTrackNum, 46, 23, true }, |
470 { kCaptionTextTrackNum, 55, 44, false }, | 474 { kCaptionTextTrackNum, 55, 44, false }, |
471 { kVideoTrackNum, 67, 33, true }, | 475 { kVideoTrackNum, 67, 34, true }, |
472 { kSubtitleTextTrackNum, 67, 33, false }, | 476 { kSubtitleTextTrackNum, 67, 33, false }, |
473 }; | 477 }; |
474 int input_block_count = arraysize(kInputBlockInfo); | 478 int input_block_count = arraysize(kInputBlockInfo); |
475 | 479 |
476 scoped_ptr<Cluster> cluster( | 480 scoped_ptr<Cluster> cluster( |
477 CreateCluster(0, kInputBlockInfo, input_block_count)); | 481 CreateCluster(0, kInputBlockInfo, input_block_count)); |
478 | 482 |
479 int result = parser_->Parse(cluster->data(), cluster->size()); | 483 int result = parser_->Parse(cluster->data(), cluster->size()); |
480 EXPECT_EQ(cluster->size(), result); | 484 EXPECT_EQ(cluster->size(), result); |
481 | 485 |
482 const WebMClusterParser::TextBufferQueueMap& text_map = | 486 const WebMClusterParser::TextBufferQueueMap& text_map = |
483 parser_->GetTextBuffers(); | 487 parser_->GetTextBuffers(); |
484 for (WebMClusterParser::TextBufferQueueMap::const_iterator itr = | 488 for (WebMClusterParser::TextBufferQueueMap::const_iterator itr = |
485 text_map.begin(); | 489 text_map.begin(); |
486 itr != text_map.end(); | 490 itr != text_map.end(); |
487 ++itr) { | 491 ++itr) { |
488 const WebMTracksParser::TextTracks::const_iterator find_result = | 492 const WebMTracksParser::TextTracks::const_iterator find_result = |
489 text_tracks.find(itr->first); | 493 text_tracks.find(itr->first); |
490 ASSERT_TRUE(find_result != text_tracks.end()); | 494 ASSERT_TRUE(find_result != text_tracks.end()); |
491 ASSERT_TRUE(VerifyTextBuffers(parser_, kInputBlockInfo, input_block_count, | 495 ASSERT_TRUE(VerifyTextBuffers(parser_, kInputBlockInfo, input_block_count, |
492 itr->first, itr->second)); | 496 itr->first, itr->second)); |
493 } | 497 } |
494 } | 498 } |
495 | 499 |
496 TEST_F(WebMClusterParserTest, ParseEncryptedBlock) { | 500 TEST_F(WebMClusterParserTest, ParseEncryptedBlock) { |
497 scoped_ptr<Cluster> cluster(CreateEncryptedCluster(sizeof(kEncryptedFrame))); | 501 scoped_ptr<Cluster> cluster(CreateEncryptedCluster(sizeof(kEncryptedFrame))); |
498 | 502 |
499 parser_.reset(new WebMClusterParser(kTimecodeScale, | 503 parser_.reset(new WebMClusterParser(kTimecodeScale, |
500 kAudioTrackNum, | 504 kAudioTrackNum, |
| 505 kNoTimestamp(), |
501 kVideoTrackNum, | 506 kVideoTrackNum, |
| 507 kNoTimestamp(), |
502 WebMTracksParser::TextTracks(), | 508 WebMTracksParser::TextTracks(), |
503 std::set<int64>(), | 509 std::set<int64>(), |
504 std::string(), | 510 std::string(), |
505 "video_key_id", | 511 "video_key_id", |
506 LogCB())); | 512 LogCB())); |
507 int result = parser_->Parse(cluster->data(), cluster->size()); | 513 int result = parser_->Parse(cluster->data(), cluster->size()); |
508 EXPECT_EQ(cluster->size(), result); | 514 EXPECT_EQ(cluster->size(), result); |
509 ASSERT_EQ(1UL, parser_->video_buffers().size()); | 515 ASSERT_EQ(1UL, parser_->GetVideoBuffers().size()); |
510 scoped_refptr<StreamParserBuffer> buffer = parser_->video_buffers()[0]; | 516 scoped_refptr<StreamParserBuffer> buffer = parser_->GetVideoBuffers()[0]; |
511 VerifyEncryptedBuffer(buffer); | 517 VerifyEncryptedBuffer(buffer); |
512 } | 518 } |
513 | 519 |
514 TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) { | 520 TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) { |
515 scoped_ptr<Cluster> cluster( | 521 scoped_ptr<Cluster> cluster( |
516 CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1)); | 522 CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1)); |
517 | 523 |
518 parser_.reset(new WebMClusterParser(kTimecodeScale, | 524 parser_.reset(new WebMClusterParser(kTimecodeScale, |
519 kAudioTrackNum, | 525 kAudioTrackNum, |
| 526 kNoTimestamp(), |
520 kVideoTrackNum, | 527 kVideoTrackNum, |
| 528 kNoTimestamp(), |
521 WebMTracksParser::TextTracks(), | 529 WebMTracksParser::TextTracks(), |
522 std::set<int64>(), | 530 std::set<int64>(), |
523 std::string(), | 531 std::string(), |
524 "video_key_id", | 532 "video_key_id", |
525 LogCB())); | 533 LogCB())); |
526 int result = parser_->Parse(cluster->data(), cluster->size()); | 534 int result = parser_->Parse(cluster->data(), cluster->size()); |
527 EXPECT_EQ(-1, result); | 535 EXPECT_EQ(-1, result); |
528 } | 536 } |
529 | 537 |
530 TEST_F(WebMClusterParserTest, ParseInvalidZeroSizedCluster) { | 538 TEST_F(WebMClusterParserTest, ParseInvalidZeroSizedCluster) { |
531 const uint8 kBuffer[] = { | 539 const uint8 kBuffer[] = { |
532 0x1F, 0x43, 0xB6, 0x75, 0x80, // CLUSTER (size = 0) | 540 0x1F, 0x43, 0xB6, 0x75, 0x80, // CLUSTER (size = 0) |
533 }; | 541 }; |
534 | 542 |
535 EXPECT_EQ(-1, parser_->Parse(kBuffer, sizeof(kBuffer))); | 543 EXPECT_EQ(-1, parser_->Parse(kBuffer, sizeof(kBuffer))); |
536 } | 544 } |
537 | 545 |
538 TEST_F(WebMClusterParserTest, ParseInvalidUnknownButActuallyZeroSizedCluster) { | 546 TEST_F(WebMClusterParserTest, ParseInvalidUnknownButActuallyZeroSizedCluster) { |
539 const uint8 kBuffer[] = { | 547 const uint8 kBuffer[] = { |
540 0x1F, 0x43, 0xB6, 0x75, 0xFF, // CLUSTER (size = "unknown") | 548 0x1F, 0x43, 0xB6, 0x75, 0xFF, // CLUSTER (size = "unknown") |
541 0x1F, 0x43, 0xB6, 0x75, 0x85, // CLUSTER (size = 5) | 549 0x1F, 0x43, 0xB6, 0x75, 0x85, // CLUSTER (size = 5) |
542 }; | 550 }; |
543 | 551 |
544 EXPECT_EQ(-1, parser_->Parse(kBuffer, sizeof(kBuffer))); | 552 EXPECT_EQ(-1, parser_->Parse(kBuffer, sizeof(kBuffer))); |
545 } | 553 } |
546 | 554 |
547 } // namespace media | 555 } // namespace media |
OLD | NEW |