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

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

Issue 13813016: Remove reference counting from media::Demuxer and friends. (Closed) Base URL: http://git.chromium.org/chromium/src.git@vd_scoped
Patch Set: Created 7 years, 8 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/message_loop.h" 8 #include "base/message_loop.h"
9 #include "media/base/audio_decoder_config.h" 9 #include "media/base/audio_decoder_config.h"
10 #include "media/base/decoder_buffer.h" 10 #include "media/base/decoder_buffer.h"
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 145
146 ChunkDemuxerTest() { 146 ChunkDemuxerTest() {
147 CreateNewDemuxer(); 147 CreateNewDemuxer();
148 } 148 }
149 149
150 void CreateNewDemuxer() { 150 void CreateNewDemuxer() {
151 base::Closure open_cb = 151 base::Closure open_cb =
152 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); 152 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this));
153 ChunkDemuxer::NeedKeyCB need_key_cb = 153 ChunkDemuxer::NeedKeyCB need_key_cb =
154 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); 154 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this));
155 demuxer_ = new ChunkDemuxer(open_cb, need_key_cb, LogCB()); 155 demuxer_.reset(new ChunkDemuxer(open_cb, need_key_cb, LogCB()));
156 } 156 }
157 157
158 virtual ~ChunkDemuxerTest() { 158 virtual ~ChunkDemuxerTest() {
159 ShutdownDemuxer(); 159 ShutdownDemuxer();
160 } 160 }
161 161
162 void CreateInitSegment(bool has_audio, bool has_video, 162 void CreateInitSegment(bool has_audio, bool has_video,
163 bool is_audio_encrypted, bool is_video_encrypted, 163 bool is_audio_encrypted, bool is_video_encrypted,
164 scoped_ptr<uint8[]>* buffer, 164 scoped_ptr<uint8[]>* buffer,
165 int* size) { 165 int* size) {
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 AddVideoBlockGroup(&cb, track_number, timecode, block_duration, 555 AddVideoBlockGroup(&cb, track_number, timecode, block_duration,
556 kWebMFlagKeyframe); 556 kWebMFlagKeyframe);
557 } else { 557 } else {
558 cb.AddBlockGroup(track_number, timecode, block_duration, 558 cb.AddBlockGroup(track_number, timecode, block_duration,
559 kWebMFlagKeyframe, data.get(), size); 559 kWebMFlagKeyframe, data.get(), size);
560 } 560 }
561 return cb.Finish(); 561 return cb.Finish();
562 } 562 }
563 563
564 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) { 564 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) {
565 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type); 565 demuxer_->GetStream(type)->Read(read_cb);
566 stream->Read(read_cb);
567 message_loop_.RunUntilIdle(); 566 message_loop_.RunUntilIdle();
568 } 567 }
569 568
570 void ReadAudio(const DemuxerStream::ReadCB& read_cb) { 569 void ReadAudio(const DemuxerStream::ReadCB& read_cb) {
571 Read(DemuxerStream::AUDIO, read_cb); 570 Read(DemuxerStream::AUDIO, read_cb);
572 } 571 }
573 572
574 void ReadVideo(const DemuxerStream::ReadCB& read_cb) { 573 void ReadVideo(const DemuxerStream::ReadCB& read_cb) {
575 Read(DemuxerStream::VIDEO, read_cb); 574 Read(DemuxerStream::VIDEO, read_cb);
576 } 575 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 scoped_refptr<DecoderBuffer>* buffer_out, 657 scoped_refptr<DecoderBuffer>* buffer_out,
659 DemuxerStream::Status status, 658 DemuxerStream::Status status,
660 const scoped_refptr<DecoderBuffer>& buffer) { 659 const scoped_refptr<DecoderBuffer>& buffer) {
661 *status_out = status; 660 *status_out = status;
662 *buffer_out = buffer; 661 *buffer_out = buffer;
663 } 662 }
664 663
665 void ReadUntilNotOkOrEndOfStream(DemuxerStream::Type type, 664 void ReadUntilNotOkOrEndOfStream(DemuxerStream::Type type,
666 DemuxerStream::Status* status, 665 DemuxerStream::Status* status,
667 base::TimeDelta* last_timestamp) { 666 base::TimeDelta* last_timestamp) {
668 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type); 667 DemuxerStream* stream = demuxer_->GetStream(type);
669 scoped_refptr<DecoderBuffer> buffer; 668 scoped_refptr<DecoderBuffer> buffer;
670 669
671 *last_timestamp = kNoTimestamp(); 670 *last_timestamp = kNoTimestamp();
672 do { 671 do {
673 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, 672 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer,
674 base::Unretained(this), status, &buffer)); 673 base::Unretained(this), status, &buffer));
675 MessageLoop::current()->RunUntilIdle(); 674 MessageLoop::current()->RunUntilIdle();
676 if (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()) 675 if (*status == DemuxerStream::kOk && !buffer->IsEndOfStream())
677 *last_timestamp = buffer->GetTimestamp(); 676 *last_timestamp = buffer->GetTimestamp();
678 } while (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()); 677 } while (*status == DemuxerStream::kOk && !buffer->IsEndOfStream());
679 } 678 }
680 679
681 void ExpectEndOfStream(DemuxerStream::Type type) { 680 void ExpectEndOfStream(DemuxerStream::Type type) {
682 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type);
683 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); 681 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream()));
684 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 682 demuxer_->GetStream(type)->Read(base::Bind(
685 base::Unretained(this))); 683 &ChunkDemuxerTest::ReadDone, base::Unretained(this)));
686 message_loop_.RunUntilIdle(); 684 message_loop_.RunUntilIdle();
687 } 685 }
688 686
689 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) { 687 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) {
690 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type);
691 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, 688 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk,
692 HasTimestamp(timestamp_in_ms))); 689 HasTimestamp(timestamp_in_ms)));
693 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 690 demuxer_->GetStream(type)->Read(base::Bind(
694 base::Unretained(this))); 691 &ChunkDemuxerTest::ReadDone, base::Unretained(this)));
695 message_loop_.RunUntilIdle(); 692 message_loop_.RunUntilIdle();
696 } 693 }
697 694
698 void ExpectConfigChanged(DemuxerStream::Type type) { 695 void ExpectConfigChanged(DemuxerStream::Type type) {
699 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type);
700 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); 696 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _));
701 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 697 demuxer_->GetStream(type)->Read(base::Bind(
702 base::Unretained(this))); 698 &ChunkDemuxerTest::ReadDone, base::Unretained(this)));
703 message_loop_.RunUntilIdle(); 699 message_loop_.RunUntilIdle();
704 } 700 }
705 701
706 MOCK_METHOD1(Checkpoint, void(int id)); 702 MOCK_METHOD1(Checkpoint, void(int id));
707 703
708 struct BufferTimestamps { 704 struct BufferTimestamps {
709 int video_time_ms; 705 int video_time_ms;
710 int audio_time_ms; 706 int audio_time_ms;
711 }; 707 };
712 static const int kSkip = -1; 708 static const int kSkip = -1;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 MOCK_METHOD3(NeedKeyMock, void(const std::string& type, 771 MOCK_METHOD3(NeedKeyMock, void(const std::string& type,
776 const uint8* init_data, int init_data_size)); 772 const uint8* init_data, int init_data_size));
777 void DemuxerNeedKey(const std::string& type, 773 void DemuxerNeedKey(const std::string& type,
778 scoped_ptr<uint8[]> init_data, int init_data_size) { 774 scoped_ptr<uint8[]> init_data, int init_data_size) {
779 NeedKeyMock(type, init_data.get(), init_data_size); 775 NeedKeyMock(type, init_data.get(), init_data_size);
780 } 776 }
781 777
782 MessageLoop message_loop_; 778 MessageLoop message_loop_;
783 MockDemuxerHost host_; 779 MockDemuxerHost host_;
784 780
785 scoped_refptr<ChunkDemuxer> demuxer_; 781 scoped_ptr<ChunkDemuxer> demuxer_;
786 782
787 private: 783 private:
788 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 784 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
789 }; 785 };
790 786
791 TEST_F(ChunkDemuxerTest, TestInit) { 787 TEST_F(ChunkDemuxerTest, TestInit) {
792 // Test no streams, audio-only, video-only, and audio & video scenarios. 788 // Test no streams, audio-only, video-only, and audio & video scenarios.
793 // Audio and video streams can be encrypted or not encrypted. 789 // Audio and video streams can be encrypted or not encrypted.
794 for (int i = 0; i < 16; i++) { 790 for (int i = 0; i < 16; i++) {
795 bool has_audio = (i & 0x1) != 0; 791 bool has_audio = (i & 0x1) != 0;
(...skipping 13 matching lines...) Expand all
809 int need_key_count = (is_audio_encrypted ? 1 : 0) + 805 int need_key_count = (is_audio_encrypted ? 1 : 0) +
810 (is_video_encrypted ? 1 : 0); 806 (is_video_encrypted ? 1 : 0);
811 EXPECT_CALL(*this, NeedKeyMock(kWebMEncryptInitDataType, NotNull(), 807 EXPECT_CALL(*this, NeedKeyMock(kWebMEncryptInitDataType, NotNull(),
812 DecryptConfig::kDecryptionKeySize)) 808 DecryptConfig::kDecryptionKeySize))
813 .Times(Exactly(need_key_count)); 809 .Times(Exactly(need_key_count));
814 } 810 }
815 811
816 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( 812 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
817 has_audio, has_video, is_audio_encrypted, is_video_encrypted)); 813 has_audio, has_video, is_audio_encrypted, is_video_encrypted));
818 814
819 scoped_refptr<DemuxerStream> audio_stream = 815 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
820 demuxer_->GetStream(DemuxerStream::AUDIO);
821 if (has_audio) { 816 if (has_audio) {
822 ASSERT_TRUE(audio_stream); 817 ASSERT_TRUE(audio_stream);
823 818
824 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); 819 const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
825 EXPECT_EQ(kCodecVorbis, config.codec()); 820 EXPECT_EQ(kCodecVorbis, config.codec());
826 EXPECT_EQ(32, config.bits_per_channel()); 821 EXPECT_EQ(32, config.bits_per_channel());
827 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); 822 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
828 EXPECT_EQ(44100, config.samples_per_second()); 823 EXPECT_EQ(44100, config.samples_per_second());
829 EXPECT_TRUE(config.extra_data()); 824 EXPECT_TRUE(config.extra_data());
830 EXPECT_GT(config.extra_data_size(), 0u); 825 EXPECT_GT(config.extra_data_size(), 0u);
831 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format()); 826 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format());
832 EXPECT_EQ(is_audio_encrypted, 827 EXPECT_EQ(is_audio_encrypted,
833 audio_stream->audio_decoder_config().is_encrypted()); 828 audio_stream->audio_decoder_config().is_encrypted());
834 } else { 829 } else {
835 EXPECT_FALSE(audio_stream); 830 EXPECT_FALSE(audio_stream);
836 } 831 }
837 832
838 scoped_refptr<DemuxerStream> video_stream = 833 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
839 demuxer_->GetStream(DemuxerStream::VIDEO);
840 if (has_video) { 834 if (has_video) {
841 EXPECT_TRUE(video_stream); 835 EXPECT_TRUE(video_stream);
842 EXPECT_EQ(is_video_encrypted, 836 EXPECT_EQ(is_video_encrypted,
843 video_stream->video_decoder_config().is_encrypted()); 837 video_stream->video_decoder_config().is_encrypted());
844 } else { 838 } else {
845 EXPECT_FALSE(video_stream); 839 EXPECT_FALSE(video_stream);
846 } 840 }
847 841
848 ShutdownDemuxer(); 842 ShutdownDemuxer();
849 demuxer_ = NULL; 843 demuxer_.reset();
850 } 844 }
851 } 845 }
852 846
853 // Make sure that the demuxer reports an error if Shutdown() 847 // Make sure that the demuxer reports an error if Shutdown()
854 // is called before all the initialization segments are appended. 848 // is called before all the initialization segments are appended.
855 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) { 849 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) {
856 EXPECT_CALL(*this, DemuxerOpened()); 850 EXPECT_CALL(*this, DemuxerOpened());
857 demuxer_->Initialize( 851 demuxer_->Initialize(
858 &host_, CreateInitDoneCB( 852 &host_, CreateInitDoneCB(
859 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); 853 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN));
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 demuxer_->Initialize( 1077 demuxer_->Initialize(
1084 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 1078 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
1085 1079
1086 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1080 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1087 1081
1088 CheckExpectedRanges("{ }"); 1082 CheckExpectedRanges("{ }");
1089 demuxer_->EndOfStream(PIPELINE_OK); 1083 demuxer_->EndOfStream(PIPELINE_OK);
1090 ShutdownDemuxer(); 1084 ShutdownDemuxer();
1091 CheckExpectedRanges("{ }"); 1085 CheckExpectedRanges("{ }");
1092 demuxer_->RemoveId(kSourceId); 1086 demuxer_->RemoveId(kSourceId);
1093 demuxer_ = NULL; 1087 demuxer_.reset();
1094 } 1088 }
1095 1089
1096 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { 1090 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) {
1097 ASSERT_TRUE(InitDemuxer(true, true)); 1091 ASSERT_TRUE(InitDemuxer(true, true));
1098 1092
1099 CheckExpectedRanges("{ }"); 1093 CheckExpectedRanges("{ }");
1100 demuxer_->EndOfStream(PIPELINE_OK); 1094 demuxer_->EndOfStream(PIPELINE_OK);
1101 CheckExpectedRanges("{ }"); 1095 CheckExpectedRanges("{ }");
1102 } 1096 }
1103 1097
(...skipping 17 matching lines...) Expand all
1121 CheckExpectedRanges(kDefaultFirstClusterRange); 1115 CheckExpectedRanges(kDefaultFirstClusterRange);
1122 1116
1123 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 1117 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
1124 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); 1118 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK);
1125 } 1119 }
1126 1120
1127 // Helper class to reduce duplicate code when testing end of stream 1121 // Helper class to reduce duplicate code when testing end of stream
1128 // Read() behavior. 1122 // Read() behavior.
1129 class EndOfStreamHelper { 1123 class EndOfStreamHelper {
1130 public: 1124 public:
1131 explicit EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer) 1125 explicit EndOfStreamHelper(Demuxer* demuxer)
1132 : demuxer_(demuxer), 1126 : demuxer_(demuxer),
1133 audio_read_done_(false), 1127 audio_read_done_(false),
1134 video_read_done_(false) { 1128 video_read_done_(false) {
1135 } 1129 }
1136 1130
1137 // Request a read on the audio and video streams. 1131 // Request a read on the audio and video streams.
1138 void RequestReads() { 1132 void RequestReads() {
1139 EXPECT_FALSE(audio_read_done_); 1133 EXPECT_FALSE(audio_read_done_);
1140 EXPECT_FALSE(video_read_done_); 1134 EXPECT_FALSE(video_read_done_);
1141 1135
1142 scoped_refptr<DemuxerStream> audio = 1136 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
1143 demuxer_->GetStream(DemuxerStream::AUDIO); 1137 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
1144 scoped_refptr<DemuxerStream> video =
1145 demuxer_->GetStream(DemuxerStream::VIDEO);
1146 1138
1147 audio->Read(base::Bind(&OnEndOfStreamReadDone, &audio_read_done_)); 1139 audio->Read(base::Bind(&OnEndOfStreamReadDone, &audio_read_done_));
1148 video->Read(base::Bind(&OnEndOfStreamReadDone, &video_read_done_)); 1140 video->Read(base::Bind(&OnEndOfStreamReadDone, &video_read_done_));
1149 MessageLoop::current()->RunUntilIdle(); 1141 MessageLoop::current()->RunUntilIdle();
1150 } 1142 }
1151 1143
1152 // Check to see if |audio_read_done_| and |video_read_done_| variables 1144 // Check to see if |audio_read_done_| and |video_read_done_| variables
1153 // match |expected|. 1145 // match |expected|.
1154 void CheckIfReadDonesWereCalled(bool expected) { 1146 void CheckIfReadDonesWereCalled(bool expected) {
1155 EXPECT_EQ(expected, audio_read_done_); 1147 EXPECT_EQ(expected, audio_read_done_);
1156 EXPECT_EQ(expected, video_read_done_); 1148 EXPECT_EQ(expected, video_read_done_);
1157 } 1149 }
1158 1150
1159 private: 1151 private:
1160 static void OnEndOfStreamReadDone( 1152 static void OnEndOfStreamReadDone(
1161 bool* called, 1153 bool* called,
1162 DemuxerStream::Status status, 1154 DemuxerStream::Status status,
1163 const scoped_refptr<DecoderBuffer>& buffer) { 1155 const scoped_refptr<DecoderBuffer>& buffer) {
1164 EXPECT_EQ(status, DemuxerStream::kOk); 1156 EXPECT_EQ(status, DemuxerStream::kOk);
1165 EXPECT_TRUE(buffer->IsEndOfStream()); 1157 EXPECT_TRUE(buffer->IsEndOfStream());
1166 *called = true; 1158 *called = true;
1167 } 1159 }
1168 1160
1169 scoped_refptr<Demuxer> demuxer_; 1161 Demuxer* demuxer_;
1170 bool audio_read_done_; 1162 bool audio_read_done_;
1171 bool video_read_done_; 1163 bool video_read_done_;
1172 1164
1173 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); 1165 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
1174 }; 1166 };
1175 1167
1176 // Make sure that all pending reads that we don't have media data for get an 1168 // Make sure that all pending reads that we don't have media data for get an
1177 // "end of stream" buffer when EndOfStream() is called. 1169 // "end of stream" buffer when EndOfStream() is called.
1178 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { 1170 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) {
1179 ASSERT_TRUE(InitDemuxer(true, true)); 1171 ASSERT_TRUE(InitDemuxer(true, true));
1180 1172
1181 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); 1173 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
1182 AppendData(cluster->data(), cluster->size()); 1174 AppendData(cluster->data(), cluster->size());
1183 1175
1184 bool audio_read_done_1 = false; 1176 bool audio_read_done_1 = false;
1185 bool video_read_done_1 = false; 1177 bool video_read_done_1 = false;
1186 EndOfStreamHelper end_of_stream_helper_1(demuxer_); 1178 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1187 EndOfStreamHelper end_of_stream_helper_2(demuxer_); 1179 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1188 1180
1189 ReadAudio(base::Bind(&OnReadDone, 1181 ReadAudio(base::Bind(&OnReadDone,
1190 base::TimeDelta::FromMilliseconds(0), 1182 base::TimeDelta::FromMilliseconds(0),
1191 &audio_read_done_1)); 1183 &audio_read_done_1));
1192 ReadVideo(base::Bind(&OnReadDone, 1184 ReadVideo(base::Bind(&OnReadDone,
1193 base::TimeDelta::FromMilliseconds(0), 1185 base::TimeDelta::FromMilliseconds(0),
1194 &video_read_done_1)); 1186 &video_read_done_1));
1195 1187
1196 end_of_stream_helper_1.RequestReads(); 1188 end_of_stream_helper_1.RequestReads();
1197 end_of_stream_helper_2.RequestReads(); 1189 end_of_stream_helper_2.RequestReads();
(...skipping 14 matching lines...) Expand all
1212 // Make sure that all Read() calls after we get an EndOfStream() 1204 // Make sure that all Read() calls after we get an EndOfStream()
1213 // call return an "end of stream" buffer. 1205 // call return an "end of stream" buffer.
1214 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { 1206 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) {
1215 ASSERT_TRUE(InitDemuxer(true, true)); 1207 ASSERT_TRUE(InitDemuxer(true, true));
1216 1208
1217 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); 1209 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
1218 AppendData(cluster->data(), cluster->size()); 1210 AppendData(cluster->data(), cluster->size());
1219 1211
1220 bool audio_read_done_1 = false; 1212 bool audio_read_done_1 = false;
1221 bool video_read_done_1 = false; 1213 bool video_read_done_1 = false;
1222 EndOfStreamHelper end_of_stream_helper_1(demuxer_); 1214 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1223 EndOfStreamHelper end_of_stream_helper_2(demuxer_); 1215 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1224 EndOfStreamHelper end_of_stream_helper_3(demuxer_); 1216 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get());
1225 1217
1226 ReadAudio(base::Bind(&OnReadDone, 1218 ReadAudio(base::Bind(&OnReadDone,
1227 base::TimeDelta::FromMilliseconds(0), 1219 base::TimeDelta::FromMilliseconds(0),
1228 &audio_read_done_1)); 1220 &audio_read_done_1));
1229 ReadVideo(base::Bind(&OnReadDone, 1221 ReadVideo(base::Bind(&OnReadDone,
1230 base::TimeDelta::FromMilliseconds(0), 1222 base::TimeDelta::FromMilliseconds(0),
1231 &video_read_done_1)); 1223 &video_read_done_1));
1232 1224
1233 end_of_stream_helper_1.RequestReads(); 1225 end_of_stream_helper_1.RequestReads();
1234 1226
(...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after
2117 EXPECT_CALL(host_, SetDuration( 2109 EXPECT_CALL(host_, SetDuration(
2118 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); 2110 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp)));
2119 demuxer_->EndOfStream(PIPELINE_OK); 2111 demuxer_->EndOfStream(PIPELINE_OK);
2120 2112
2121 demuxer_->Seek(base::TimeDelta::FromSeconds(0), 2113 demuxer_->Seek(base::TimeDelta::FromSeconds(0),
2122 NewExpectedStatusCB(PIPELINE_OK)); 2114 NewExpectedStatusCB(PIPELINE_OK));
2123 2115
2124 GenerateExpectedReads(0, 4); 2116 GenerateExpectedReads(0, 4);
2125 GenerateExpectedReads(46, 66, 5); 2117 GenerateExpectedReads(46, 66, 5);
2126 2118
2127 EndOfStreamHelper end_of_stream_helper(demuxer_); 2119 EndOfStreamHelper end_of_stream_helper(demuxer_.get());
2128 end_of_stream_helper.RequestReads(); 2120 end_of_stream_helper.RequestReads();
2129 end_of_stream_helper.CheckIfReadDonesWereCalled(true); 2121 end_of_stream_helper.CheckIfReadDonesWereCalled(true);
2130 } 2122 }
2131 2123
2132 TEST_F(ChunkDemuxerTest, TestConfigChange_Video) { 2124 TEST_F(ChunkDemuxerTest, TestConfigChange_Video) {
2133 InSequence s; 2125 InSequence s;
2134 2126
2135 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2127 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2136 2128
2137 DemuxerStream::Status status; 2129 DemuxerStream::Status status;
2138 base::TimeDelta last_timestamp; 2130 base::TimeDelta last_timestamp;
2139 2131
2140 scoped_refptr<DemuxerStream> video = 2132 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
2141 demuxer_->GetStream(DemuxerStream::VIDEO);
2142 2133
2143 // Fetch initial video config and verify it matches what we expect. 2134 // Fetch initial video config and verify it matches what we expect.
2144 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); 2135 const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
2145 ASSERT_TRUE(video_config_1.IsValidConfig()); 2136 ASSERT_TRUE(video_config_1.IsValidConfig());
2146 EXPECT_EQ(video_config_1.natural_size().width(), 320); 2137 EXPECT_EQ(video_config_1.natural_size().width(), 320);
2147 EXPECT_EQ(video_config_1.natural_size().height(), 240); 2138 EXPECT_EQ(video_config_1.natural_size().height(), 240);
2148 2139
2149 ExpectRead(DemuxerStream::VIDEO, 0); 2140 ExpectRead(DemuxerStream::VIDEO, 0);
2150 2141
2151 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 2142 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
(...skipping 26 matching lines...) Expand all
2178 } 2169 }
2179 2170
2180 TEST_F(ChunkDemuxerTest, TestConfigChange_Audio) { 2171 TEST_F(ChunkDemuxerTest, TestConfigChange_Audio) {
2181 InSequence s; 2172 InSequence s;
2182 2173
2183 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2174 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2184 2175
2185 DemuxerStream::Status status; 2176 DemuxerStream::Status status;
2186 base::TimeDelta last_timestamp; 2177 base::TimeDelta last_timestamp;
2187 2178
2188 scoped_refptr<DemuxerStream> audio = 2179 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
2189 demuxer_->GetStream(DemuxerStream::AUDIO);
2190 2180
2191 // Fetch initial audio config and verify it matches what we expect. 2181 // Fetch initial audio config and verify it matches what we expect.
2192 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); 2182 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config();
2193 ASSERT_TRUE(audio_config_1.IsValidConfig()); 2183 ASSERT_TRUE(audio_config_1.IsValidConfig());
2194 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); 2184 EXPECT_EQ(audio_config_1.samples_per_second(), 44100);
2195 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); 2185 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u);
2196 2186
2197 ExpectRead(DemuxerStream::AUDIO, 0); 2187 ExpectRead(DemuxerStream::AUDIO, 0);
2198 2188
2199 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2189 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
(...skipping 23 matching lines...) Expand all
2223 // config changes. 2213 // config changes.
2224 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2214 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2225 ASSERT_EQ(status, DemuxerStream::kOk); 2215 ASSERT_EQ(status, DemuxerStream::kOk);
2226 } 2216 }
2227 2217
2228 TEST_F(ChunkDemuxerTest, TestConfigChange_Seek) { 2218 TEST_F(ChunkDemuxerTest, TestConfigChange_Seek) {
2229 InSequence s; 2219 InSequence s;
2230 2220
2231 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2221 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2232 2222
2233 scoped_refptr<DemuxerStream> video = 2223 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
2234 demuxer_->GetStream(DemuxerStream::VIDEO);
2235 2224
2236 // Fetch initial video config and verify it matches what we expect. 2225 // Fetch initial video config and verify it matches what we expect.
2237 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); 2226 const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
2238 ASSERT_TRUE(video_config_1.IsValidConfig()); 2227 ASSERT_TRUE(video_config_1.IsValidConfig());
2239 EXPECT_EQ(video_config_1.natural_size().width(), 320); 2228 EXPECT_EQ(video_config_1.natural_size().width(), 320);
2240 EXPECT_EQ(video_config_1.natural_size().height(), 240); 2229 EXPECT_EQ(video_config_1.natural_size().height(), 240);
2241 2230
2242 ExpectRead(DemuxerStream::VIDEO, 0); 2231 ExpectRead(DemuxerStream::VIDEO, 0);
2243 2232
2244 // Seek to a location with a different config. 2233 // Seek to a location with a different config.
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
2449 // call. This can happen if video element gets destroyed before 2438 // call. This can happen if video element gets destroyed before
2450 // the pipeline has a chance to initialize the demuxer. 2439 // the pipeline has a chance to initialize the demuxer.
2451 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) { 2440 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) {
2452 demuxer_->Shutdown(); 2441 demuxer_->Shutdown();
2453 demuxer_->Initialize( 2442 demuxer_->Initialize(
2454 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 2443 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN));
2455 message_loop_.RunUntilIdle(); 2444 message_loop_.RunUntilIdle();
2456 } 2445 }
2457 2446
2458 } // namespace media 2447 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698