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

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 8989041: Revert 115214 (caused media_unittests failure in FFmpegGlueTest, (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years 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 | Annotate | Revision Log
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/webm/webm_cluster_parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "media/base/audio_decoder_config.h" 6 #include "media/base/audio_decoder_config.h"
7 #include "media/base/mock_callback.h" 7 #include "media/base/mock_callback.h"
8 #include "media/base/mock_demuxer_host.h" 8 #include "media/base/mock_demuxer_host.h"
9 #include "media/base/test_data_util.h" 9 #include "media/base/test_data_util.h"
10 #include "media/filters/chunk_demuxer.h" 10 #include "media/filters/chunk_demuxer.h"
11 #include "media/filters/chunk_demuxer_client.h" 11 #include "media/filters/chunk_demuxer_client.h"
12 #include "media/webm/cluster_builder.h" 12 #include "media/webm/cluster_builder.h"
13 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
14 14
15 using ::testing::AnyNumber; 15 using ::testing::AnyNumber;
16 using ::testing::InSequence; 16 using ::testing::InSequence;
17 using ::testing::Return; 17 using ::testing::Return;
18 using ::testing::SetArgumentPointee; 18 using ::testing::SetArgumentPointee;
19 using ::testing::NiceMock;
19 using ::testing::_; 20 using ::testing::_;
20 21
21 namespace media { 22 namespace media {
22 23
23 static const uint8 kTracksHeader[] = { 24 static const uint8 kTracksHeader[] = {
24 0x16, 0x54, 0xAE, 0x6B, // Tracks ID 25 0x16, 0x54, 0xAE, 0x6B, // Tracks ID
25 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0) 26 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0)
26 }; 27 };
27 28
28 static const int kTracksHeaderSize = sizeof(kTracksHeader); 29 static const int kTracksHeaderSize = sizeof(kTracksHeader);
29 static const int kTracksSizeOffset = 4; 30 static const int kTracksSizeOffset = 4;
30 31
31 static const int kVideoTrackNum = 1; 32 static const int kVideoTrackNum = 1;
32 static const int kAudioTrackNum = 2; 33 static const int kAudioTrackNum = 2;
33 34
34 MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
35 return !arg->IsEndOfStream() &&
36 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms;
37 }
38
39 class MockChunkDemuxerClient : public ChunkDemuxerClient { 35 class MockChunkDemuxerClient : public ChunkDemuxerClient {
40 public: 36 public:
41 MockChunkDemuxerClient() {} 37 MockChunkDemuxerClient() {}
42 virtual ~MockChunkDemuxerClient() {} 38 virtual ~MockChunkDemuxerClient() {}
43 39
44 MOCK_METHOD1(DemuxerOpened, void(ChunkDemuxer* demuxer)); 40 MOCK_METHOD1(DemuxerOpened, void(ChunkDemuxer* demuxer));
45 MOCK_METHOD0(DemuxerClosed, void()); 41 MOCK_METHOD0(DemuxerClosed, void());
46 42
47 private: 43 private:
48 DISALLOW_COPY_AND_ASSIGN(MockChunkDemuxerClient); 44 DISALLOW_COPY_AND_ASSIGN(MockChunkDemuxerClient);
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 uint8 data[] = { 0x00 }; 185 uint8 data[] = { 0x00 };
190 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); 186 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data));
191 } 187 }
192 188
193 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode, 189 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode,
194 int size) { 190 int size) {
195 scoped_array<uint8> data(new uint8[size]); 191 scoped_array<uint8> data(new uint8[size]);
196 cb->AddSimpleBlock(track_num, timecode, 0, data.get(), size); 192 cb->AddSimpleBlock(track_num, timecode, 0, data.get(), size);
197 } 193 }
198 194
199 MOCK_METHOD1(ReadDone, void(const scoped_refptr<Buffer>&));
200
201 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) {
202 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms)));
203 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
204 base::Unretained(this)));
205 }
206
207 MOCK_METHOD1(Checkpoint, void(int id)); 195 MOCK_METHOD1(Checkpoint, void(int id));
208 196
209 MockDemuxerHost mock_demuxer_host_; 197 MockDemuxerHost mock_demuxer_host_;
210 198
211 scoped_ptr<MockChunkDemuxerClient> client_; 199 scoped_ptr<MockChunkDemuxerClient> client_;
212 scoped_refptr<ChunkDemuxer> demuxer_; 200 scoped_refptr<ChunkDemuxer> demuxer_;
213 201
214 private: 202 private:
215 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 203 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
216 }; 204 };
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 AddSimpleBlock(&cb, kVideoTrackNum, 0); 270 AddSimpleBlock(&cb, kVideoTrackNum, 0);
283 scoped_ptr<Cluster> cluster(cb.Finish()); 271 scoped_ptr<Cluster> cluster(cb.Finish());
284 272
285 Checkpoint(1); 273 Checkpoint(1);
286 274
287 AppendData(cluster->data(), cluster->size()); 275 AppendData(cluster->data(), cluster->size());
288 276
289 Checkpoint(2); 277 Checkpoint(2);
290 } 278 }
291 279
292 // Test the case where a Seek() is requested while the parser
293 // is in the middle of cluster. This is to verify that the parser
294 // resets itself on seek and is in the right state when data from
295 // the new seek point arrives.
296 TEST_F(ChunkDemuxerTest, TestSeekWhileParsingCluster) {
297 InitDemuxer(true, true);
298
299 scoped_refptr<DemuxerStream> audio =
300 demuxer_->GetStream(DemuxerStream::AUDIO);
301 scoped_refptr<DemuxerStream> video =
302 demuxer_->GetStream(DemuxerStream::VIDEO);
303
304 InSequence s;
305
306 ClusterBuilder cb;
307 cb.SetClusterTimecode(0);
308 AddSimpleBlock(&cb, kAudioTrackNum, 1);
309 AddSimpleBlock(&cb, kVideoTrackNum, 2);
310 AddSimpleBlock(&cb, kAudioTrackNum, 10);
311 AddSimpleBlock(&cb, kVideoTrackNum, 20);
312 scoped_ptr<Cluster> cluster_a(cb.Finish());
313
314 cb.SetClusterTimecode(5000);
315 AddSimpleBlock(&cb, kAudioTrackNum, 5000);
316 AddSimpleBlock(&cb, kVideoTrackNum, 5005);
317 AddSimpleBlock(&cb, kAudioTrackNum, 5007);
318 AddSimpleBlock(&cb, kVideoTrackNum, 5035);
319 scoped_ptr<Cluster> cluster_b(cb.Finish());
320
321 // Append all but the last byte so that everything but
322 // the last block can be parsed.
323 AppendData(cluster_a->data(), cluster_a->size() - 1);
324
325 ExpectRead(audio, 1);
326 ExpectRead(video, 2);
327 ExpectRead(audio, 10);
328
329 demuxer_->FlushData();
330 demuxer_->Seek(base::TimeDelta::FromSeconds(5),
331 NewExpectedStatusCB(PIPELINE_OK));
332
333
334 // Append the new cluster and verify that only the blocks
335 // in the new cluster are returned.
336 AppendData(cluster_b->data(), cluster_b->size());
337 ExpectRead(audio, 5000);
338 ExpectRead(video, 5005);
339 ExpectRead(audio, 5007);
340 ExpectRead(video, 5035);
341 }
342
343 // Test the case where AppendData() is called before Init(). 280 // Test the case where AppendData() is called before Init().
344 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) { 281 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) {
345 scoped_array<uint8> info_tracks; 282 scoped_array<uint8> info_tracks;
346 int info_tracks_size = 0; 283 int info_tracks_size = 0;
347 CreateInfoTracks(true, true, &info_tracks, &info_tracks_size); 284 CreateInfoTracks(true, true, &info_tracks, &info_tracks_size);
348 285
349 EXPECT_FALSE(demuxer_->AppendData(info_tracks.get(), info_tracks_size)); 286 EXPECT_FALSE(demuxer_->AppendData(info_tracks.get(), info_tracks_size));
350 } 287 }
351 288
352 static void OnReadDone(const base::TimeDelta& expected_time, 289 static void OnReadDone(const base::TimeDelta& expected_time,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) { 327 TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) {
391 InitDemuxer(true, true); 328 InitDemuxer(true, true);
392 329
393 ClusterBuilder cb; 330 ClusterBuilder cb;
394 331
395 cb.SetClusterTimecode(10); 332 cb.SetClusterTimecode(10);
396 AddSimpleBlock(&cb, kAudioTrackNum, 10); 333 AddSimpleBlock(&cb, kAudioTrackNum, 10);
397 AddSimpleBlock(&cb, kVideoTrackNum, 10); 334 AddSimpleBlock(&cb, kVideoTrackNum, 10);
398 AddSimpleBlock(&cb, kAudioTrackNum, 33); 335 AddSimpleBlock(&cb, kAudioTrackNum, 33);
399 AddSimpleBlock(&cb, kVideoTrackNum, 43); 336 AddSimpleBlock(&cb, kVideoTrackNum, 43);
400 scoped_ptr<Cluster> cluster_a(cb.Finish()); 337 scoped_ptr<Cluster> clusterA(cb.Finish());
401 338
402 AppendData(cluster_a->data(), cluster_a->size()); 339 AppendData(clusterA->data(), clusterA->size());
403 340
404 // Cluster B starts before cluster_a and has data 341 // Cluster B starts before clusterA and has data
405 // that overlaps. 342 // that overlaps.
406 cb.SetClusterTimecode(5); 343 cb.SetClusterTimecode(5);
407 AddSimpleBlock(&cb, kAudioTrackNum, 5); 344 AddSimpleBlock(&cb, kAudioTrackNum, 5);
408 AddSimpleBlock(&cb, kVideoTrackNum, 7); 345 AddSimpleBlock(&cb, kVideoTrackNum, 7);
409 AddSimpleBlock(&cb, kAudioTrackNum, 28); 346 AddSimpleBlock(&cb, kAudioTrackNum, 28);
410 AddSimpleBlock(&cb, kVideoTrackNum, 40); 347 AddSimpleBlock(&cb, kVideoTrackNum, 40);
411 scoped_ptr<Cluster> cluster_b(cb.Finish()); 348 scoped_ptr<Cluster> clusterB(cb.Finish());
412 349
413 // Make sure that AppendData() fails because this cluster data 350 // Make sure that AppendData() fails because this cluster data
414 // is before previous data. 351 // is before previous data.
415 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 352 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
416 AppendData(cluster_b->data(), cluster_b->size()); 353 AppendData(clusterB->data(), clusterB->size());
417 354
418 // Verify that AppendData() doesn't accept more data now. 355 // Verify that AppendData() doesn't accept more data now.
419 cb.SetClusterTimecode(45); 356 cb.SetClusterTimecode(45);
420 AddSimpleBlock(&cb, kAudioTrackNum, 45); 357 AddSimpleBlock(&cb, kAudioTrackNum, 45);
421 AddSimpleBlock(&cb, kVideoTrackNum, 45); 358 AddSimpleBlock(&cb, kVideoTrackNum, 45);
422 scoped_ptr<Cluster> cluster_c(cb.Finish()); 359 scoped_ptr<Cluster> clusterC(cb.Finish());
423 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); 360 EXPECT_FALSE(demuxer_->AppendData(clusterC->data(), clusterC->size()));
424 } 361 }
425 362
426 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) { 363 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) {
427 InitDemuxer(true, true); 364 InitDemuxer(true, true);
428 365
429 ClusterBuilder cb; 366 ClusterBuilder cb;
430 367
431 // Test the case where block timecodes are not monotonically 368 // Test the case where block timecodes are not monotonically
432 // increasing but stay above the cluster timecode. 369 // increasing but stay above the cluster timecode.
433 cb.SetClusterTimecode(5); 370 cb.SetClusterTimecode(5);
434 AddSimpleBlock(&cb, kAudioTrackNum, 5); 371 AddSimpleBlock(&cb, kAudioTrackNum, 5);
435 AddSimpleBlock(&cb, kVideoTrackNum, 10); 372 AddSimpleBlock(&cb, kVideoTrackNum, 10);
436 AddSimpleBlock(&cb, kAudioTrackNum, 7); 373 AddSimpleBlock(&cb, kAudioTrackNum, 7);
437 AddSimpleBlock(&cb, kVideoTrackNum, 15); 374 AddSimpleBlock(&cb, kVideoTrackNum, 15);
438 scoped_ptr<Cluster> cluster_a(cb.Finish()); 375 scoped_ptr<Cluster> clusterA(cb.Finish());
439 376
440 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 377 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
441 AppendData(cluster_a->data(), cluster_a->size()); 378 AppendData(clusterA->data(), clusterA->size());
442 379
443 // Verify that AppendData() doesn't accept more data now. 380 // Verify that AppendData() doesn't accept more data now.
444 cb.SetClusterTimecode(20); 381 cb.SetClusterTimecode(20);
445 AddSimpleBlock(&cb, kAudioTrackNum, 20); 382 AddSimpleBlock(&cb, kAudioTrackNum, 20);
446 AddSimpleBlock(&cb, kVideoTrackNum, 20); 383 AddSimpleBlock(&cb, kVideoTrackNum, 20);
447 scoped_ptr<Cluster> cluster_b(cb.Finish()); 384 scoped_ptr<Cluster> clusterB(cb.Finish());
448 EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size())); 385 EXPECT_FALSE(demuxer_->AppendData(clusterB->data(), clusterB->size()));
449 } 386 }
450 387
451 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) { 388 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) {
452 InitDemuxer(true, true); 389 InitDemuxer(true, true);
453 390
454 ClusterBuilder cb; 391 ClusterBuilder cb;
455 392
456 // Test timecodes going backwards and including values less than the cluster 393 // Test timecodes going backwards and including values less than the cluster
457 // timecode. 394 // timecode.
458 cb.SetClusterTimecode(5); 395 cb.SetClusterTimecode(5);
459 AddSimpleBlock(&cb, kAudioTrackNum, 5); 396 AddSimpleBlock(&cb, kAudioTrackNum, 5);
460 AddSimpleBlock(&cb, kVideoTrackNum, 5); 397 AddSimpleBlock(&cb, kVideoTrackNum, 5);
461 AddSimpleBlock(&cb, kAudioTrackNum, 3); 398 AddSimpleBlock(&cb, kAudioTrackNum, 3);
462 AddSimpleBlock(&cb, kVideoTrackNum, 3); 399 AddSimpleBlock(&cb, kVideoTrackNum, 3);
463 scoped_ptr<Cluster> cluster_a(cb.Finish()); 400 scoped_ptr<Cluster> clusterA(cb.Finish());
464 401
465 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 402 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
466 AppendData(cluster_a->data(), cluster_a->size()); 403 AppendData(clusterA->data(), clusterA->size());
467 404
468 // Verify that AppendData() doesn't accept more data now. 405 // Verify that AppendData() doesn't accept more data now.
469 cb.SetClusterTimecode(6); 406 cb.SetClusterTimecode(6);
470 AddSimpleBlock(&cb, kAudioTrackNum, 6); 407 AddSimpleBlock(&cb, kAudioTrackNum, 6);
471 AddSimpleBlock(&cb, kVideoTrackNum, 6); 408 AddSimpleBlock(&cb, kVideoTrackNum, 6);
472 scoped_ptr<Cluster> cluster_b(cb.Finish()); 409 scoped_ptr<Cluster> clusterB(cb.Finish());
473 EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size())); 410 EXPECT_FALSE(demuxer_->AppendData(clusterB->data(), clusterB->size()));
474 } 411 }
475 412
476 413
477 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) { 414 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) {
478 InitDemuxer(true, true); 415 InitDemuxer(true, true);
479 416
480 ClusterBuilder cb; 417 ClusterBuilder cb;
481 418
482 // Test strict monotonic increasing timestamps on a per stream 419 // Test strict monotonic increasing timestamps on a per stream
483 // basis. 420 // basis.
(...skipping 11 matching lines...) Expand all
495 TEST_F(ChunkDemuxerTest, TestMonotonicallyIncreasingTimestampsAcrossClusters) { 432 TEST_F(ChunkDemuxerTest, TestMonotonicallyIncreasingTimestampsAcrossClusters) {
496 InitDemuxer(true, true); 433 InitDemuxer(true, true);
497 434
498 ClusterBuilder cb; 435 ClusterBuilder cb;
499 436
500 // Test strict monotonic increasing timestamps on a per stream 437 // Test strict monotonic increasing timestamps on a per stream
501 // basis across clusters. 438 // basis across clusters.
502 cb.SetClusterTimecode(5); 439 cb.SetClusterTimecode(5);
503 AddSimpleBlock(&cb, kAudioTrackNum, 5); 440 AddSimpleBlock(&cb, kAudioTrackNum, 5);
504 AddSimpleBlock(&cb, kVideoTrackNum, 5); 441 AddSimpleBlock(&cb, kVideoTrackNum, 5);
505 scoped_ptr<Cluster> cluster_a(cb.Finish()); 442 scoped_ptr<Cluster> clusterA(cb.Finish());
506 443
507 AppendData(cluster_a->data(), cluster_a->size()); 444 AppendData(clusterA->data(), clusterA->size());
508 445
509 cb.SetClusterTimecode(5); 446 cb.SetClusterTimecode(5);
510 AddSimpleBlock(&cb, kAudioTrackNum, 5); 447 AddSimpleBlock(&cb, kAudioTrackNum, 5);
511 AddSimpleBlock(&cb, kVideoTrackNum, 7); 448 AddSimpleBlock(&cb, kVideoTrackNum, 7);
512 scoped_ptr<Cluster> cluster_b(cb.Finish()); 449 scoped_ptr<Cluster> clusterB(cb.Finish());
513 450
514 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 451 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
515 AppendData(cluster_b->data(), cluster_b->size()); 452 AppendData(clusterB->data(), clusterB->size());
516 453
517 // Verify that AppendData() doesn't accept more data now. 454 // Verify that AppendData() doesn't accept more data now.
518 cb.SetClusterTimecode(10); 455 cb.SetClusterTimecode(10);
519 AddSimpleBlock(&cb, kAudioTrackNum, 10); 456 AddSimpleBlock(&cb, kAudioTrackNum, 10);
520 AddSimpleBlock(&cb, kVideoTrackNum, 10); 457 AddSimpleBlock(&cb, kVideoTrackNum, 10);
521 scoped_ptr<Cluster> cluster_c(cb.Finish()); 458 scoped_ptr<Cluster> clusterC(cb.Finish());
522 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); 459 EXPECT_FALSE(demuxer_->AppendData(clusterC->data(), clusterC->size()));
523 } 460 }
524 461
525 // Test the case where a cluster is passed to AppendData() before 462 // Test the case where a cluster is passed to AppendData() before
526 // INFO & TRACKS data. 463 // INFO & TRACKS data.
527 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) { 464 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) {
528 EXPECT_CALL(*client_, DemuxerOpened(_)); 465 EXPECT_CALL(*client_, DemuxerOpened(_));
529 demuxer_->Init(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 466 demuxer_->Init(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
530 467
531 ClusterBuilder cb; 468 ClusterBuilder cb;
532 cb.SetClusterTimecode(0); 469 cb.SetClusterTimecode(0);
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 demuxer_->Init(CreateInitDoneCB(201224, PIPELINE_OK)); 663 demuxer_->Init(CreateInitDoneCB(201224, PIPELINE_OK));
727 664
728 scoped_array<uint8> info_tracks; 665 scoped_array<uint8> info_tracks;
729 int info_tracks_size = 0; 666 int info_tracks_size = 0;
730 CreateInfoTracks(true, true, &info_tracks, &info_tracks_size); 667 CreateInfoTracks(true, true, &info_tracks, &info_tracks_size);
731 668
732 ClusterBuilder cb; 669 ClusterBuilder cb;
733 cb.SetClusterTimecode(0); 670 cb.SetClusterTimecode(0);
734 AddSimpleBlock(&cb, kAudioTrackNum, 32, 512); 671 AddSimpleBlock(&cb, kAudioTrackNum, 32, 512);
735 AddSimpleBlock(&cb, kVideoTrackNum, 123, 1024); 672 AddSimpleBlock(&cb, kVideoTrackNum, 123, 1024);
736 scoped_ptr<Cluster> cluster_a(cb.Finish()); 673 scoped_ptr<Cluster> clusterA(cb.Finish());
737 674
738 cb.SetClusterTimecode(125); 675 cb.SetClusterTimecode(125);
739 AddSimpleBlock(&cb, kAudioTrackNum, 125, 2048); 676 AddSimpleBlock(&cb, kAudioTrackNum, 125, 2048);
740 AddSimpleBlock(&cb, kVideoTrackNum, 150, 2048); 677 AddSimpleBlock(&cb, kVideoTrackNum, 150, 2048);
741 scoped_ptr<Cluster> cluster_b(cb.Finish()); 678 scoped_ptr<Cluster> clusterB(cb.Finish());
742 679
743 size_t buffer_size = info_tracks_size + cluster_a->size() + cluster_b->size(); 680 size_t buffer_size = info_tracks_size + clusterA->size() + clusterB->size();
744 scoped_array<uint8> buffer(new uint8[buffer_size]); 681 scoped_array<uint8> buffer(new uint8[buffer_size]);
745 uint8* dst = buffer.get(); 682 uint8* dst = buffer.get();
746 memcpy(dst, info_tracks.get(), info_tracks_size); 683 memcpy(dst, info_tracks.get(), info_tracks_size);
747 dst += info_tracks_size; 684 dst += info_tracks_size;
748 685
749 memcpy(dst, cluster_a->data(), cluster_a->size()); 686 memcpy(dst, clusterA->data(), clusterA->size());
750 dst += cluster_a->size(); 687 dst += clusterA->size();
751 688
752 memcpy(dst, cluster_b->data(), cluster_b->size()); 689 memcpy(dst, clusterB->data(), clusterB->size());
753 dst += cluster_b->size(); 690 dst += clusterB->size();
754 691
755 AppendDataInPieces(buffer.get(), buffer_size); 692 AppendDataInPieces(buffer.get(), buffer_size);
756 693
757 scoped_refptr<DemuxerStream> audio = 694 scoped_refptr<DemuxerStream> audio =
758 demuxer_->GetStream(DemuxerStream::AUDIO); 695 demuxer_->GetStream(DemuxerStream::AUDIO);
759 scoped_refptr<DemuxerStream> video = 696 scoped_refptr<DemuxerStream> video =
760 demuxer_->GetStream(DemuxerStream::VIDEO); 697 demuxer_->GetStream(DemuxerStream::VIDEO);
761 698
762 ASSERT_TRUE(audio); 699 ASSERT_TRUE(audio);
763 ASSERT_TRUE(video); 700 ASSERT_TRUE(video);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 EXPECT_FALSE(video_read_done); 843 EXPECT_FALSE(video_read_done);
907 844
908 // Append the remaining data. 845 // Append the remaining data.
909 AppendData(cluster->data() + i, cluster->size() - i); 846 AppendData(cluster->data() + i, cluster->size() - i);
910 847
911 EXPECT_TRUE(audio_read_done); 848 EXPECT_TRUE(audio_read_done);
912 EXPECT_TRUE(video_read_done); 849 EXPECT_TRUE(video_read_done);
913 } 850 }
914 851
915 } // namespace media 852 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/webm/webm_cluster_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698