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

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

Issue 7806002: Fix ChunkDemuxer end of stream handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nit and added helper class to reduce duplicated code. Created 9 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | no next file » | 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/mock_callback.h" 6 #include "media/base/mock_callback.h"
7 #include "media/base/mock_filter_host.h" 7 #include "media/base/mock_filter_host.h"
8 #include "media/base/test_data_util.h" 8 #include "media/base/test_data_util.h"
9 #include "media/filters/chunk_demuxer.h" 9 #include "media/filters/chunk_demuxer.h"
10 #include "media/filters/chunk_demuxer_client.h" 10 #include "media/filters/chunk_demuxer_client.h"
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 AddSimpleBlock(&cb, kVideoTrackNum, 0); 457 AddSimpleBlock(&cb, kVideoTrackNum, 0);
458 AddSimpleBlock(&cb, kAudioTrackNum, 23); 458 AddSimpleBlock(&cb, kAudioTrackNum, 23);
459 AddSimpleBlock(&cb, kVideoTrackNum, 33); 459 AddSimpleBlock(&cb, kVideoTrackNum, 33);
460 scoped_ptr<Cluster> cluster(cb.Finish()); 460 scoped_ptr<Cluster> cluster(cb.Finish());
461 AppendData(cluster->data(), cluster->size()); 461 AppendData(cluster->data(), cluster->size());
462 462
463 EXPECT_CALL(mock_filter_host_, SetError(PIPELINE_ERROR_NETWORK)); 463 EXPECT_CALL(mock_filter_host_, SetError(PIPELINE_ERROR_NETWORK));
464 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); 464 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK);
465 } 465 }
466 466
467 // Helper class to reduce duplicate code when testing end of stream
468 // Read() behavior.
469 class EndOfStreamHelper {
470 public:
471 EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer)
472 : demuxer_(demuxer),
473 audio_read_done_(false),
474 video_read_done_(false) {
475 }
476
477 // Request a read on the audio and video streams.
478 void RequestReads() {
479 EXPECT_FALSE(audio_read_done_);
480 EXPECT_FALSE(video_read_done_);
481
482 scoped_refptr<DemuxerStream> audio =
483 demuxer_->GetStream(DemuxerStream::AUDIO);
484 scoped_refptr<DemuxerStream> video =
485 demuxer_->GetStream(DemuxerStream::VIDEO);
486
487 audio->Read(base::Bind(&OnEndOfStreamReadDone,
488 &audio_read_done_));
489
490 video->Read(base::Bind(&OnEndOfStreamReadDone,
491 &video_read_done_));
492 }
493
494 // Check to see if |audio_read_done_| and |video_read_done_| variables
495 // match |expected|.
496 void CheckIfReadDonesWereCalled(bool expected) {
497 EXPECT_EQ(expected, audio_read_done_);
498 EXPECT_EQ(expected, video_read_done_);
499 }
500
501 private:
502 static void OnEndOfStreamReadDone(bool* called, Buffer* buffer) {
503 EXPECT_TRUE(buffer->IsEndOfStream());
504 *called = true;
505 }
506
507 scoped_refptr<Demuxer> demuxer_;
508 bool audio_read_done_;
509 bool video_read_done_;
510
511 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
512 };
513
514 // Make sure that all pending reads that we don't have media data for get an
515 // "end of stream" buffer when EndOfStream() is called.
516 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) {
517 InitDemuxer(true, true);
518
519 scoped_refptr<DemuxerStream> audio =
520 demuxer_->GetStream(DemuxerStream::AUDIO);
521 scoped_refptr<DemuxerStream> video =
522 demuxer_->GetStream(DemuxerStream::VIDEO);
523
524 bool audio_read_done_1 = false;
525 bool video_read_done_1 = false;
526 EndOfStreamHelper end_of_stream_helper_1(demuxer_);
527 EndOfStreamHelper end_of_stream_helper_2(demuxer_);
528
529 audio->Read(base::Bind(&OnReadDone,
530 base::TimeDelta::FromMilliseconds(32),
531 &audio_read_done_1));
532
533 video->Read(base::Bind(&OnReadDone,
534 base::TimeDelta::FromMilliseconds(123),
535 &video_read_done_1));
536
537 end_of_stream_helper_1.RequestReads();
538 end_of_stream_helper_2.RequestReads();
539
540 ClusterBuilder cb;
541 cb.SetClusterTimecode(0);
542 AddSimpleBlock(&cb, kAudioTrackNum, 32);
543 AddSimpleBlock(&cb, kVideoTrackNum, 123);
544 scoped_ptr<Cluster> cluster(cb.Finish());
545
546 AppendData(cluster->data(), cluster->size());
547
548 EXPECT_TRUE(audio_read_done_1);
549 EXPECT_TRUE(video_read_done_1);
550 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false);
551 end_of_stream_helper_2.CheckIfReadDonesWereCalled(false);
552
553 demuxer_->EndOfStream(PIPELINE_OK);
554
555 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
556 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
557 }
558
559 // Make sure that all Read() calls after we get an EndOfStream()
560 // call return an "end of stream" buffer.
561 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) {
562 InitDemuxer(true, true);
563
564 scoped_refptr<DemuxerStream> audio =
565 demuxer_->GetStream(DemuxerStream::AUDIO);
566 scoped_refptr<DemuxerStream> video =
567 demuxer_->GetStream(DemuxerStream::VIDEO);
568
569 bool audio_read_done_1 = false;
570 bool video_read_done_1 = false;
571 EndOfStreamHelper end_of_stream_helper_1(demuxer_);
572 EndOfStreamHelper end_of_stream_helper_2(demuxer_);
573 EndOfStreamHelper end_of_stream_helper_3(demuxer_);
574
575 audio->Read(base::Bind(&OnReadDone,
576 base::TimeDelta::FromMilliseconds(32),
577 &audio_read_done_1));
578
579 video->Read(base::Bind(&OnReadDone,
580 base::TimeDelta::FromMilliseconds(123),
581 &video_read_done_1));
582
583 end_of_stream_helper_1.RequestReads();
584
585 ClusterBuilder cb;
586 cb.SetClusterTimecode(0);
587 AddSimpleBlock(&cb, kAudioTrackNum, 32);
588 AddSimpleBlock(&cb, kVideoTrackNum, 123);
589 scoped_ptr<Cluster> cluster(cb.Finish());
590
591 AppendData(cluster->data(), cluster->size());
592
593 EXPECT_TRUE(audio_read_done_1);
594 EXPECT_TRUE(video_read_done_1);
595 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false);
596
597 demuxer_->EndOfStream(PIPELINE_OK);
598
599 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
600
601 // Request a few more reads and make sure we immediately get
602 // end of stream buffers.
603 end_of_stream_helper_2.RequestReads();
604 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
605
606 end_of_stream_helper_3.RequestReads();
607 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
608 }
609
467 } // namespace media 610 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698