| 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 | 
|---|