| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |