| 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 |