| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 839 demuxer_->GetStream(DemuxerStream::VIDEO); | 835 demuxer_->GetStream(DemuxerStream::VIDEO); |
| 840 if (has_video) { | 836 if (has_video) { |
| 841 EXPECT_TRUE(video_stream); | 837 EXPECT_TRUE(video_stream); |
| 842 EXPECT_EQ(is_video_encrypted, | 838 EXPECT_EQ(is_video_encrypted, |
| 843 video_stream->video_decoder_config().is_encrypted()); | 839 video_stream->video_decoder_config().is_encrypted()); |
| 844 } else { | 840 } else { |
| 845 EXPECT_FALSE(video_stream); | 841 EXPECT_FALSE(video_stream); |
| 846 } | 842 } |
| 847 | 843 |
| 848 ShutdownDemuxer(); | 844 ShutdownDemuxer(); |
| 849 demuxer_ = NULL; | 845 demuxer_.reset(); |
| 850 } | 846 } |
| 851 } | 847 } |
| 852 | 848 |
| 853 // Make sure that the demuxer reports an error if Shutdown() | 849 // Make sure that the demuxer reports an error if Shutdown() |
| 854 // is called before all the initialization segments are appended. | 850 // is called before all the initialization segments are appended. |
| 855 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) { | 851 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) { |
| 856 EXPECT_CALL(*this, DemuxerOpened()); | 852 EXPECT_CALL(*this, DemuxerOpened()); |
| 857 demuxer_->Initialize( | 853 demuxer_->Initialize( |
| 858 &host_, CreateInitDoneCB( | 854 &host_, CreateInitDoneCB( |
| 859 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); | 855 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 demuxer_->Initialize( | 1079 demuxer_->Initialize( |
| 1084 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 1080 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
| 1085 | 1081 |
| 1086 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 1082 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
| 1087 | 1083 |
| 1088 CheckExpectedRanges("{ }"); | 1084 CheckExpectedRanges("{ }"); |
| 1089 demuxer_->EndOfStream(PIPELINE_OK); | 1085 demuxer_->EndOfStream(PIPELINE_OK); |
| 1090 ShutdownDemuxer(); | 1086 ShutdownDemuxer(); |
| 1091 CheckExpectedRanges("{ }"); | 1087 CheckExpectedRanges("{ }"); |
| 1092 demuxer_->RemoveId(kSourceId); | 1088 demuxer_->RemoveId(kSourceId); |
| 1093 demuxer_ = NULL; | 1089 demuxer_.reset(); |
| 1094 } | 1090 } |
| 1095 | 1091 |
| 1096 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { | 1092 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { |
| 1097 ASSERT_TRUE(InitDemuxer(true, true)); | 1093 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1098 | 1094 |
| 1099 CheckExpectedRanges("{ }"); | 1095 CheckExpectedRanges("{ }"); |
| 1100 demuxer_->EndOfStream(PIPELINE_OK); | 1096 demuxer_->EndOfStream(PIPELINE_OK); |
| 1101 CheckExpectedRanges("{ }"); | 1097 CheckExpectedRanges("{ }"); |
| 1102 } | 1098 } |
| 1103 | 1099 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1121 CheckExpectedRanges(kDefaultFirstClusterRange); | 1117 CheckExpectedRanges(kDefaultFirstClusterRange); |
| 1122 | 1118 |
| 1123 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); | 1119 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); |
| 1124 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); | 1120 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); |
| 1125 } | 1121 } |
| 1126 | 1122 |
| 1127 // Helper class to reduce duplicate code when testing end of stream | 1123 // Helper class to reduce duplicate code when testing end of stream |
| 1128 // Read() behavior. | 1124 // Read() behavior. |
| 1129 class EndOfStreamHelper { | 1125 class EndOfStreamHelper { |
| 1130 public: | 1126 public: |
| 1131 explicit EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer) | 1127 explicit EndOfStreamHelper(Demuxer* demuxer) |
| 1132 : demuxer_(demuxer), | 1128 : demuxer_(demuxer), |
| 1133 audio_read_done_(false), | 1129 audio_read_done_(false), |
| 1134 video_read_done_(false) { | 1130 video_read_done_(false) { |
| 1135 } | 1131 } |
| 1136 | 1132 |
| 1137 // Request a read on the audio and video streams. | 1133 // Request a read on the audio and video streams. |
| 1138 void RequestReads() { | 1134 void RequestReads() { |
| 1139 EXPECT_FALSE(audio_read_done_); | 1135 EXPECT_FALSE(audio_read_done_); |
| 1140 EXPECT_FALSE(video_read_done_); | 1136 EXPECT_FALSE(video_read_done_); |
| 1141 | 1137 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1159 private: | 1155 private: |
| 1160 static void OnEndOfStreamReadDone( | 1156 static void OnEndOfStreamReadDone( |
| 1161 bool* called, | 1157 bool* called, |
| 1162 DemuxerStream::Status status, | 1158 DemuxerStream::Status status, |
| 1163 const scoped_refptr<DecoderBuffer>& buffer) { | 1159 const scoped_refptr<DecoderBuffer>& buffer) { |
| 1164 EXPECT_EQ(status, DemuxerStream::kOk); | 1160 EXPECT_EQ(status, DemuxerStream::kOk); |
| 1165 EXPECT_TRUE(buffer->IsEndOfStream()); | 1161 EXPECT_TRUE(buffer->IsEndOfStream()); |
| 1166 *called = true; | 1162 *called = true; |
| 1167 } | 1163 } |
| 1168 | 1164 |
| 1169 scoped_refptr<Demuxer> demuxer_; | 1165 Demuxer* demuxer_; |
| 1170 bool audio_read_done_; | 1166 bool audio_read_done_; |
| 1171 bool video_read_done_; | 1167 bool video_read_done_; |
| 1172 | 1168 |
| 1173 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); | 1169 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); |
| 1174 }; | 1170 }; |
| 1175 | 1171 |
| 1176 // Make sure that all pending reads that we don't have media data for get an | 1172 // 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. | 1173 // "end of stream" buffer when EndOfStream() is called. |
| 1178 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { | 1174 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { |
| 1179 ASSERT_TRUE(InitDemuxer(true, true)); | 1175 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1180 | 1176 |
| 1181 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); | 1177 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); |
| 1182 AppendData(cluster->data(), cluster->size()); | 1178 AppendData(cluster->data(), cluster->size()); |
| 1183 | 1179 |
| 1184 bool audio_read_done_1 = false; | 1180 bool audio_read_done_1 = false; |
| 1185 bool video_read_done_1 = false; | 1181 bool video_read_done_1 = false; |
| 1186 EndOfStreamHelper end_of_stream_helper_1(demuxer_); | 1182 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); |
| 1187 EndOfStreamHelper end_of_stream_helper_2(demuxer_); | 1183 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); |
| 1188 | 1184 |
| 1189 ReadAudio(base::Bind(&OnReadDone, | 1185 ReadAudio(base::Bind(&OnReadDone, |
| 1190 base::TimeDelta::FromMilliseconds(0), | 1186 base::TimeDelta::FromMilliseconds(0), |
| 1191 &audio_read_done_1)); | 1187 &audio_read_done_1)); |
| 1192 ReadVideo(base::Bind(&OnReadDone, | 1188 ReadVideo(base::Bind(&OnReadDone, |
| 1193 base::TimeDelta::FromMilliseconds(0), | 1189 base::TimeDelta::FromMilliseconds(0), |
| 1194 &video_read_done_1)); | 1190 &video_read_done_1)); |
| 1195 | 1191 |
| 1196 end_of_stream_helper_1.RequestReads(); | 1192 end_of_stream_helper_1.RequestReads(); |
| 1197 end_of_stream_helper_2.RequestReads(); | 1193 end_of_stream_helper_2.RequestReads(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1212 // Make sure that all Read() calls after we get an EndOfStream() | 1208 // Make sure that all Read() calls after we get an EndOfStream() |
| 1213 // call return an "end of stream" buffer. | 1209 // call return an "end of stream" buffer. |
| 1214 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { | 1210 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { |
| 1215 ASSERT_TRUE(InitDemuxer(true, true)); | 1211 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1216 | 1212 |
| 1217 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); | 1213 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); |
| 1218 AppendData(cluster->data(), cluster->size()); | 1214 AppendData(cluster->data(), cluster->size()); |
| 1219 | 1215 |
| 1220 bool audio_read_done_1 = false; | 1216 bool audio_read_done_1 = false; |
| 1221 bool video_read_done_1 = false; | 1217 bool video_read_done_1 = false; |
| 1222 EndOfStreamHelper end_of_stream_helper_1(demuxer_); | 1218 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); |
| 1223 EndOfStreamHelper end_of_stream_helper_2(demuxer_); | 1219 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); |
| 1224 EndOfStreamHelper end_of_stream_helper_3(demuxer_); | 1220 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get()); |
| 1225 | 1221 |
| 1226 ReadAudio(base::Bind(&OnReadDone, | 1222 ReadAudio(base::Bind(&OnReadDone, |
| 1227 base::TimeDelta::FromMilliseconds(0), | 1223 base::TimeDelta::FromMilliseconds(0), |
| 1228 &audio_read_done_1)); | 1224 &audio_read_done_1)); |
| 1229 ReadVideo(base::Bind(&OnReadDone, | 1225 ReadVideo(base::Bind(&OnReadDone, |
| 1230 base::TimeDelta::FromMilliseconds(0), | 1226 base::TimeDelta::FromMilliseconds(0), |
| 1231 &video_read_done_1)); | 1227 &video_read_done_1)); |
| 1232 | 1228 |
| 1233 end_of_stream_helper_1.RequestReads(); | 1229 end_of_stream_helper_1.RequestReads(); |
| 1234 | 1230 |
| (...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2117 EXPECT_CALL(host_, SetDuration( | 2113 EXPECT_CALL(host_, SetDuration( |
| 2118 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); | 2114 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); |
| 2119 demuxer_->EndOfStream(PIPELINE_OK); | 2115 demuxer_->EndOfStream(PIPELINE_OK); |
| 2120 | 2116 |
| 2121 demuxer_->Seek(base::TimeDelta::FromSeconds(0), | 2117 demuxer_->Seek(base::TimeDelta::FromSeconds(0), |
| 2122 NewExpectedStatusCB(PIPELINE_OK)); | 2118 NewExpectedStatusCB(PIPELINE_OK)); |
| 2123 | 2119 |
| 2124 GenerateExpectedReads(0, 4); | 2120 GenerateExpectedReads(0, 4); |
| 2125 GenerateExpectedReads(46, 66, 5); | 2121 GenerateExpectedReads(46, 66, 5); |
| 2126 | 2122 |
| 2127 EndOfStreamHelper end_of_stream_helper(demuxer_); | 2123 EndOfStreamHelper end_of_stream_helper(demuxer_.get()); |
| 2128 end_of_stream_helper.RequestReads(); | 2124 end_of_stream_helper.RequestReads(); |
| 2129 end_of_stream_helper.CheckIfReadDonesWereCalled(true); | 2125 end_of_stream_helper.CheckIfReadDonesWereCalled(true); |
| 2130 } | 2126 } |
| 2131 | 2127 |
| 2132 TEST_F(ChunkDemuxerTest, TestConfigChange_Video) { | 2128 TEST_F(ChunkDemuxerTest, TestConfigChange_Video) { |
| 2133 InSequence s; | 2129 InSequence s; |
| 2134 | 2130 |
| 2135 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); | 2131 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); |
| 2136 | 2132 |
| 2137 DemuxerStream::Status status; | 2133 DemuxerStream::Status status; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2178 } | 2174 } |
| 2179 | 2175 |
| 2180 TEST_F(ChunkDemuxerTest, TestConfigChange_Audio) { | 2176 TEST_F(ChunkDemuxerTest, TestConfigChange_Audio) { |
| 2181 InSequence s; | 2177 InSequence s; |
| 2182 | 2178 |
| 2183 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); | 2179 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); |
| 2184 | 2180 |
| 2185 DemuxerStream::Status status; | 2181 DemuxerStream::Status status; |
| 2186 base::TimeDelta last_timestamp; | 2182 base::TimeDelta last_timestamp; |
| 2187 | 2183 |
| 2188 scoped_refptr<DemuxerStream> audio = | 2184 scoped_refptr<DemuxerStream> audio = |
| 2189 demuxer_->GetStream(DemuxerStream::AUDIO); | 2185 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 2190 | 2186 |
| 2191 // Fetch initial audio config and verify it matches what we expect. | 2187 // Fetch initial audio config and verify it matches what we expect. |
| 2192 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); | 2188 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); |
| 2193 ASSERT_TRUE(audio_config_1.IsValidConfig()); | 2189 ASSERT_TRUE(audio_config_1.IsValidConfig()); |
| 2194 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); | 2190 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); |
| 2195 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); | 2191 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); |
| 2196 | 2192 |
| 2197 ExpectRead(DemuxerStream::AUDIO, 0); | 2193 ExpectRead(DemuxerStream::AUDIO, 0); |
| 2198 | 2194 |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2449 // call. This can happen if video element gets destroyed before | 2445 // call. This can happen if video element gets destroyed before |
| 2450 // the pipeline has a chance to initialize the demuxer. | 2446 // the pipeline has a chance to initialize the demuxer. |
| 2451 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) { | 2447 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) { |
| 2452 demuxer_->Shutdown(); | 2448 demuxer_->Shutdown(); |
| 2453 demuxer_->Initialize( | 2449 demuxer_->Initialize( |
| 2454 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 2450 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
| 2455 message_loop_.RunUntilIdle(); | 2451 message_loop_.RunUntilIdle(); |
| 2456 } | 2452 } |
| 2457 | 2453 |
| 2458 } // namespace media | 2454 } // namespace media |
| OLD | NEW |