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

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

Issue 19649007: Update the WebMediaSourceClientImpl & ChunkDemuxer to received explicit end of stream cancellation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make chromium style enforcers happy Created 7 years, 5 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') | media/filters/pipeline_integration_test.cc » ('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) 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/message_loop.h" 8 #include "base/message_loop/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 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 // Append a media segment that goes from [0.527000, 1.014000). 474 // Append a media segment that goes from [0.527000, 1.014000).
475 AppendData(bear2->data() + 55290, 18785); 475 AppendData(bear2->data() + 55290, 18785);
476 CheckExpectedRanges(kSourceId, "{ [0,1028) [1201,2737) }"); 476 CheckExpectedRanges(kSourceId, "{ [0,1028) [1201,2737) }");
477 477
478 // Append initialization segment for bear1 & fill gap with [779-1197) 478 // Append initialization segment for bear1 & fill gap with [779-1197)
479 // segment. 479 // segment.
480 AppendData(bear1->data(), 4370); 480 AppendData(bear1->data(), 4370);
481 AppendData(bear1->data() + 72737, 28183); 481 AppendData(bear1->data() + 72737, 28183);
482 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); 482 CheckExpectedRanges(kSourceId, "{ [0,2737) }");
483 483
484 EndOfStream(PIPELINE_OK); 484 MarkEndOfStream(PIPELINE_OK);
485 return true; 485 return true;
486 } 486 }
487 487
488 void ShutdownDemuxer() { 488 void ShutdownDemuxer() {
489 if (demuxer_) { 489 if (demuxer_) {
490 demuxer_->Shutdown(); 490 demuxer_->Shutdown();
491 message_loop_.RunUntilIdle(); 491 message_loop_.RunUntilIdle();
492 } 492 }
493 } 493 }
494 494
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 const std::string& language) { 814 const std::string& language) {
815 return scoped_ptr<TextTrack>(); 815 return scoped_ptr<TextTrack>();
816 } 816 }
817 817
818 void Seek(base::TimeDelta seek_time) { 818 void Seek(base::TimeDelta seek_time) {
819 demuxer_->StartWaitingForSeek(seek_time); 819 demuxer_->StartWaitingForSeek(seek_time);
820 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); 820 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
821 message_loop_.RunUntilIdle(); 821 message_loop_.RunUntilIdle();
822 } 822 }
823 823
824 void EndOfStream(PipelineStatus status) { 824 void MarkEndOfStream(PipelineStatus status) {
825 demuxer_->EndOfStream(status); 825 demuxer_->MarkEndOfStream(status);
826 message_loop_.RunUntilIdle(); 826 message_loop_.RunUntilIdle();
827 } 827 }
828 828
829 base::MessageLoop message_loop_; 829 base::MessageLoop message_loop_;
830 MockDemuxerHost host_; 830 MockDemuxerHost host_;
831 831
832 scoped_ptr<ChunkDemuxer> demuxer_; 832 scoped_ptr<ChunkDemuxer> demuxer_;
833 833
834 private: 834 private:
835 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 835 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 demuxer_->Initialize( 1107 demuxer_->Initialize(
1108 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 1108 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
1109 1109
1110 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1110 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1111 1111
1112 scoped_ptr<Cluster> cluster(GenerateCluster(0, 1)); 1112 scoped_ptr<Cluster> cluster(GenerateCluster(0, 1));
1113 1113
1114 AppendData(cluster->data(), cluster->size()); 1114 AppendData(cluster->data(), cluster->size());
1115 } 1115 }
1116 1116
1117 // Test cases where we get an EndOfStream() call during initialization. 1117 // Test cases where we get an MarkEndOfStream() call during initialization.
1118 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) { 1118 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) {
1119 EXPECT_CALL(*this, DemuxerOpened()); 1119 EXPECT_CALL(*this, DemuxerOpened());
1120 demuxer_->Initialize( 1120 demuxer_->Initialize(
1121 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 1121 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
1122 EndOfStream(PIPELINE_OK); 1122 MarkEndOfStream(PIPELINE_OK);
1123 } 1123 }
1124 1124
1125 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoAppend) { 1125 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoAppend) {
1126 EXPECT_CALL(*this, DemuxerOpened()); 1126 EXPECT_CALL(*this, DemuxerOpened());
1127 demuxer_->Initialize( 1127 demuxer_->Initialize(
1128 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 1128 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
1129 1129
1130 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1130 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1131 1131
1132 CheckExpectedRanges("{ }"); 1132 CheckExpectedRanges("{ }");
1133 EndOfStream(PIPELINE_OK); 1133 MarkEndOfStream(PIPELINE_OK);
1134 ShutdownDemuxer(); 1134 ShutdownDemuxer();
1135 CheckExpectedRanges("{ }"); 1135 CheckExpectedRanges("{ }");
1136 demuxer_->RemoveId(kSourceId); 1136 demuxer_->RemoveId(kSourceId);
1137 demuxer_.reset(); 1137 demuxer_.reset();
1138 } 1138 }
1139 1139
1140 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { 1140 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) {
1141 ASSERT_TRUE(InitDemuxer(true, true)); 1141 ASSERT_TRUE(InitDemuxer(true, true));
1142 1142
1143 CheckExpectedRanges("{ }"); 1143 CheckExpectedRanges("{ }");
1144 EndOfStream(PIPELINE_OK); 1144 MarkEndOfStream(PIPELINE_OK);
1145 CheckExpectedRanges("{ }"); 1145 CheckExpectedRanges("{ }");
1146 } 1146 }
1147 1147
1148 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { 1148 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) {
1149 ASSERT_TRUE(InitDemuxer(true, true)); 1149 ASSERT_TRUE(InitDemuxer(true, true));
1150 1150
1151 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 1151 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
1152 AppendData(cluster->data(), cluster->size()); 1152 AppendData(cluster->data(), cluster->size());
1153 CheckExpectedRanges(kDefaultFirstClusterRange); 1153 CheckExpectedRanges(kDefaultFirstClusterRange);
1154 1154
1155 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1155 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1156 EndOfStream(PIPELINE_ERROR_DECODE); 1156 MarkEndOfStream(PIPELINE_ERROR_DECODE);
1157 CheckExpectedRanges(kDefaultFirstClusterRange); 1157 CheckExpectedRanges(kDefaultFirstClusterRange);
1158 } 1158 }
1159 1159
1160 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) { 1160 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) {
1161 ASSERT_TRUE(InitDemuxer(true, true)); 1161 ASSERT_TRUE(InitDemuxer(true, true));
1162 1162
1163 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 1163 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
1164 AppendData(cluster->data(), cluster->size()); 1164 AppendData(cluster->data(), cluster->size());
1165 CheckExpectedRanges(kDefaultFirstClusterRange); 1165 CheckExpectedRanges(kDefaultFirstClusterRange);
1166 1166
1167 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 1167 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
1168 EndOfStream(PIPELINE_ERROR_NETWORK); 1168 MarkEndOfStream(PIPELINE_ERROR_NETWORK);
1169 } 1169 }
1170 1170
1171 // Helper class to reduce duplicate code when testing end of stream 1171 // Helper class to reduce duplicate code when testing end of stream
1172 // Read() behavior. 1172 // Read() behavior.
1173 class EndOfStreamHelper { 1173 class EndOfStreamHelper {
1174 public: 1174 public:
1175 explicit EndOfStreamHelper(Demuxer* demuxer) 1175 explicit EndOfStreamHelper(Demuxer* demuxer)
1176 : demuxer_(demuxer), 1176 : demuxer_(demuxer),
1177 audio_read_done_(false), 1177 audio_read_done_(false),
1178 video_read_done_(false) { 1178 video_read_done_(false) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 } 1210 }
1211 1211
1212 Demuxer* demuxer_; 1212 Demuxer* demuxer_;
1213 bool audio_read_done_; 1213 bool audio_read_done_;
1214 bool video_read_done_; 1214 bool video_read_done_;
1215 1215
1216 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); 1216 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
1217 }; 1217 };
1218 1218
1219 // Make sure that all pending reads that we don't have media data for get an 1219 // Make sure that all pending reads that we don't have media data for get an
1220 // "end of stream" buffer when EndOfStream() is called. 1220 // "end of stream" buffer when MarkEndOfStream() is called.
1221 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { 1221 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) {
1222 ASSERT_TRUE(InitDemuxer(true, true)); 1222 ASSERT_TRUE(InitDemuxer(true, true));
1223 1223
1224 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); 1224 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
1225 AppendData(cluster->data(), cluster->size()); 1225 AppendData(cluster->data(), cluster->size());
1226 1226
1227 bool audio_read_done_1 = false; 1227 bool audio_read_done_1 = false;
1228 bool video_read_done_1 = false; 1228 bool video_read_done_1 = false;
1229 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 1229 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1230 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 1230 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1231 1231
1232 ReadAudio(base::Bind(&OnReadDone, 1232 ReadAudio(base::Bind(&OnReadDone,
1233 base::TimeDelta::FromMilliseconds(0), 1233 base::TimeDelta::FromMilliseconds(0),
1234 &audio_read_done_1)); 1234 &audio_read_done_1));
1235 ReadVideo(base::Bind(&OnReadDone, 1235 ReadVideo(base::Bind(&OnReadDone,
1236 base::TimeDelta::FromMilliseconds(0), 1236 base::TimeDelta::FromMilliseconds(0),
1237 &video_read_done_1)); 1237 &video_read_done_1));
1238 message_loop_.RunUntilIdle(); 1238 message_loop_.RunUntilIdle();
1239 1239
1240 EXPECT_TRUE(audio_read_done_1); 1240 EXPECT_TRUE(audio_read_done_1);
1241 EXPECT_TRUE(video_read_done_1); 1241 EXPECT_TRUE(video_read_done_1);
1242 1242
1243 end_of_stream_helper_1.RequestReads(); 1243 end_of_stream_helper_1.RequestReads();
1244 1244
1245 EXPECT_CALL(host_, SetDuration( 1245 EXPECT_CALL(host_, SetDuration(
1246 base::TimeDelta::FromMilliseconds(kVideoBlockDuration))); 1246 base::TimeDelta::FromMilliseconds(kVideoBlockDuration)));
1247 EndOfStream(PIPELINE_OK); 1247 MarkEndOfStream(PIPELINE_OK);
1248 1248
1249 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); 1249 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
1250 1250
1251 end_of_stream_helper_2.RequestReads(); 1251 end_of_stream_helper_2.RequestReads();
1252 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1252 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1253 } 1253 }
1254 1254
1255 // Make sure that all Read() calls after we get an EndOfStream() 1255 // Make sure that all Read() calls after we get an MarkEndOfStream()
1256 // call return an "end of stream" buffer. 1256 // call return an "end of stream" buffer.
1257 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { 1257 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) {
1258 ASSERT_TRUE(InitDemuxer(true, true)); 1258 ASSERT_TRUE(InitDemuxer(true, true));
1259 1259
1260 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); 1260 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
1261 AppendData(cluster->data(), cluster->size()); 1261 AppendData(cluster->data(), cluster->size());
1262 1262
1263 bool audio_read_done_1 = false; 1263 bool audio_read_done_1 = false;
1264 bool video_read_done_1 = false; 1264 bool video_read_done_1 = false;
1265 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 1265 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1266 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 1266 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1267 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get()); 1267 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get());
1268 1268
1269 ReadAudio(base::Bind(&OnReadDone, 1269 ReadAudio(base::Bind(&OnReadDone,
1270 base::TimeDelta::FromMilliseconds(0), 1270 base::TimeDelta::FromMilliseconds(0),
1271 &audio_read_done_1)); 1271 &audio_read_done_1));
1272 ReadVideo(base::Bind(&OnReadDone, 1272 ReadVideo(base::Bind(&OnReadDone,
1273 base::TimeDelta::FromMilliseconds(0), 1273 base::TimeDelta::FromMilliseconds(0),
1274 &video_read_done_1)); 1274 &video_read_done_1));
1275 1275
1276 end_of_stream_helper_1.RequestReads(); 1276 end_of_stream_helper_1.RequestReads();
1277 1277
1278 EXPECT_TRUE(audio_read_done_1); 1278 EXPECT_TRUE(audio_read_done_1);
1279 EXPECT_TRUE(video_read_done_1); 1279 EXPECT_TRUE(video_read_done_1);
1280 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false); 1280 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false);
1281 1281
1282 EXPECT_CALL(host_, SetDuration( 1282 EXPECT_CALL(host_, SetDuration(
1283 base::TimeDelta::FromMilliseconds(kVideoBlockDuration))); 1283 base::TimeDelta::FromMilliseconds(kVideoBlockDuration)));
1284 EndOfStream(PIPELINE_OK); 1284 MarkEndOfStream(PIPELINE_OK);
1285 1285
1286 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); 1286 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
1287 1287
1288 // Request a few more reads and make sure we immediately get 1288 // Request a few more reads and make sure we immediately get
1289 // end of stream buffers. 1289 // end of stream buffers.
1290 end_of_stream_helper_2.RequestReads(); 1290 end_of_stream_helper_2.RequestReads();
1291 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1291 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1292 1292
1293 end_of_stream_helper_3.RequestReads(); 1293 end_of_stream_helper_3.RequestReads();
1294 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); 1294 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
1295 } 1295 }
1296 1296
1297 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) { 1297 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) {
1298 ASSERT_TRUE(InitDemuxer(true, true)); 1298 ASSERT_TRUE(InitDemuxer(true, true));
1299 1299
1300 AppendCluster(0, 10); 1300 AppendCluster(0, 10);
1301 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); 1301 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138)));
1302 EndOfStream(PIPELINE_OK); 1302 MarkEndOfStream(PIPELINE_OK);
1303 1303
1304 // Start the first seek. 1304 // Start the first seek.
1305 Seek(base::TimeDelta::FromMilliseconds(20)); 1305 Seek(base::TimeDelta::FromMilliseconds(20));
1306 1306
1307 // Simulate another seek being requested before the first 1307 // Simulate another seek being requested before the first
1308 // seek has finished prerolling. 1308 // seek has finished prerolling.
1309 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(30); 1309 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(30);
1310 demuxer_->CancelPendingSeek(seek_time2); 1310 demuxer_->CancelPendingSeek(seek_time2);
1311 1311
1312 // Finish second seek. 1312 // Finish second seek.
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
1768 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110); 1768 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110);
1769 demuxer_->StartWaitingForSeek(seek_time); 1769 demuxer_->StartWaitingForSeek(seek_time);
1770 demuxer_->Seek(seek_time, 1770 demuxer_->Seek(seek_time,
1771 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); 1771 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
1772 message_loop_.RunUntilIdle(); 1772 message_loop_.RunUntilIdle();
1773 1773
1774 EXPECT_FALSE(seek_cb_was_called); 1774 EXPECT_FALSE(seek_cb_was_called);
1775 1775
1776 EXPECT_CALL(host_, SetDuration( 1776 EXPECT_CALL(host_, SetDuration(
1777 base::TimeDelta::FromMilliseconds(120))); 1777 base::TimeDelta::FromMilliseconds(120)));
1778 EndOfStream(PIPELINE_OK); 1778 MarkEndOfStream(PIPELINE_OK);
1779 message_loop_.RunUntilIdle(); 1779 message_loop_.RunUntilIdle();
1780 1780
1781 EXPECT_TRUE(seek_cb_was_called); 1781 EXPECT_TRUE(seek_cb_was_called);
1782 1782
1783 ShutdownDemuxer(); 1783 ShutdownDemuxer();
1784 } 1784 }
1785 1785
1786 // Test that EndOfStream is ignored if coming during a pending seek 1786 // Test that EndOfStream is ignored if coming during a pending seek
1787 // whose seek time is before some existing ranges. 1787 // whose seek time is before some existing ranges.
1788 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringPendingSeek) { 1788 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringPendingSeek) {
(...skipping 18 matching lines...) Expand all
1807 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160); 1807 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160);
1808 demuxer_->StartWaitingForSeek(seek_time); 1808 demuxer_->StartWaitingForSeek(seek_time);
1809 demuxer_->Seek(seek_time, 1809 demuxer_->Seek(seek_time,
1810 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); 1810 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
1811 message_loop_.RunUntilIdle(); 1811 message_loop_.RunUntilIdle();
1812 1812
1813 EXPECT_FALSE(seek_cb_was_called); 1813 EXPECT_FALSE(seek_cb_was_called);
1814 1814
1815 EXPECT_CALL(host_, SetDuration( 1815 EXPECT_CALL(host_, SetDuration(
1816 base::TimeDelta::FromMilliseconds(300))); 1816 base::TimeDelta::FromMilliseconds(300)));
1817 EndOfStream(PIPELINE_OK); 1817 MarkEndOfStream(PIPELINE_OK);
1818 message_loop_.RunUntilIdle(); 1818 message_loop_.RunUntilIdle();
1819 1819
1820 EXPECT_FALSE(seek_cb_was_called); 1820 EXPECT_FALSE(seek_cb_was_called);
1821 1821
1822 demuxer_->UnmarkEndOfStream();
1823
1822 scoped_ptr<Cluster> cluster_a3( 1824 scoped_ptr<Cluster> cluster_a3(
1823 GenerateSingleStreamCluster(140, 180, kAudioTrackNum, 10)); 1825 GenerateSingleStreamCluster(140, 180, kAudioTrackNum, 10));
1824 scoped_ptr<Cluster> cluster_v3( 1826 scoped_ptr<Cluster> cluster_v3(
1825 GenerateSingleStreamCluster(140, 180, kVideoTrackNum, 5)); 1827 GenerateSingleStreamCluster(140, 180, kVideoTrackNum, 5));
1826 AppendData(cluster_a3->data(), cluster_a3->size()); 1828 AppendData(cluster_a3->data(), cluster_a3->size());
1827 AppendData(cluster_v3->data(), cluster_v3->size()); 1829 AppendData(cluster_v3->data(), cluster_v3->size());
1828 1830
1829 message_loop_.RunUntilIdle(); 1831 message_loop_.RunUntilIdle();
1830 1832
1831 EXPECT_TRUE(seek_cb_was_called); 1833 EXPECT_TRUE(seek_cb_was_called);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1968 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 1970 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
1969 1971
1970 // Appending to single stream outside buffered ranges should not affect 1972 // Appending to single stream outside buffered ranges should not affect
1971 // buffered ranges. 1973 // buffered ranges.
1972 scoped_ptr<Cluster> cluster_v5( 1974 scoped_ptr<Cluster> cluster_v5(
1973 GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10)); 1975 GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10));
1974 AppendData(cluster_v5->data(), cluster_v5->size()); 1976 AppendData(cluster_v5->data(), cluster_v5->size());
1975 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 1977 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
1976 } 1978 }
1977 1979
1978 // Once EndOfStream() is called, GetBufferedRanges should not cut off any 1980 // Once MarkEndOfStream() is called, GetBufferedRanges should not cut off any
1979 // over-hanging tails at the end of the ranges as this is likely due to block 1981 // over-hanging tails at the end of the ranges as this is likely due to block
1980 // duration differences. 1982 // duration differences.
1981 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { 1983 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
1982 ASSERT_TRUE(InitDemuxer(true, true)); 1984 ASSERT_TRUE(InitDemuxer(true, true));
1983 1985
1984 scoped_ptr<Cluster> cluster_a( 1986 scoped_ptr<Cluster> cluster_a(
1985 GenerateSingleStreamCluster(0, 90, kAudioTrackNum, 90)); 1987 GenerateSingleStreamCluster(0, 90, kAudioTrackNum, 90));
1986 scoped_ptr<Cluster> cluster_v( 1988 scoped_ptr<Cluster> cluster_v(
1987 GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 100)); 1989 GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 100));
1988 1990
1989 AppendData(cluster_a->data(), cluster_a->size()); 1991 AppendData(cluster_a->data(), cluster_a->size());
1990 AppendData(cluster_v->data(), cluster_v->size()); 1992 AppendData(cluster_v->data(), cluster_v->size());
1991 1993
1992 CheckExpectedRanges("{ [0,90) }"); 1994 CheckExpectedRanges("{ [0,90) }");
1993 1995
1994 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(100))); 1996 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(100)));
1995 EndOfStream(PIPELINE_OK); 1997 MarkEndOfStream(PIPELINE_OK);
1996 1998
1997 CheckExpectedRanges("{ [0,100) }"); 1999 CheckExpectedRanges("{ [0,100) }");
1998 } 2000 }
1999 2001
2000 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) { 2002 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) {
2001 ASSERT_TRUE(InitDemuxer(true, true)); 2003 ASSERT_TRUE(InitDemuxer(true, true));
2002 2004
2003 // Create a cluster where the video timecode begins 25ms after the audio. 2005 // Create a cluster where the video timecode begins 25ms after the audio.
2004 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 25, 8)); 2006 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 25, 8));
2005 AppendData(start_cluster->data(), start_cluster->size()); 2007 AppendData(start_cluster->data(), start_cluster->size());
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2125 EXPECT_CALL(host_, SetDuration(_)) 2127 EXPECT_CALL(host_, SetDuration(_))
2126 .Times(AnyNumber()); 2128 .Times(AnyNumber());
2127 2129
2128 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2130 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2129 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); 2131 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster());
2130 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92); 2132 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92);
2131 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99); 2133 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99);
2132 2134
2133 AppendData(cluster_a->data(), cluster_a->size()); 2135 AppendData(cluster_a->data(), cluster_a->size());
2134 AppendData(cluster_b->data(), cluster_b->size()); 2136 AppendData(cluster_b->data(), cluster_b->size());
2135 EndOfStream(PIPELINE_OK); 2137 MarkEndOfStream(PIPELINE_OK);
2136 2138
2137 DemuxerStream::Status status; 2139 DemuxerStream::Status status;
2138 base::TimeDelta last_timestamp; 2140 base::TimeDelta last_timestamp;
2139 2141
2140 // Verify that we can read audio & video to the end w/o problems. 2142 // Verify that we can read audio & video to the end w/o problems.
2141 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2143 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2142 EXPECT_EQ(DemuxerStream::kOk, status); 2144 EXPECT_EQ(DemuxerStream::kOk, status);
2143 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); 2145 EXPECT_EQ(kLastAudioTimestamp, last_timestamp);
2144 2146
2145 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 2147 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2178 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2180 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2179 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); 2181 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster());
2180 AppendData(cluster_a->data(), cluster_a->size()); 2182 AppendData(cluster_a->data(), cluster_a->size());
2181 2183
2182 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 2184 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
2183 demuxer_->StartWaitingForSeek(seek_time); 2185 demuxer_->StartWaitingForSeek(seek_time);
2184 2186
2185 AppendData(cluster_b->data(), cluster_b->size()); 2187 AppendData(cluster_b->data(), cluster_b->size());
2186 EXPECT_CALL(host_, SetDuration( 2188 EXPECT_CALL(host_, SetDuration(
2187 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); 2189 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp)));
2188 EndOfStream(PIPELINE_OK); 2190 MarkEndOfStream(PIPELINE_OK);
2189 2191
2190 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); 2192 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
2191 2193
2192 GenerateExpectedReads(0, 4); 2194 GenerateExpectedReads(0, 4);
2193 GenerateExpectedReads(46, 66, 5); 2195 GenerateExpectedReads(46, 66, 5);
2194 2196
2195 EndOfStreamHelper end_of_stream_helper(demuxer_.get()); 2197 EndOfStreamHelper end_of_stream_helper(demuxer_.get());
2196 end_of_stream_helper.RequestReads(); 2198 end_of_stream_helper.RequestReads();
2197 end_of_stream_helper.CheckIfReadDonesWereCalled(true); 2199 end_of_stream_helper.CheckIfReadDonesWereCalled(true);
2198 } 2200 }
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
2471 } 2473 }
2472 2474
2473 TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) { 2475 TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) {
2474 ASSERT_TRUE(InitDemuxer(true, true)); 2476 ASSERT_TRUE(InitDemuxer(true, true));
2475 2477
2476 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2478 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2477 AppendData(cluster_a->data(), cluster_a->size()); 2479 AppendData(cluster_a->data(), cluster_a->size());
2478 2480
2479 EXPECT_CALL(host_, SetDuration( 2481 EXPECT_CALL(host_, SetDuration(
2480 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 2482 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
2481 EndOfStream(PIPELINE_OK); 2483 MarkEndOfStream(PIPELINE_OK);
2482 } 2484 }
2483 2485
2484 2486
2485 TEST_F(ChunkDemuxerTest, TestZeroLengthAppend) { 2487 TEST_F(ChunkDemuxerTest, TestZeroLengthAppend) {
2486 ASSERT_TRUE(InitDemuxer(true, true)); 2488 ASSERT_TRUE(InitDemuxer(true, true));
2487 AppendData(NULL, 0); 2489 AppendData(NULL, 0);
2488 } 2490 }
2489 2491
2490 TEST_F(ChunkDemuxerTest, TestAppendAfterEndOfStream) { 2492 TEST_F(ChunkDemuxerTest, TestAppendAfterEndOfStream) {
2491 ASSERT_TRUE(InitDemuxer(true, true)); 2493 ASSERT_TRUE(InitDemuxer(true, true));
2492 2494
2493 EXPECT_CALL(host_, SetDuration(_)) 2495 EXPECT_CALL(host_, SetDuration(_))
2494 .Times(AnyNumber()); 2496 .Times(AnyNumber());
2495 2497
2496 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2498 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2497 AppendData(cluster_a->data(), cluster_a->size()); 2499 AppendData(cluster_a->data(), cluster_a->size());
2498 EndOfStream(PIPELINE_OK); 2500 MarkEndOfStream(PIPELINE_OK);
2501
2502 demuxer_->UnmarkEndOfStream();
2499 2503
2500 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); 2504 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster());
2501 AppendData(cluster_b->data(), cluster_b->size()); 2505 AppendData(cluster_b->data(), cluster_b->size());
2502 EndOfStream(PIPELINE_OK); 2506 MarkEndOfStream(PIPELINE_OK);
2503 } 2507 }
2504 2508
2505 // Test receiving a Shutdown() call before we get an Initialize() 2509 // Test receiving a Shutdown() call before we get an Initialize()
2506 // call. This can happen if video element gets destroyed before 2510 // call. This can happen if video element gets destroyed before
2507 // the pipeline has a chance to initialize the demuxer. 2511 // the pipeline has a chance to initialize the demuxer.
2508 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) { 2512 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) {
2509 demuxer_->Shutdown(); 2513 demuxer_->Shutdown();
2510 demuxer_->Initialize( 2514 demuxer_->Initialize(
2511 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 2515 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN));
2512 message_loop_.RunUntilIdle(); 2516 message_loop_.RunUntilIdle();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2552 &audio_read_done)); 2556 &audio_read_done));
2553 ReadVideo(base::Bind(&OnReadDone, 2557 ReadVideo(base::Bind(&OnReadDone,
2554 base::TimeDelta::FromMilliseconds(138), 2558 base::TimeDelta::FromMilliseconds(138),
2555 &video_read_done)); 2559 &video_read_done));
2556 2560
2557 // Verify that the reads didn't complete 2561 // Verify that the reads didn't complete
2558 EXPECT_FALSE(audio_read_done); 2562 EXPECT_FALSE(audio_read_done);
2559 EXPECT_FALSE(video_read_done); 2563 EXPECT_FALSE(video_read_done);
2560 2564
2561 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438))); 2565 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438)));
2562 EndOfStream(PIPELINE_OK); 2566 MarkEndOfStream(PIPELINE_OK);
2563 2567
2564 // Verify that the reads still haven't completed. 2568 // Verify that the reads still haven't completed.
2565 EXPECT_FALSE(audio_read_done); 2569 EXPECT_FALSE(audio_read_done);
2566 EXPECT_FALSE(video_read_done); 2570 EXPECT_FALSE(video_read_done);
2567 2571
2572 demuxer_->UnmarkEndOfStream();
2573
2568 AppendCluster(138, 24); 2574 AppendCluster(138, 24);
2569 2575
2570 message_loop_.RunUntilIdle(); 2576 message_loop_.RunUntilIdle();
2571 2577
2572 CheckExpectedRanges(kSourceId, "{ [0,438) }"); 2578 CheckExpectedRanges(kSourceId, "{ [0,438) }");
2573 2579
2574 // Verify that the reads have completed. 2580 // Verify that the reads have completed.
2575 EXPECT_TRUE(audio_read_done); 2581 EXPECT_TRUE(audio_read_done);
2576 EXPECT_TRUE(video_read_done); 2582 EXPECT_TRUE(video_read_done);
2577 2583
2578 // Read the rest of the buffers. 2584 // Read the rest of the buffers.
2579 GenerateExpectedReads(161, 171, 22); 2585 GenerateExpectedReads(161, 171, 22);
2580 2586
2581 // Verify that reads block because the append cleared the end of stream state. 2587 // Verify that reads block because the append cleared the end of stream state.
2582 audio_read_done = false; 2588 audio_read_done = false;
2583 video_read_done = false; 2589 video_read_done = false;
2584 ReadAudio(base::Bind(&OnReadDone_EOSExpected, 2590 ReadAudio(base::Bind(&OnReadDone_EOSExpected,
2585 &audio_read_done)); 2591 &audio_read_done));
2586 ReadVideo(base::Bind(&OnReadDone_EOSExpected, 2592 ReadVideo(base::Bind(&OnReadDone_EOSExpected,
2587 &video_read_done)); 2593 &video_read_done));
2588 2594
2589 // Verify that the reads don't complete. 2595 // Verify that the reads don't complete.
2590 EXPECT_FALSE(audio_read_done); 2596 EXPECT_FALSE(audio_read_done);
2591 EXPECT_FALSE(video_read_done); 2597 EXPECT_FALSE(video_read_done);
2592 2598
2593 EndOfStream(PIPELINE_OK); 2599 MarkEndOfStream(PIPELINE_OK);
2594 2600
2595 EXPECT_TRUE(audio_read_done); 2601 EXPECT_TRUE(audio_read_done);
2596 EXPECT_TRUE(video_read_done); 2602 EXPECT_TRUE(video_read_done);
2597 } 2603 }
2598 2604
2599 TEST_F(ChunkDemuxerTest, TestCanceledSeekDuringInitialPreroll) { 2605 TEST_F(ChunkDemuxerTest, TestCanceledSeekDuringInitialPreroll) {
2600 ASSERT_TRUE(InitDemuxer(true, true)); 2606 ASSERT_TRUE(InitDemuxer(true, true));
2601 2607
2602 // Cancel preroll. 2608 // Cancel preroll.
2603 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200); 2609 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2647 // don't get removed. 2653 // don't get removed.
2648 // 2654 //
2649 // NOTE: The current GC algorithm tries to preserve the GOP at the 2655 // NOTE: The current GC algorithm tries to preserve the GOP at the
2650 // current position as well as the last appended GOP. This is 2656 // current position as well as the last appended GOP. This is
2651 // why there are 2 ranges in the expectations. 2657 // why there are 2 ranges in the expectations.
2652 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5); 2658 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5);
2653 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }"); 2659 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }");
2654 } 2660 }
2655 2661
2656 } // namespace media 2662 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/pipeline_integration_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698