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

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

Issue 315483002: MSE: Remove Chromium-side support for LegacyFrameProcessor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 6 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
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 "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_split.h" 10 #include "base/strings/string_split.h"
(...skipping 10 matching lines...) Expand all
21 #include "media/formats/webm/webm_crypto_helpers.h" 21 #include "media/formats/webm/webm_crypto_helpers.h"
22 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
23 23
24 using ::testing::AnyNumber; 24 using ::testing::AnyNumber;
25 using ::testing::Exactly; 25 using ::testing::Exactly;
26 using ::testing::InSequence; 26 using ::testing::InSequence;
27 using ::testing::NotNull; 27 using ::testing::NotNull;
28 using ::testing::Return; 28 using ::testing::Return;
29 using ::testing::SaveArg; 29 using ::testing::SaveArg;
30 using ::testing::SetArgumentPointee; 30 using ::testing::SetArgumentPointee;
31 using ::testing::Values;
32 using ::testing::_; 31 using ::testing::_;
33 32
34 namespace media { 33 namespace media {
35 34
36 const uint8 kTracksHeader[] = { 35 const uint8 kTracksHeader[] = {
37 0x16, 0x54, 0xAE, 0x6B, // Tracks ID 36 0x16, 0x54, 0xAE, 0x6B, // Tracks ID
38 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0) 37 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0)
39 }; 38 };
40 39
41 // WebM Block bytes that represent a VP8 keyframe. 40 // WebM Block bytes that represent a VP8 keyframe.
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 *called = true; 125 *called = true;
127 } 126 }
128 127
129 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { 128 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) {
130 EXPECT_EQ(status, PIPELINE_OK); 129 EXPECT_EQ(status, PIPELINE_OK);
131 *called = true; 130 *called = true;
132 } 131 }
133 132
134 static void LogFunc(const std::string& str) { DVLOG(1) << str; } 133 static void LogFunc(const std::string& str) { DVLOG(1) << str; }
135 134
136 // Test parameter determines which coded frame processor is used to process 135 class ChunkDemuxerTest : public ::testing::Test {
137 // appended data. If true, LegacyFrameProcessor is used. Otherwise, the new
138 // FrameProcessor is used.
139 class ChunkDemuxerTest : public ::testing::TestWithParam<bool> {
140 protected: 136 protected:
141 enum CodecsIndex { 137 enum CodecsIndex {
142 AUDIO, 138 AUDIO,
143 VIDEO, 139 VIDEO,
144 MAX_CODECS_INDEX 140 MAX_CODECS_INDEX
145 }; 141 };
146 142
147 // Default cluster to append first for simple tests. 143 // Default cluster to append first for simple tests.
148 scoped_ptr<Cluster> kDefaultFirstCluster() { 144 scoped_ptr<Cluster> kDefaultFirstCluster() {
149 return GenerateCluster(0, 4); 145 return GenerateCluster(0, 4);
150 } 146 }
151 147
152 // Default cluster to append after kDefaultFirstCluster() 148 // Default cluster to append after kDefaultFirstCluster()
153 // has been appended. This cluster starts with blocks that 149 // has been appended. This cluster starts with blocks that
154 // have timestamps consistent with the end times of the blocks 150 // have timestamps consistent with the end times of the blocks
155 // in kDefaultFirstCluster() so that these two clusters represent 151 // in kDefaultFirstCluster() so that these two clusters represent
156 // a continuous region. 152 // a continuous region.
157 scoped_ptr<Cluster> kDefaultSecondCluster() { 153 scoped_ptr<Cluster> kDefaultSecondCluster() {
158 return GenerateCluster(46, 66, 5); 154 return GenerateCluster(46, 66, 5);
159 } 155 }
160 156
161 ChunkDemuxerTest() 157 ChunkDemuxerTest()
162 : append_window_end_for_next_append_(kInfiniteDuration()) { 158 : append_window_end_for_next_append_(kInfiniteDuration()) {
163 use_legacy_frame_processor_ = GetParam();
164 CreateNewDemuxer(); 159 CreateNewDemuxer();
165 } 160 }
166 161
167 void CreateNewDemuxer() { 162 void CreateNewDemuxer() {
168 base::Closure open_cb = 163 base::Closure open_cb =
169 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); 164 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this));
170 Demuxer::NeedKeyCB need_key_cb = 165 Demuxer::NeedKeyCB need_key_cb =
171 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); 166 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this));
172 demuxer_.reset( 167 demuxer_.reset(
173 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), true)); 168 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), true));
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 306
312 if (has_video) { 307 if (has_video) {
313 codecs.push_back("vp8"); 308 codecs.push_back("vp8");
314 type = "video/webm"; 309 type = "video/webm";
315 } 310 }
316 311
317 if (!has_audio && !has_video) { 312 if (!has_audio && !has_video) {
318 return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO); 313 return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO);
319 } 314 }
320 315
321 return demuxer_->AddId(source_id, type, codecs, 316 return demuxer_->AddId(source_id, type, codecs);
322 use_legacy_frame_processor_);
323 } 317 }
324 318
325 ChunkDemuxer::Status AddIdForMp2tSource(const std::string& source_id) { 319 ChunkDemuxer::Status AddIdForMp2tSource(const std::string& source_id) {
326 std::vector<std::string> codecs; 320 std::vector<std::string> codecs;
327 std::string type = "video/mp2t"; 321 std::string type = "video/mp2t";
328 codecs.push_back("mp4a.40.2"); 322 codecs.push_back("mp4a.40.2");
329 codecs.push_back("avc1.640028"); 323 codecs.push_back("avc1.640028");
330 return demuxer_->AddId(source_id, type, codecs, 324 return demuxer_->AddId(source_id, type, codecs);
331 use_legacy_frame_processor_);
332 } 325 }
333 326
334 void AppendData(const uint8* data, size_t length) { 327 void AppendData(const uint8* data, size_t length) {
335 AppendData(kSourceId, data, length); 328 AppendData(kSourceId, data, length);
336 } 329 }
337 330
338 void AppendCluster(const std::string& source_id, 331 void AppendCluster(const std::string& source_id,
339 scoped_ptr<Cluster> cluster) { 332 scoped_ptr<Cluster> cluster) {
340 AppendData(source_id, cluster->data(), cluster->size()); 333 AppendData(source_id, cluster->data(), cluster->size());
341 } 334 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 &data[0], data.size()); 397 &data[0], data.size());
405 } 398 }
406 } 399 }
407 AppendCluster(source_id, cb.Finish()); 400 AppendCluster(source_id, cb.Finish());
408 } 401 }
409 402
410 void AppendData(const std::string& source_id, 403 void AppendData(const std::string& source_id,
411 const uint8* data, size_t length) { 404 const uint8* data, size_t length) {
412 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); 405 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber());
413 406
414 // TODO(wolenetz): Test timestamp offset updating once "sequence" append
415 // mode processing is implemented. See http://crbug.com/249422.
416 demuxer_->AppendData(source_id, data, length, 407 demuxer_->AppendData(source_id, data, length,
417 append_window_start_for_next_append_, 408 append_window_start_for_next_append_,
418 append_window_end_for_next_append_, 409 append_window_end_for_next_append_,
419 &timestamp_offset_map_[source_id]); 410 &timestamp_offset_map_[source_id]);
420 } 411 }
421 412
422 void AppendDataInPieces(const uint8* data, size_t length) { 413 void AppendDataInPieces(const uint8* data, size_t length) {
423 AppendDataInPieces(data, length, 7); 414 AppendDataInPieces(data, length, 7);
424 } 415 }
425 416
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 return false; 977 return false;
987 978
988 timestamp_offset_map_[id] = timestamp_offset; 979 timestamp_offset_map_[id] = timestamp_offset;
989 return true; 980 return true;
990 } 981 }
991 982
992 base::MessageLoop message_loop_; 983 base::MessageLoop message_loop_;
993 MockDemuxerHost host_; 984 MockDemuxerHost host_;
994 985
995 scoped_ptr<ChunkDemuxer> demuxer_; 986 scoped_ptr<ChunkDemuxer> demuxer_;
996 bool use_legacy_frame_processor_;
997 987
998 base::TimeDelta append_window_start_for_next_append_; 988 base::TimeDelta append_window_start_for_next_append_;
999 base::TimeDelta append_window_end_for_next_append_; 989 base::TimeDelta append_window_end_for_next_append_;
1000 990
1001 // Map of source id to timestamp offset to use for the next AppendData() 991 // Map of source id to timestamp offset to use for the next AppendData()
1002 // operation for that source id. 992 // operation for that source id.
1003 std::map<std::string, base::TimeDelta> timestamp_offset_map_; 993 std::map<std::string, base::TimeDelta> timestamp_offset_map_;
1004 994
1005 private: 995 private:
1006 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 996 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
1007 }; 997 };
1008 998
1009 TEST_P(ChunkDemuxerTest, Init) { 999 TEST_F(ChunkDemuxerTest, Init) {
1010 // Test no streams, audio-only, video-only, and audio & video scenarios. 1000 // Test no streams, audio-only, video-only, and audio & video scenarios.
1011 // Audio and video streams can be encrypted or not encrypted. 1001 // Audio and video streams can be encrypted or not encrypted.
1012 for (int i = 0; i < 16; i++) { 1002 for (int i = 0; i < 16; i++) {
1013 bool has_audio = (i & 0x1) != 0; 1003 bool has_audio = (i & 0x1) != 0;
1014 bool has_video = (i & 0x2) != 0; 1004 bool has_video = (i & 0x2) != 0;
1015 bool is_audio_encrypted = (i & 0x4) != 0; 1005 bool is_audio_encrypted = (i & 0x4) != 0;
1016 bool is_video_encrypted = (i & 0x8) != 0; 1006 bool is_video_encrypted = (i & 0x8) != 0;
1017 1007
1018 // No test on invalid combination. 1008 // No test on invalid combination.
1019 if ((!has_audio && is_audio_encrypted) || 1009 if ((!has_audio && is_audio_encrypted) ||
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 EXPECT_FALSE(video_stream); 1062 EXPECT_FALSE(video_stream);
1073 } 1063 }
1074 1064
1075 ShutdownDemuxer(); 1065 ShutdownDemuxer();
1076 demuxer_.reset(); 1066 demuxer_.reset();
1077 } 1067 }
1078 } 1068 }
1079 1069
1080 // TODO(acolwell): Fold this test into Init tests since the tests are 1070 // TODO(acolwell): Fold this test into Init tests since the tests are
1081 // almost identical. 1071 // almost identical.
1082 TEST_P(ChunkDemuxerTest, InitText) { 1072 TEST_F(ChunkDemuxerTest, InitText) {
1083 // Test with 1 video stream and 1 text streams, and 0 or 1 audio streams. 1073 // Test with 1 video stream and 1 text streams, and 0 or 1 audio streams.
1084 // No encryption cases handled here. 1074 // No encryption cases handled here.
1085 bool has_video = true; 1075 bool has_video = true;
1086 bool is_audio_encrypted = false; 1076 bool is_audio_encrypted = false;
1087 bool is_video_encrypted = false; 1077 bool is_video_encrypted = false;
1088 for (int i = 0; i < 2; i++) { 1078 for (int i = 0; i < 2; i++) {
1089 bool has_audio = (i & 0x1) != 0; 1079 bool has_audio = (i & 0x1) != 0;
1090 1080
1091 CreateNewDemuxer(); 1081 CreateNewDemuxer();
1092 1082
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 EXPECT_FALSE(video_stream); 1132 EXPECT_FALSE(video_stream);
1143 } 1133 }
1144 1134
1145 ShutdownDemuxer(); 1135 ShutdownDemuxer();
1146 demuxer_.reset(); 1136 demuxer_.reset();
1147 } 1137 }
1148 } 1138 }
1149 1139
1150 // Make sure that the demuxer reports an error if Shutdown() 1140 // Make sure that the demuxer reports an error if Shutdown()
1151 // is called before all the initialization segments are appended. 1141 // is called before all the initialization segments are appended.
1152 TEST_P(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { 1142 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) {
1153 EXPECT_CALL(*this, DemuxerOpened()); 1143 EXPECT_CALL(*this, DemuxerOpened());
1154 demuxer_->Initialize( 1144 demuxer_->Initialize(
1155 &host_, CreateInitDoneCB( 1145 &host_, CreateInitDoneCB(
1156 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); 1146 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true);
1157 1147
1158 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); 1148 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
1159 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk); 1149 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
1160 1150
1161 AppendInitSegmentWithSourceId("audio", HAS_AUDIO); 1151 AppendInitSegmentWithSourceId("audio", HAS_AUDIO);
1162 1152
1163 ShutdownDemuxer(); 1153 ShutdownDemuxer();
1164 } 1154 }
1165 1155
1166 TEST_P(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { 1156 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) {
1167 EXPECT_CALL(*this, DemuxerOpened()); 1157 EXPECT_CALL(*this, DemuxerOpened());
1168 demuxer_->Initialize( 1158 demuxer_->Initialize(
1169 &host_, CreateInitDoneCB( 1159 &host_, CreateInitDoneCB(
1170 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); 1160 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true);
1171 1161
1172 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); 1162 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
1173 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk); 1163 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk);
1174 1164
1175 EXPECT_CALL(host_, AddTextStream(_, _)) 1165 EXPECT_CALL(host_, AddTextStream(_, _))
1176 .Times(Exactly(1)); 1166 .Times(Exactly(1));
1177 1167
1178 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT); 1168 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT);
1179 1169
1180 ShutdownDemuxer(); 1170 ShutdownDemuxer();
1181 } 1171 }
1182 1172
1183 // Verifies that all streams waiting for data receive an end of stream 1173 // Verifies that all streams waiting for data receive an end of stream
1184 // buffer when Shutdown() is called. 1174 // buffer when Shutdown() is called.
1185 TEST_P(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { 1175 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) {
1186 DemuxerStream* text_stream = NULL; 1176 DemuxerStream* text_stream = NULL;
1187 EXPECT_CALL(host_, AddTextStream(_, _)) 1177 EXPECT_CALL(host_, AddTextStream(_, _))
1188 .WillOnce(SaveArg<0>(&text_stream)); 1178 .WillOnce(SaveArg<0>(&text_stream));
1189 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 1179 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
1190 1180
1191 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1181 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
1192 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1182 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
1193 1183
1194 bool audio_read_done = false; 1184 bool audio_read_done = false;
1195 bool video_read_done = false; 1185 bool video_read_done = false;
1196 bool text_read_done = false; 1186 bool text_read_done = false;
1197 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 1187 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
1198 video_stream->Read(base::Bind(&OnReadDone_EOSExpected, &video_read_done)); 1188 video_stream->Read(base::Bind(&OnReadDone_EOSExpected, &video_read_done));
1199 text_stream->Read(base::Bind(&OnReadDone_EOSExpected, &text_read_done)); 1189 text_stream->Read(base::Bind(&OnReadDone_EOSExpected, &text_read_done));
1200 message_loop_.RunUntilIdle(); 1190 message_loop_.RunUntilIdle();
1201 1191
1202 EXPECT_FALSE(audio_read_done); 1192 EXPECT_FALSE(audio_read_done);
1203 EXPECT_FALSE(video_read_done); 1193 EXPECT_FALSE(video_read_done);
1204 EXPECT_FALSE(text_read_done); 1194 EXPECT_FALSE(text_read_done);
1205 1195
1206 ShutdownDemuxer(); 1196 ShutdownDemuxer();
1207 1197
1208 EXPECT_TRUE(audio_read_done); 1198 EXPECT_TRUE(audio_read_done);
1209 EXPECT_TRUE(video_read_done); 1199 EXPECT_TRUE(video_read_done);
1210 EXPECT_TRUE(text_read_done); 1200 EXPECT_TRUE(text_read_done);
1211 } 1201 }
1212 1202
1213 // Test that Seek() completes successfully when the first cluster 1203 // Test that Seek() completes successfully when the first cluster
1214 // arrives. 1204 // arrives.
1215 TEST_P(ChunkDemuxerTest, AppendDataAfterSeek) { 1205 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) {
1216 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1206 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1217 AppendCluster(kDefaultFirstCluster()); 1207 AppendCluster(kDefaultFirstCluster());
1218 1208
1219 InSequence s; 1209 InSequence s;
1220 1210
1221 EXPECT_CALL(*this, Checkpoint(1)); 1211 EXPECT_CALL(*this, Checkpoint(1));
1222 1212
1223 Seek(base::TimeDelta::FromMilliseconds(46)); 1213 Seek(base::TimeDelta::FromMilliseconds(46));
1224 1214
1225 EXPECT_CALL(*this, Checkpoint(2)); 1215 EXPECT_CALL(*this, Checkpoint(2));
1226 1216
1227 Checkpoint(1); 1217 Checkpoint(1);
1228 1218
1229 AppendCluster(kDefaultSecondCluster()); 1219 AppendCluster(kDefaultSecondCluster());
1230 1220
1231 message_loop_.RunUntilIdle(); 1221 message_loop_.RunUntilIdle();
1232 1222
1233 Checkpoint(2); 1223 Checkpoint(2);
1234 } 1224 }
1235 1225
1236 // Test that parsing errors are handled for clusters appended after init. 1226 // Test that parsing errors are handled for clusters appended after init.
1237 TEST_P(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { 1227 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) {
1238 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1228 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1239 AppendCluster(kDefaultFirstCluster()); 1229 AppendCluster(kDefaultFirstCluster());
1240 1230
1241 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1231 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1242 AppendGarbage(); 1232 AppendGarbage();
1243 } 1233 }
1244 1234
1245 // Test the case where a Seek() is requested while the parser 1235 // Test the case where a Seek() is requested while the parser
1246 // is in the middle of cluster. This is to verify that the parser 1236 // is in the middle of cluster. This is to verify that the parser
1247 // does not reset itself on a seek. 1237 // does not reset itself on a seek.
1248 TEST_P(ChunkDemuxerTest, SeekWhileParsingCluster) { 1238 TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) {
1249 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1239 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1250 1240
1251 InSequence s; 1241 InSequence s;
1252 1242
1253 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 6)); 1243 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 6));
1254 1244
1255 // Split the cluster into two appends at an arbitrary point near the end. 1245 // Split the cluster into two appends at an arbitrary point near the end.
1256 int first_append_size = cluster_a->size() - 11; 1246 int first_append_size = cluster_a->size() - 11;
1257 int second_append_size = cluster_a->size() - first_append_size; 1247 int second_append_size = cluster_a->size() - first_append_size;
1258 1248
1259 // Append the first part of the cluster. 1249 // Append the first part of the cluster.
1260 AppendData(cluster_a->data(), first_append_size); 1250 AppendData(cluster_a->data(), first_append_size);
1261 1251
1262 ExpectRead(DemuxerStream::AUDIO, 0); 1252 ExpectRead(DemuxerStream::AUDIO, 0);
1263 ExpectRead(DemuxerStream::VIDEO, 0); 1253 ExpectRead(DemuxerStream::VIDEO, 0);
1264 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration); 1254 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration);
1265 1255
1266 Seek(base::TimeDelta::FromSeconds(5)); 1256 Seek(base::TimeDelta::FromSeconds(5));
1267 1257
1268 // Append the rest of the cluster. 1258 // Append the rest of the cluster.
1269 AppendData(cluster_a->data() + first_append_size, second_append_size); 1259 AppendData(cluster_a->data() + first_append_size, second_append_size);
1270 1260
1271 // Append the new cluster and verify that only the blocks 1261 // Append the new cluster and verify that only the blocks
1272 // in the new cluster are returned. 1262 // in the new cluster are returned.
1273 AppendCluster(GenerateCluster(5000, 6)); 1263 AppendCluster(GenerateCluster(5000, 6));
1274 GenerateExpectedReads(5000, 6); 1264 GenerateExpectedReads(5000, 6);
1275 } 1265 }
1276 1266
1277 // Test the case where AppendData() is called before Init(). 1267 // Test the case where AppendData() is called before Init().
1278 TEST_P(ChunkDemuxerTest, AppendDataBeforeInit) { 1268 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
1279 scoped_ptr<uint8[]> info_tracks; 1269 scoped_ptr<uint8[]> info_tracks;
1280 int info_tracks_size = 0; 1270 int info_tracks_size = 0;
1281 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, 1271 CreateInitSegment(HAS_AUDIO | HAS_VIDEO,
1282 false, false, &info_tracks, &info_tracks_size); 1272 false, false, &info_tracks, &info_tracks_size);
1283 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, 1273 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size,
1284 append_window_start_for_next_append_, 1274 append_window_start_for_next_append_,
1285 append_window_end_for_next_append_, 1275 append_window_end_for_next_append_,
1286 &timestamp_offset_map_[kSourceId]); 1276 &timestamp_offset_map_[kSourceId]);
1287 } 1277 }
1288 1278
1289 // Make sure Read() callbacks are dispatched with the proper data. 1279 // Make sure Read() callbacks are dispatched with the proper data.
1290 TEST_P(ChunkDemuxerTest, Read) { 1280 TEST_F(ChunkDemuxerTest, Read) {
1291 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1281 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1292 1282
1293 AppendCluster(kDefaultFirstCluster()); 1283 AppendCluster(kDefaultFirstCluster());
1294 1284
1295 bool audio_read_done = false; 1285 bool audio_read_done = false;
1296 bool video_read_done = false; 1286 bool video_read_done = false;
1297 ReadAudio(base::Bind(&OnReadDone, 1287 ReadAudio(base::Bind(&OnReadDone,
1298 base::TimeDelta::FromMilliseconds(0), 1288 base::TimeDelta::FromMilliseconds(0),
1299 &audio_read_done)); 1289 &audio_read_done));
1300 ReadVideo(base::Bind(&OnReadDone, 1290 ReadVideo(base::Bind(&OnReadDone,
1301 base::TimeDelta::FromMilliseconds(0), 1291 base::TimeDelta::FromMilliseconds(0),
1302 &video_read_done)); 1292 &video_read_done));
1303 1293
1304 EXPECT_TRUE(audio_read_done); 1294 EXPECT_TRUE(audio_read_done);
1305 EXPECT_TRUE(video_read_done); 1295 EXPECT_TRUE(video_read_done);
1306 } 1296 }
1307 1297
1308 TEST_P(ChunkDemuxerTest, OutOfOrderClusters) { 1298 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
1309 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1299 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1310 AppendCluster(kDefaultFirstCluster()); 1300 AppendCluster(kDefaultFirstCluster());
1311 AppendCluster(GenerateCluster(10, 4)); 1301 AppendCluster(GenerateCluster(10, 4));
1312 1302
1313 // Make sure that AppendCluster() does not fail with a cluster that has 1303 // Make sure that AppendCluster() does not fail with a cluster that has
1314 // overlaps with the previously appended cluster. 1304 // overlaps with the previously appended cluster.
1315 AppendCluster(GenerateCluster(5, 4)); 1305 AppendCluster(GenerateCluster(5, 4));
1316 1306
1317 // Verify that AppendData() can still accept more data. 1307 // Verify that AppendData() can still accept more data.
1318 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); 1308 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
1319 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), 1309 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(),
1320 append_window_start_for_next_append_, 1310 append_window_start_for_next_append_,
1321 append_window_end_for_next_append_, 1311 append_window_end_for_next_append_,
1322 &timestamp_offset_map_[kSourceId]); 1312 &timestamp_offset_map_[kSourceId]);
1323 } 1313 }
1324 1314
1325 TEST_P(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { 1315 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
1326 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1316 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1327 AppendCluster(kDefaultFirstCluster()); 1317 AppendCluster(kDefaultFirstCluster());
1328 1318
1329 ClusterBuilder cb; 1319 ClusterBuilder cb;
1330 1320
1331 // Test the case where block timecodes are not monotonically 1321 // Test the case where block timecodes are not monotonically
1332 // increasing but stay above the cluster timecode. 1322 // increasing but stay above the cluster timecode.
1333 cb.SetClusterTimecode(5); 1323 cb.SetClusterTimecode(5);
1334 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1324 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1335 AddSimpleBlock(&cb, kVideoTrackNum, 10); 1325 AddSimpleBlock(&cb, kVideoTrackNum, 10);
1336 AddSimpleBlock(&cb, kAudioTrackNum, 7); 1326 AddSimpleBlock(&cb, kAudioTrackNum, 7);
1337 AddSimpleBlock(&cb, kVideoTrackNum, 15); 1327 AddSimpleBlock(&cb, kVideoTrackNum, 15);
1338 1328
1339 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1329 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1340 AppendCluster(cb.Finish()); 1330 AppendCluster(cb.Finish());
1341 1331
1342 // Verify that AppendData() ignores data after the error. 1332 // Verify that AppendData() ignores data after the error.
1343 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); 1333 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
1344 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), 1334 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(),
1345 append_window_start_for_next_append_, 1335 append_window_start_for_next_append_,
1346 append_window_end_for_next_append_, 1336 append_window_end_for_next_append_,
1347 &timestamp_offset_map_[kSourceId]); 1337 &timestamp_offset_map_[kSourceId]);
1348 } 1338 }
1349 1339
1350 TEST_P(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { 1340 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
1351 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1341 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1352 AppendCluster(kDefaultFirstCluster()); 1342 AppendCluster(kDefaultFirstCluster());
1353 1343
1354 ClusterBuilder cb; 1344 ClusterBuilder cb;
1355 1345
1356 // Test timecodes going backwards and including values less than the cluster 1346 // Test timecodes going backwards and including values less than the cluster
1357 // timecode. 1347 // timecode.
1358 cb.SetClusterTimecode(5); 1348 cb.SetClusterTimecode(5);
1359 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1349 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1360 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1350 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1361 AddSimpleBlock(&cb, kAudioTrackNum, 3); 1351 AddSimpleBlock(&cb, kAudioTrackNum, 3);
1362 AddSimpleBlock(&cb, kVideoTrackNum, 3); 1352 AddSimpleBlock(&cb, kVideoTrackNum, 3);
1363 1353
1364 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1354 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1365 AppendCluster(cb.Finish()); 1355 AppendCluster(cb.Finish());
1366 1356
1367 // Verify that AppendData() ignores data after the error. 1357 // Verify that AppendData() ignores data after the error.
1368 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); 1358 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
1369 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), 1359 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(),
1370 append_window_start_for_next_append_, 1360 append_window_start_for_next_append_,
1371 append_window_end_for_next_append_, 1361 append_window_end_for_next_append_,
1372 &timestamp_offset_map_[kSourceId]); 1362 &timestamp_offset_map_[kSourceId]);
1373 } 1363 }
1374 1364
1375 1365
1376 TEST_P(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { 1366 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) {
1377 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1367 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1378 AppendCluster(kDefaultFirstCluster()); 1368 AppendCluster(kDefaultFirstCluster());
1379 1369
1380 ClusterBuilder cb; 1370 ClusterBuilder cb;
1381 1371
1382 // Test monotonic increasing timestamps on a per stream 1372 // Test monotonic increasing timestamps on a per stream
1383 // basis. 1373 // basis.
1384 cb.SetClusterTimecode(5); 1374 cb.SetClusterTimecode(5);
1385 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1375 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1386 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1376 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1387 AddSimpleBlock(&cb, kAudioTrackNum, 4); 1377 AddSimpleBlock(&cb, kAudioTrackNum, 4);
1388 AddSimpleBlock(&cb, kVideoTrackNum, 7); 1378 AddSimpleBlock(&cb, kVideoTrackNum, 7);
1389 1379
1390 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1380 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1391 AppendCluster(cb.Finish()); 1381 AppendCluster(cb.Finish());
1392 } 1382 }
1393 1383
1394 // Test the case where a cluster is passed to AppendCluster() before 1384 // Test the case where a cluster is passed to AppendCluster() before
1395 // INFO & TRACKS data. 1385 // INFO & TRACKS data.
1396 TEST_P(ChunkDemuxerTest, ClusterBeforeInitSegment) { 1386 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) {
1397 EXPECT_CALL(*this, DemuxerOpened()); 1387 EXPECT_CALL(*this, DemuxerOpened());
1398 demuxer_->Initialize( 1388 demuxer_->Initialize(
1399 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 1389 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
1400 1390
1401 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1391 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1402 1392
1403 AppendCluster(GenerateCluster(0, 1)); 1393 AppendCluster(GenerateCluster(0, 1));
1404 } 1394 }
1405 1395
1406 // Test cases where we get an MarkEndOfStream() call during initialization. 1396 // Test cases where we get an MarkEndOfStream() call during initialization.
1407 TEST_P(ChunkDemuxerTest, EOSDuringInit) { 1397 TEST_F(ChunkDemuxerTest, EOSDuringInit) {
1408 EXPECT_CALL(*this, DemuxerOpened()); 1398 EXPECT_CALL(*this, DemuxerOpened());
1409 demuxer_->Initialize( 1399 demuxer_->Initialize(
1410 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 1400 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
1411 MarkEndOfStream(PIPELINE_OK); 1401 MarkEndOfStream(PIPELINE_OK);
1412 } 1402 }
1413 1403
1414 TEST_P(ChunkDemuxerTest, EndOfStreamWithNoAppend) { 1404 TEST_F(ChunkDemuxerTest, EndOfStreamWithNoAppend) {
1415 EXPECT_CALL(*this, DemuxerOpened()); 1405 EXPECT_CALL(*this, DemuxerOpened());
1416 demuxer_->Initialize( 1406 demuxer_->Initialize(
1417 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 1407 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
1418 1408
1419 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1409 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1420 1410
1421 CheckExpectedRanges("{ }"); 1411 CheckExpectedRanges("{ }");
1422 MarkEndOfStream(PIPELINE_OK); 1412 MarkEndOfStream(PIPELINE_OK);
1423 ShutdownDemuxer(); 1413 ShutdownDemuxer();
1424 CheckExpectedRanges("{ }"); 1414 CheckExpectedRanges("{ }");
1425 demuxer_->RemoveId(kSourceId); 1415 demuxer_->RemoveId(kSourceId);
1426 demuxer_.reset(); 1416 demuxer_.reset();
1427 } 1417 }
1428 1418
1429 TEST_P(ChunkDemuxerTest, EndOfStreamWithNoMediaAppend) { 1419 TEST_F(ChunkDemuxerTest, EndOfStreamWithNoMediaAppend) {
1430 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1420 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1431 1421
1432 CheckExpectedRanges("{ }"); 1422 CheckExpectedRanges("{ }");
1433 MarkEndOfStream(PIPELINE_OK); 1423 MarkEndOfStream(PIPELINE_OK);
1434 CheckExpectedRanges("{ }"); 1424 CheckExpectedRanges("{ }");
1435 } 1425 }
1436 1426
1437 TEST_P(ChunkDemuxerTest, DecodeErrorEndOfStream) { 1427 TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) {
1438 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1428 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1439 1429
1440 AppendCluster(kDefaultFirstCluster()); 1430 AppendCluster(kDefaultFirstCluster());
1441 CheckExpectedRanges(kDefaultFirstClusterRange); 1431 CheckExpectedRanges(kDefaultFirstClusterRange);
1442 1432
1443 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1433 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1444 MarkEndOfStream(PIPELINE_ERROR_DECODE); 1434 MarkEndOfStream(PIPELINE_ERROR_DECODE);
1445 CheckExpectedRanges(kDefaultFirstClusterRange); 1435 CheckExpectedRanges(kDefaultFirstClusterRange);
1446 } 1436 }
1447 1437
1448 TEST_P(ChunkDemuxerTest, NetworkErrorEndOfStream) { 1438 TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) {
1449 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1439 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1450 1440
1451 AppendCluster(kDefaultFirstCluster()); 1441 AppendCluster(kDefaultFirstCluster());
1452 CheckExpectedRanges(kDefaultFirstClusterRange); 1442 CheckExpectedRanges(kDefaultFirstClusterRange);
1453 1443
1454 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 1444 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
1455 MarkEndOfStream(PIPELINE_ERROR_NETWORK); 1445 MarkEndOfStream(PIPELINE_ERROR_NETWORK);
1456 } 1446 }
1457 1447
1458 // Helper class to reduce duplicate code when testing end of stream 1448 // Helper class to reduce duplicate code when testing end of stream
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1498 1488
1499 Demuxer* demuxer_; 1489 Demuxer* demuxer_;
1500 bool audio_read_done_; 1490 bool audio_read_done_;
1501 bool video_read_done_; 1491 bool video_read_done_;
1502 1492
1503 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); 1493 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
1504 }; 1494 };
1505 1495
1506 // Make sure that all pending reads that we don't have media data for get an 1496 // Make sure that all pending reads that we don't have media data for get an
1507 // "end of stream" buffer when MarkEndOfStream() is called. 1497 // "end of stream" buffer when MarkEndOfStream() is called.
1508 TEST_P(ChunkDemuxerTest, EndOfStreamWithPendingReads) { 1498 TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) {
1509 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1499 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1510 1500
1511 AppendCluster(GenerateCluster(0, 2)); 1501 AppendCluster(GenerateCluster(0, 2));
1512 1502
1513 bool audio_read_done_1 = false; 1503 bool audio_read_done_1 = false;
1514 bool video_read_done_1 = false; 1504 bool video_read_done_1 = false;
1515 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 1505 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1516 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 1506 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1517 1507
1518 ReadAudio(base::Bind(&OnReadDone, 1508 ReadAudio(base::Bind(&OnReadDone,
(...skipping 14 matching lines...) Expand all
1533 MarkEndOfStream(PIPELINE_OK); 1523 MarkEndOfStream(PIPELINE_OK);
1534 1524
1535 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); 1525 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
1536 1526
1537 end_of_stream_helper_2.RequestReads(); 1527 end_of_stream_helper_2.RequestReads();
1538 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1528 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1539 } 1529 }
1540 1530
1541 // Make sure that all Read() calls after we get an MarkEndOfStream() 1531 // Make sure that all Read() calls after we get an MarkEndOfStream()
1542 // call return an "end of stream" buffer. 1532 // call return an "end of stream" buffer.
1543 TEST_P(ChunkDemuxerTest, ReadsAfterEndOfStream) { 1533 TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) {
1544 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1534 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1545 1535
1546 AppendCluster(GenerateCluster(0, 2)); 1536 AppendCluster(GenerateCluster(0, 2));
1547 1537
1548 bool audio_read_done_1 = false; 1538 bool audio_read_done_1 = false;
1549 bool video_read_done_1 = false; 1539 bool video_read_done_1 = false;
1550 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 1540 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1551 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 1541 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1552 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get()); 1542 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get());
1553 1543
(...skipping 18 matching lines...) Expand all
1572 1562
1573 // Request a few more reads and make sure we immediately get 1563 // Request a few more reads and make sure we immediately get
1574 // end of stream buffers. 1564 // end of stream buffers.
1575 end_of_stream_helper_2.RequestReads(); 1565 end_of_stream_helper_2.RequestReads();
1576 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1566 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1577 1567
1578 end_of_stream_helper_3.RequestReads(); 1568 end_of_stream_helper_3.RequestReads();
1579 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); 1569 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
1580 } 1570 }
1581 1571
1582 TEST_P(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) { 1572 TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) {
1583 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1573 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1584 1574
1585 AppendCluster(0, 10); 1575 AppendCluster(0, 10);
1586 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); 1576 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138)));
1587 MarkEndOfStream(PIPELINE_OK); 1577 MarkEndOfStream(PIPELINE_OK);
1588 1578
1589 // Start the first seek. 1579 // Start the first seek.
1590 Seek(base::TimeDelta::FromMilliseconds(20)); 1580 Seek(base::TimeDelta::FromMilliseconds(20));
1591 1581
1592 // Simulate another seek being requested before the first 1582 // Simulate another seek being requested before the first
(...skipping 10 matching lines...) Expand all
1603 // Make sure audio can reach end of stream. 1593 // Make sure audio can reach end of stream.
1604 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 1594 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
1605 ASSERT_EQ(status, DemuxerStream::kOk); 1595 ASSERT_EQ(status, DemuxerStream::kOk);
1606 1596
1607 // Make sure video can reach end of stream. 1597 // Make sure video can reach end of stream.
1608 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 1598 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
1609 ASSERT_EQ(status, DemuxerStream::kOk); 1599 ASSERT_EQ(status, DemuxerStream::kOk);
1610 } 1600 }
1611 1601
1612 // Verify buffered range change behavior for audio/video/text tracks. 1602 // Verify buffered range change behavior for audio/video/text tracks.
1613 TEST_P(ChunkDemuxerTest, EndOfStreamRangeChanges) { 1603 TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) {
1614 DemuxerStream* text_stream = NULL; 1604 DemuxerStream* text_stream = NULL;
1615 1605
1616 EXPECT_CALL(host_, AddTextStream(_, _)) 1606 EXPECT_CALL(host_, AddTextStream(_, _))
1617 .WillOnce(SaveArg<0>(&text_stream)); 1607 .WillOnce(SaveArg<0>(&text_stream));
1618 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 1608 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
1619 1609
1620 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 33"); 1610 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 33");
1621 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23K"); 1611 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23K");
1622 1612
1623 // Check expected ranges and verify that an empty text track does not 1613 // Check expected ranges and verify that an empty text track does not
(...skipping 18 matching lines...) Expand all
1642 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K"); 1632 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K");
1643 CheckExpectedRanges(kSourceId, "{ [0,46) }"); 1633 CheckExpectedRanges(kSourceId, "{ [0,46) }");
1644 1634
1645 // Mark end of stream and verify that text track data is reflected in 1635 // Mark end of stream and verify that text track data is reflected in
1646 // the new range. 1636 // the new range.
1647 MarkEndOfStream(PIPELINE_OK); 1637 MarkEndOfStream(PIPELINE_OK);
1648 CheckExpectedRanges(kSourceId, "{ [0,200) }"); 1638 CheckExpectedRanges(kSourceId, "{ [0,200) }");
1649 } 1639 }
1650 1640
1651 // Make sure AppendData() will accept elements that span multiple calls. 1641 // Make sure AppendData() will accept elements that span multiple calls.
1652 TEST_P(ChunkDemuxerTest, AppendingInPieces) { 1642 TEST_F(ChunkDemuxerTest, AppendingInPieces) {
1653 EXPECT_CALL(*this, DemuxerOpened()); 1643 EXPECT_CALL(*this, DemuxerOpened());
1654 demuxer_->Initialize( 1644 demuxer_->Initialize(
1655 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); 1645 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
1656 1646
1657 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1647 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1658 1648
1659 scoped_ptr<uint8[]> info_tracks; 1649 scoped_ptr<uint8[]> info_tracks;
1660 int info_tracks_size = 0; 1650 int info_tracks_size = 0;
1661 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, 1651 CreateInitSegment(HAS_AUDIO | HAS_VIDEO,
1662 false, false, &info_tracks, &info_tracks_size); 1652 false, false, &info_tracks, &info_tracks_size);
(...skipping 11 matching lines...) Expand all
1674 dst += cluster_a->size(); 1664 dst += cluster_a->size();
1675 1665
1676 memcpy(dst, cluster_b->data(), cluster_b->size()); 1666 memcpy(dst, cluster_b->data(), cluster_b->size());
1677 dst += cluster_b->size(); 1667 dst += cluster_b->size();
1678 1668
1679 AppendDataInPieces(buffer.get(), buffer_size); 1669 AppendDataInPieces(buffer.get(), buffer_size);
1680 1670
1681 GenerateExpectedReads(0, 9); 1671 GenerateExpectedReads(0, 9);
1682 } 1672 }
1683 1673
1684 TEST_P(ChunkDemuxerTest, WebMFile_AudioAndVideo) { 1674 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) {
1685 struct BufferTimestamps buffer_timestamps[] = { 1675 struct BufferTimestamps buffer_timestamps[] = {
1686 {0, 0}, 1676 {0, 0},
1687 {33, 3}, 1677 {33, 3},
1688 {67, 6}, 1678 {67, 6},
1689 {100, 9}, 1679 {100, 9},
1690 {133, 12}, 1680 {133, 12},
1691 {kSkip, kSkip}, 1681 {kSkip, kSkip},
1692 }; 1682 };
1693 1683
1694 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the 1684 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the
1695 // ParseWebMFile() call's expected duration, below, once the file is fixed to 1685 // ParseWebMFile() call's expected duration, below, once the file is fixed to
1696 // have the correct duration in the init segment. See http://crbug.com/354284. 1686 // have the correct duration in the init segment. See http://crbug.com/354284.
1697 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); 1687 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
1698 1688
1699 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps, 1689 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps,
1700 base::TimeDelta::FromMilliseconds(2744))); 1690 base::TimeDelta::FromMilliseconds(2744)));
1701 } 1691 }
1702 1692
1703 TEST_P(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { 1693 TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) {
1704 struct BufferTimestamps buffer_timestamps[] = { 1694 struct BufferTimestamps buffer_timestamps[] = {
1705 {0, 0}, 1695 {0, 0},
1706 {33, 3}, 1696 {33, 3},
1707 {67, 6}, 1697 {67, 6},
1708 {100, 9}, 1698 {100, 9},
1709 {133, 12}, 1699 {133, 12},
1710 {kSkip, kSkip}, 1700 {kSkip, kSkip},
1711 }; 1701 };
1712 1702
1713 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps, 1703 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps,
1714 kInfiniteDuration())); 1704 kInfiniteDuration()));
1715 } 1705 }
1716 1706
1717 TEST_P(ChunkDemuxerTest, WebMFile_AudioOnly) { 1707 TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) {
1718 struct BufferTimestamps buffer_timestamps[] = { 1708 struct BufferTimestamps buffer_timestamps[] = {
1719 {kSkip, 0}, 1709 {kSkip, 0},
1720 {kSkip, 3}, 1710 {kSkip, 3},
1721 {kSkip, 6}, 1711 {kSkip, 6},
1722 {kSkip, 9}, 1712 {kSkip, 9},
1723 {kSkip, 12}, 1713 {kSkip, 12},
1724 {kSkip, kSkip}, 1714 {kSkip, kSkip},
1725 }; 1715 };
1726 1716
1727 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the 1717 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the
1728 // ParseWebMFile() call's expected duration, below, once the file is fixed to 1718 // ParseWebMFile() call's expected duration, below, once the file is fixed to
1729 // have the correct duration in the init segment. See http://crbug.com/354284. 1719 // have the correct duration in the init segment. See http://crbug.com/354284.
1730 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); 1720 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
1731 1721
1732 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps, 1722 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps,
1733 base::TimeDelta::FromMilliseconds(2744), 1723 base::TimeDelta::FromMilliseconds(2744),
1734 HAS_AUDIO)); 1724 HAS_AUDIO));
1735 } 1725 }
1736 1726
1737 TEST_P(ChunkDemuxerTest, WebMFile_VideoOnly) { 1727 TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) {
1738 struct BufferTimestamps buffer_timestamps[] = { 1728 struct BufferTimestamps buffer_timestamps[] = {
1739 {0, kSkip}, 1729 {0, kSkip},
1740 {33, kSkip}, 1730 {33, kSkip},
1741 {67, kSkip}, 1731 {67, kSkip},
1742 {100, kSkip}, 1732 {100, kSkip},
1743 {133, kSkip}, 1733 {133, kSkip},
1744 {kSkip, kSkip}, 1734 {kSkip, kSkip},
1745 }; 1735 };
1746 1736
1747 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the 1737 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the
1748 // ParseWebMFile() call's expected duration, below, once the file is fixed to 1738 // ParseWebMFile() call's expected duration, below, once the file is fixed to
1749 // have the correct duration in the init segment. See http://crbug.com/354284. 1739 // have the correct duration in the init segment. See http://crbug.com/354284.
1750 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2736))); 1740 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2736)));
1751 1741
1752 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps, 1742 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps,
1753 base::TimeDelta::FromMilliseconds(2703), 1743 base::TimeDelta::FromMilliseconds(2703),
1754 HAS_VIDEO)); 1744 HAS_VIDEO));
1755 } 1745 }
1756 1746
1757 TEST_P(ChunkDemuxerTest, WebMFile_AltRefFrames) { 1747 TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) {
1758 struct BufferTimestamps buffer_timestamps[] = { 1748 struct BufferTimestamps buffer_timestamps[] = {
1759 {0, 0}, 1749 {0, 0},
1760 {33, 3}, 1750 {33, 3},
1761 {33, 6}, 1751 {33, 6},
1762 {67, 9}, 1752 {67, 9},
1763 {100, 12}, 1753 {100, 12},
1764 {kSkip, kSkip}, 1754 {kSkip, kSkip},
1765 }; 1755 };
1766 1756
1767 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps, 1757 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps,
1768 base::TimeDelta::FromMilliseconds(2767))); 1758 base::TimeDelta::FromMilliseconds(2767)));
1769 } 1759 }
1770 1760
1771 // Verify that we output buffers before the entire cluster has been parsed. 1761 // Verify that we output buffers before the entire cluster has been parsed.
1772 TEST_P(ChunkDemuxerTest, IncrementalClusterParsing) { 1762 TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) {
1773 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1763 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1774 AppendEmptyCluster(0); 1764 AppendEmptyCluster(0);
1775 1765
1776 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); 1766 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6));
1777 1767
1778 bool audio_read_done = false; 1768 bool audio_read_done = false;
1779 bool video_read_done = false; 1769 bool video_read_done = false;
1780 ReadAudio(base::Bind(&OnReadDone, 1770 ReadAudio(base::Bind(&OnReadDone,
1781 base::TimeDelta::FromMilliseconds(0), 1771 base::TimeDelta::FromMilliseconds(0),
1782 &audio_read_done)); 1772 &audio_read_done));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 // Append the remaining data. 1805 // Append the remaining data.
1816 ASSERT_LT(i, cluster->size()); 1806 ASSERT_LT(i, cluster->size());
1817 AppendData(cluster->data() + i, cluster->size() - i); 1807 AppendData(cluster->data() + i, cluster->size() - i);
1818 1808
1819 message_loop_.RunUntilIdle(); 1809 message_loop_.RunUntilIdle();
1820 1810
1821 EXPECT_TRUE(audio_read_done); 1811 EXPECT_TRUE(audio_read_done);
1822 EXPECT_TRUE(video_read_done); 1812 EXPECT_TRUE(video_read_done);
1823 } 1813 }
1824 1814
1825 TEST_P(ChunkDemuxerTest, ParseErrorDuringInit) { 1815 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
1826 EXPECT_CALL(*this, DemuxerOpened()); 1816 EXPECT_CALL(*this, DemuxerOpened());
1827 demuxer_->Initialize( 1817 demuxer_->Initialize(
1828 &host_, CreateInitDoneCB( 1818 &host_, CreateInitDoneCB(
1829 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN), true); 1819 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN), true);
1830 1820
1831 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1821 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1832 1822
1833 uint8 tmp = 0; 1823 uint8 tmp = 0;
1834 demuxer_->AppendData(kSourceId, &tmp, 1, 1824 demuxer_->AppendData(kSourceId, &tmp, 1,
1835 append_window_start_for_next_append_, 1825 append_window_start_for_next_append_,
1836 append_window_end_for_next_append_, 1826 append_window_end_for_next_append_,
1837 &timestamp_offset_map_[kSourceId]); 1827 &timestamp_offset_map_[kSourceId]);
1838 } 1828 }
1839 1829
1840 TEST_P(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { 1830 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
1841 EXPECT_CALL(*this, DemuxerOpened()); 1831 EXPECT_CALL(*this, DemuxerOpened());
1842 demuxer_->Initialize( 1832 demuxer_->Initialize(
1843 &host_, CreateInitDoneCB(kNoTimestamp(), 1833 &host_, CreateInitDoneCB(kNoTimestamp(),
1844 DEMUXER_ERROR_COULD_NOT_OPEN), true); 1834 DEMUXER_ERROR_COULD_NOT_OPEN), true);
1845 1835
1846 std::vector<std::string> codecs(1); 1836 std::vector<std::string> codecs(1);
1847 codecs[0] = "vorbis"; 1837 codecs[0] = "vorbis";
1848 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs, 1838 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
1849 use_legacy_frame_processor_),
1850 ChunkDemuxer::kOk); 1839 ChunkDemuxer::kOk);
1851 1840
1852 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 1841 AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
1853 } 1842 }
1854 1843
1855 TEST_P(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { 1844 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
1856 EXPECT_CALL(*this, DemuxerOpened()); 1845 EXPECT_CALL(*this, DemuxerOpened());
1857 demuxer_->Initialize( 1846 demuxer_->Initialize(
1858 &host_, CreateInitDoneCB(kNoTimestamp(), 1847 &host_, CreateInitDoneCB(kNoTimestamp(),
1859 DEMUXER_ERROR_COULD_NOT_OPEN), true); 1848 DEMUXER_ERROR_COULD_NOT_OPEN), true);
1860 1849
1861 std::vector<std::string> codecs(1); 1850 std::vector<std::string> codecs(1);
1862 codecs[0] = "vp8"; 1851 codecs[0] = "vp8";
1863 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs, 1852 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
1864 use_legacy_frame_processor_),
1865 ChunkDemuxer::kOk); 1853 ChunkDemuxer::kOk);
1866 1854
1867 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 1855 AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
1868 } 1856 }
1869 1857
1870 TEST_P(ChunkDemuxerTest, MultipleHeaders) { 1858 TEST_F(ChunkDemuxerTest, MultipleHeaders) {
1871 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1859 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1872 1860
1873 AppendCluster(kDefaultFirstCluster()); 1861 AppendCluster(kDefaultFirstCluster());
1874 1862
1875 // Append another identical initialization segment. 1863 // Append another identical initialization segment.
1876 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 1864 AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
1877 1865
1878 AppendCluster(kDefaultSecondCluster()); 1866 AppendCluster(kDefaultSecondCluster());
1879 1867
1880 GenerateExpectedReads(0, 9); 1868 GenerateExpectedReads(0, 9);
1881 } 1869 }
1882 1870
1883 TEST_P(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { 1871 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) {
1884 std::string audio_id = "audio1"; 1872 std::string audio_id = "audio1";
1885 std::string video_id = "video1"; 1873 std::string video_id = "video1";
1886 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1874 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1887 1875
1888 // Append audio and video data into separate source ids. 1876 // Append audio and video data into separate source ids.
1889 AppendCluster(audio_id, 1877 AppendCluster(audio_id,
1890 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 1878 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1891 GenerateAudioStreamExpectedReads(0, 4); 1879 GenerateAudioStreamExpectedReads(0, 4);
1892 AppendCluster(video_id, 1880 AppendCluster(video_id,
1893 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 1881 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1894 GenerateVideoStreamExpectedReads(0, 4); 1882 GenerateVideoStreamExpectedReads(0, 4);
1895 } 1883 }
1896 1884
1897 TEST_P(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) { 1885 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) {
1898 // TODO(matthewjheaney): Here and elsewhere, we need more tests 1886 // TODO(matthewjheaney): Here and elsewhere, we need more tests
1899 // for inband text tracks (http://crbug/321455). 1887 // for inband text tracks (http://crbug/321455).
1900 1888
1901 std::string audio_id = "audio1"; 1889 std::string audio_id = "audio1";
1902 std::string video_id = "video1"; 1890 std::string video_id = "video1";
1903 1891
1904 EXPECT_CALL(host_, AddTextStream(_, _)) 1892 EXPECT_CALL(host_, AddTextStream(_, _))
1905 .Times(Exactly(2)); 1893 .Times(Exactly(2));
1906 ASSERT_TRUE(InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, true)); 1894 ASSERT_TRUE(InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, true));
1907 1895
1908 // Append audio and video data into separate source ids. 1896 // Append audio and video data into separate source ids.
1909 AppendCluster(audio_id, 1897 AppendCluster(audio_id,
1910 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 1898 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1911 GenerateAudioStreamExpectedReads(0, 4); 1899 GenerateAudioStreamExpectedReads(0, 4);
1912 AppendCluster(video_id, 1900 AppendCluster(video_id,
1913 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 1901 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1914 GenerateVideoStreamExpectedReads(0, 4); 1902 GenerateVideoStreamExpectedReads(0, 4);
1915 } 1903 }
1916 1904
1917 TEST_P(ChunkDemuxerTest, AddIdFailures) { 1905 TEST_F(ChunkDemuxerTest, AddIdFailures) {
1918 EXPECT_CALL(*this, DemuxerOpened()); 1906 EXPECT_CALL(*this, DemuxerOpened());
1919 demuxer_->Initialize( 1907 demuxer_->Initialize(
1920 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); 1908 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
1921 1909
1922 std::string audio_id = "audio1"; 1910 std::string audio_id = "audio1";
1923 std::string video_id = "video1"; 1911 std::string video_id = "video1";
1924 1912
1925 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk); 1913 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk);
1926 1914
1927 // Adding an id with audio/video should fail because we already added audio. 1915 // Adding an id with audio/video should fail because we already added audio.
1928 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); 1916 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
1929 1917
1930 AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO); 1918 AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO);
1931 1919
1932 // Adding an id after append should fail. 1920 // Adding an id after append should fail.
1933 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit); 1921 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit);
1934 } 1922 }
1935 1923
1936 // Test that Read() calls after a RemoveId() return "end of stream" buffers. 1924 // Test that Read() calls after a RemoveId() return "end of stream" buffers.
1937 TEST_P(ChunkDemuxerTest, RemoveId) { 1925 TEST_F(ChunkDemuxerTest, RemoveId) {
1938 std::string audio_id = "audio1"; 1926 std::string audio_id = "audio1";
1939 std::string video_id = "video1"; 1927 std::string video_id = "video1";
1940 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1928 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1941 1929
1942 // Append audio and video data into separate source ids. 1930 // Append audio and video data into separate source ids.
1943 AppendCluster(audio_id, 1931 AppendCluster(audio_id,
1944 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 1932 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1945 AppendCluster(video_id, 1933 AppendCluster(video_id,
1946 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 1934 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1947 1935
1948 // Read() from audio should return normal buffers. 1936 // Read() from audio should return normal buffers.
1949 GenerateAudioStreamExpectedReads(0, 4); 1937 GenerateAudioStreamExpectedReads(0, 4);
1950 1938
1951 // Remove the audio id. 1939 // Remove the audio id.
1952 demuxer_->RemoveId(audio_id); 1940 demuxer_->RemoveId(audio_id);
1953 1941
1954 // Read() from audio should return "end of stream" buffers. 1942 // Read() from audio should return "end of stream" buffers.
1955 bool audio_read_done = false; 1943 bool audio_read_done = false;
1956 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 1944 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
1957 message_loop_.RunUntilIdle(); 1945 message_loop_.RunUntilIdle();
1958 EXPECT_TRUE(audio_read_done); 1946 EXPECT_TRUE(audio_read_done);
1959 1947
1960 // Read() from video should still return normal buffers. 1948 // Read() from video should still return normal buffers.
1961 GenerateVideoStreamExpectedReads(0, 4); 1949 GenerateVideoStreamExpectedReads(0, 4);
1962 } 1950 }
1963 1951
1964 // Test that removing an ID immediately after adding it does not interfere with 1952 // Test that removing an ID immediately after adding it does not interfere with
1965 // quota for new IDs in the future. 1953 // quota for new IDs in the future.
1966 TEST_P(ChunkDemuxerTest, RemoveAndAddId) { 1954 TEST_F(ChunkDemuxerTest, RemoveAndAddId) {
1967 std::string audio_id_1 = "audio1"; 1955 std::string audio_id_1 = "audio1";
1968 ASSERT_TRUE(AddId(audio_id_1, HAS_AUDIO) == ChunkDemuxer::kOk); 1956 ASSERT_TRUE(AddId(audio_id_1, HAS_AUDIO) == ChunkDemuxer::kOk);
1969 demuxer_->RemoveId(audio_id_1); 1957 demuxer_->RemoveId(audio_id_1);
1970 1958
1971 std::string audio_id_2 = "audio2"; 1959 std::string audio_id_2 = "audio2";
1972 ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk); 1960 ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk);
1973 } 1961 }
1974 1962
1975 TEST_P(ChunkDemuxerTest, SeekCanceled) { 1963 TEST_F(ChunkDemuxerTest, SeekCanceled) {
1976 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1964 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1977 1965
1978 // Append cluster at the beginning of the stream. 1966 // Append cluster at the beginning of the stream.
1979 AppendCluster(GenerateCluster(0, 4)); 1967 AppendCluster(GenerateCluster(0, 4));
1980 1968
1981 // Seek to an unbuffered region. 1969 // Seek to an unbuffered region.
1982 Seek(base::TimeDelta::FromSeconds(50)); 1970 Seek(base::TimeDelta::FromSeconds(50));
1983 1971
1984 // Attempt to read in unbuffered area; should not fulfill the read. 1972 // Attempt to read in unbuffered area; should not fulfill the read.
1985 bool audio_read_done = false; 1973 bool audio_read_done = false;
1986 bool video_read_done = false; 1974 bool video_read_done = false;
1987 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 1975 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
1988 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 1976 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
1989 EXPECT_FALSE(audio_read_done); 1977 EXPECT_FALSE(audio_read_done);
1990 EXPECT_FALSE(video_read_done); 1978 EXPECT_FALSE(video_read_done);
1991 1979
1992 // Now cancel the pending seek, which should flush the reads with empty 1980 // Now cancel the pending seek, which should flush the reads with empty
1993 // buffers. 1981 // buffers.
1994 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 1982 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
1995 demuxer_->CancelPendingSeek(seek_time); 1983 demuxer_->CancelPendingSeek(seek_time);
1996 message_loop_.RunUntilIdle(); 1984 message_loop_.RunUntilIdle();
1997 EXPECT_TRUE(audio_read_done); 1985 EXPECT_TRUE(audio_read_done);
1998 EXPECT_TRUE(video_read_done); 1986 EXPECT_TRUE(video_read_done);
1999 1987
2000 // A seek back to the buffered region should succeed. 1988 // A seek back to the buffered region should succeed.
2001 Seek(seek_time); 1989 Seek(seek_time);
2002 GenerateExpectedReads(0, 4); 1990 GenerateExpectedReads(0, 4);
2003 } 1991 }
2004 1992
2005 TEST_P(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { 1993 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) {
2006 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1994 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2007 1995
2008 // Append cluster at the beginning of the stream. 1996 // Append cluster at the beginning of the stream.
2009 AppendCluster(GenerateCluster(0, 4)); 1997 AppendCluster(GenerateCluster(0, 4));
2010 1998
2011 // Start waiting for a seek. 1999 // Start waiting for a seek.
2012 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50); 2000 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50);
2013 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0); 2001 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0);
2014 demuxer_->StartWaitingForSeek(seek_time1); 2002 demuxer_->StartWaitingForSeek(seek_time1);
2015 2003
2016 // Now cancel the upcoming seek to an unbuffered region. 2004 // Now cancel the upcoming seek to an unbuffered region.
2017 demuxer_->CancelPendingSeek(seek_time2); 2005 demuxer_->CancelPendingSeek(seek_time2);
2018 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK)); 2006 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK));
2019 2007
2020 // Read requests should be fulfilled with empty buffers. 2008 // Read requests should be fulfilled with empty buffers.
2021 bool audio_read_done = false; 2009 bool audio_read_done = false;
2022 bool video_read_done = false; 2010 bool video_read_done = false;
2023 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 2011 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
2024 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 2012 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
2025 EXPECT_TRUE(audio_read_done); 2013 EXPECT_TRUE(audio_read_done);
2026 EXPECT_TRUE(video_read_done); 2014 EXPECT_TRUE(video_read_done);
2027 2015
2028 // A seek back to the buffered region should succeed. 2016 // A seek back to the buffered region should succeed.
2029 Seek(seek_time2); 2017 Seek(seek_time2);
2030 GenerateExpectedReads(0, 4); 2018 GenerateExpectedReads(0, 4);
2031 } 2019 }
2032 2020
2033 // Test that Seek() successfully seeks to all source IDs. 2021 // Test that Seek() successfully seeks to all source IDs.
2034 TEST_P(ChunkDemuxerTest, SeekAudioAndVideoSources) { 2022 TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) {
2035 std::string audio_id = "audio1"; 2023 std::string audio_id = "audio1";
2036 std::string video_id = "video1"; 2024 std::string video_id = "video1";
2037 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2025 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2038 2026
2039 AppendCluster( 2027 AppendCluster(
2040 audio_id, 2028 audio_id,
2041 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2029 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
2042 AppendCluster( 2030 AppendCluster(
2043 video_id, 2031 video_id,
2044 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2032 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2081 2069
2082 // Read() should return buffers at 3. 2070 // Read() should return buffers at 3.
2083 EXPECT_TRUE(audio_read_done); 2071 EXPECT_TRUE(audio_read_done);
2084 EXPECT_TRUE(video_read_done); 2072 EXPECT_TRUE(video_read_done);
2085 } 2073 }
2086 2074
2087 // Test that Seek() completes successfully when EndOfStream 2075 // Test that Seek() completes successfully when EndOfStream
2088 // is called before data is available for that seek point. 2076 // is called before data is available for that seek point.
2089 // This scenario might be useful if seeking past the end of stream 2077 // This scenario might be useful if seeking past the end of stream
2090 // of either audio or video (or both). 2078 // of either audio or video (or both).
2091 TEST_P(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) { 2079 TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) {
2092 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2080 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2093 2081
2094 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); 2082 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10));
2095 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5)); 2083 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5));
2096 2084
2097 // Seeking past the end of video. 2085 // Seeking past the end of video.
2098 // Note: audio data is available for that seek point. 2086 // Note: audio data is available for that seek point.
2099 bool seek_cb_was_called = false; 2087 bool seek_cb_was_called = false;
2100 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110); 2088 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110);
2101 demuxer_->StartWaitingForSeek(seek_time); 2089 demuxer_->StartWaitingForSeek(seek_time);
2102 demuxer_->Seek(seek_time, 2090 demuxer_->Seek(seek_time,
2103 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); 2091 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
2104 message_loop_.RunUntilIdle(); 2092 message_loop_.RunUntilIdle();
2105 2093
2106 EXPECT_FALSE(seek_cb_was_called); 2094 EXPECT_FALSE(seek_cb_was_called);
2107 2095
2108 EXPECT_CALL(host_, SetDuration( 2096 EXPECT_CALL(host_, SetDuration(
2109 base::TimeDelta::FromMilliseconds(120))); 2097 base::TimeDelta::FromMilliseconds(120)));
2110 MarkEndOfStream(PIPELINE_OK); 2098 MarkEndOfStream(PIPELINE_OK);
2111 message_loop_.RunUntilIdle(); 2099 message_loop_.RunUntilIdle();
2112 2100
2113 EXPECT_TRUE(seek_cb_was_called); 2101 EXPECT_TRUE(seek_cb_was_called);
2114 2102
2115 ShutdownDemuxer(); 2103 ShutdownDemuxer();
2116 } 2104 }
2117 2105
2118 // Test that EndOfStream is ignored if coming during a pending seek 2106 // Test that EndOfStream is ignored if coming during a pending seek
2119 // whose seek time is before some existing ranges. 2107 // whose seek time is before some existing ranges.
2120 TEST_P(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) { 2108 TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) {
2121 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2109 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2122 2110
2123 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); 2111 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10));
2124 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5)); 2112 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5));
2125 AppendCluster(GenerateSingleStreamCluster(200, 300, kAudioTrackNum, 10)); 2113 AppendCluster(GenerateSingleStreamCluster(200, 300, kAudioTrackNum, 10));
2126 AppendCluster(GenerateSingleStreamCluster(200, 300, kVideoTrackNum, 5)); 2114 AppendCluster(GenerateSingleStreamCluster(200, 300, kVideoTrackNum, 5));
2127 2115
2128 bool seek_cb_was_called = false; 2116 bool seek_cb_was_called = false;
2129 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160); 2117 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160);
2130 demuxer_->StartWaitingForSeek(seek_time); 2118 demuxer_->StartWaitingForSeek(seek_time);
(...skipping 15 matching lines...) Expand all
2146 AppendCluster(GenerateSingleStreamCluster(140, 180, kVideoTrackNum, 5)); 2134 AppendCluster(GenerateSingleStreamCluster(140, 180, kVideoTrackNum, 5));
2147 2135
2148 message_loop_.RunUntilIdle(); 2136 message_loop_.RunUntilIdle();
2149 2137
2150 EXPECT_TRUE(seek_cb_was_called); 2138 EXPECT_TRUE(seek_cb_was_called);
2151 2139
2152 ShutdownDemuxer(); 2140 ShutdownDemuxer();
2153 } 2141 }
2154 2142
2155 // Test ranges in an audio-only stream. 2143 // Test ranges in an audio-only stream.
2156 TEST_P(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { 2144 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
2157 EXPECT_CALL(*this, DemuxerOpened()); 2145 EXPECT_CALL(*this, DemuxerOpened());
2158 demuxer_->Initialize( 2146 demuxer_->Initialize(
2159 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); 2147 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2160 2148
2161 ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk); 2149 ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk);
2162 AppendInitSegment(HAS_AUDIO); 2150 AppendInitSegment(HAS_AUDIO);
2163 2151
2164 // Test a simple cluster. 2152 // Test a simple cluster.
2165 AppendCluster( 2153 AppendCluster(
2166 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2154 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
2167 2155
2168 CheckExpectedRanges("{ [0,92) }"); 2156 CheckExpectedRanges("{ [0,92) }");
2169 2157
2170 // Append a disjoint cluster to check for two separate ranges. 2158 // Append a disjoint cluster to check for two separate ranges.
2171 AppendCluster(GenerateSingleStreamCluster( 2159 AppendCluster(GenerateSingleStreamCluster(
2172 150, 219, kAudioTrackNum, kAudioBlockDuration)); 2160 150, 219, kAudioTrackNum, kAudioBlockDuration));
2173 2161
2174 CheckExpectedRanges("{ [0,92) [150,219) }"); 2162 CheckExpectedRanges("{ [0,92) [150,219) }");
2175 } 2163 }
2176 2164
2177 // Test ranges in a video-only stream. 2165 // Test ranges in a video-only stream.
2178 TEST_P(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { 2166 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
2179 EXPECT_CALL(*this, DemuxerOpened()); 2167 EXPECT_CALL(*this, DemuxerOpened());
2180 demuxer_->Initialize( 2168 demuxer_->Initialize(
2181 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); 2169 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2182 2170
2183 ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk); 2171 ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk);
2184 AppendInitSegment(HAS_VIDEO); 2172 AppendInitSegment(HAS_VIDEO);
2185 2173
2186 // Test a simple cluster. 2174 // Test a simple cluster.
2187 AppendCluster( 2175 AppendCluster(
2188 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2176 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
2189 2177
2190 CheckExpectedRanges("{ [0,132) }"); 2178 CheckExpectedRanges("{ [0,132) }");
2191 2179
2192 // Append a disjoint cluster to check for two separate ranges. 2180 // Append a disjoint cluster to check for two separate ranges.
2193 AppendCluster(GenerateSingleStreamCluster( 2181 AppendCluster(GenerateSingleStreamCluster(
2194 200, 299, kVideoTrackNum, kVideoBlockDuration)); 2182 200, 299, kVideoTrackNum, kVideoBlockDuration));
2195 2183
2196 CheckExpectedRanges("{ [0,132) [200,299) }"); 2184 CheckExpectedRanges("{ [0,132) [200,299) }");
2197 } 2185 }
2198 2186
2199 TEST_P(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { 2187 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
2200 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2188 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2201 2189
2202 // Audio: 0 -> 23 2190 // Audio: 0 -> 23
2203 // Video: 0 -> 33 2191 // Video: 0 -> 33
2204 // Buffered Range: 0 -> 23 2192 // Buffered Range: 0 -> 23
2205 // Audio block duration is smaller than video block duration, 2193 // Audio block duration is smaller than video block duration,
2206 // so the buffered ranges should correspond to the audio blocks. 2194 // so the buffered ranges should correspond to the audio blocks.
2207 AppendCluster(GenerateSingleStreamCluster( 2195 AppendCluster(GenerateSingleStreamCluster(
2208 0, kAudioBlockDuration, kAudioTrackNum, kAudioBlockDuration)); 2196 0, kAudioBlockDuration, kAudioTrackNum, kAudioBlockDuration));
2209 AppendCluster(GenerateSingleStreamCluster( 2197 AppendCluster(GenerateSingleStreamCluster(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2246 // Appending within buffered range should not affect buffered ranges. 2234 // Appending within buffered range should not affect buffered ranges.
2247 AppendCluster(GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)); 2235 AppendCluster(GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20));
2248 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 2236 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
2249 2237
2250 // Appending to single stream outside buffered ranges should not affect 2238 // Appending to single stream outside buffered ranges should not affect
2251 // buffered ranges. 2239 // buffered ranges.
2252 AppendCluster(GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10)); 2240 AppendCluster(GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10));
2253 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 2241 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
2254 } 2242 }
2255 2243
2256 TEST_P(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) { 2244 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) {
2257 EXPECT_CALL(host_, AddTextStream(_, _)); 2245 EXPECT_CALL(host_, AddTextStream(_, _));
2258 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 2246 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
2259 2247
2260 // Append audio & video data 2248 // Append audio & video data
2261 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23"); 2249 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23");
2262 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 33"); 2250 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 33");
2263 2251
2264 // Verify that a text track with no cues does not result in an empty buffered 2252 // Verify that a text track with no cues does not result in an empty buffered
2265 // range. 2253 // range.
2266 CheckExpectedRanges("{ [0,46) }"); 2254 CheckExpectedRanges("{ [0,46) }");
2267 2255
2268 // Add some text cues. 2256 // Add some text cues.
2269 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K"); 2257 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K");
2270 2258
2271 // Verify that the new cues did not affect the buffered ranges. 2259 // Verify that the new cues did not affect the buffered ranges.
2272 CheckExpectedRanges("{ [0,46) }"); 2260 CheckExpectedRanges("{ [0,46) }");
2273 2261
2274 // Remove the buffered range. 2262 // Remove the buffered range.
2275 demuxer_->Remove(kSourceId, base::TimeDelta(), 2263 demuxer_->Remove(kSourceId, base::TimeDelta(),
2276 base::TimeDelta::FromMilliseconds(46)); 2264 base::TimeDelta::FromMilliseconds(46));
2277 CheckExpectedRanges("{ }"); 2265 CheckExpectedRanges("{ }");
2278 } 2266 }
2279 2267
2280 // Once MarkEndOfStream() is called, GetBufferedRanges should not cut off any 2268 // Once MarkEndOfStream() is called, GetBufferedRanges should not cut off any
2281 // over-hanging tails at the end of the ranges as this is likely due to block 2269 // over-hanging tails at the end of the ranges as this is likely due to block
2282 // duration differences. 2270 // duration differences.
2283 TEST_P(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { 2271 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
2284 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2272 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2285 2273
2286 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23K"); 2274 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23K");
2287 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 33"); 2275 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 33");
2288 2276
2289 CheckExpectedRanges("{ [0,46) }"); 2277 CheckExpectedRanges("{ [0,46) }");
2290 2278
2291 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(66))); 2279 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(66)));
2292 MarkEndOfStream(PIPELINE_OK); 2280 MarkEndOfStream(PIPELINE_OK);
2293 2281
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2331 2319
2332 MarkEndOfStream(PIPELINE_OK); 2320 MarkEndOfStream(PIPELINE_OK);
2333 2321
2334 // NOTE: The last range on each stream gets extended to the highest 2322 // NOTE: The last range on each stream gets extended to the highest
2335 // end timestamp according to the spec. The last audio range gets extended 2323 // end timestamp according to the spec. The last audio range gets extended
2336 // from [200,246) to [200,398) which is why the intersection results in the 2324 // from [200,246) to [200,398) which is why the intersection results in the
2337 // middle range getting larger AND the new range appearing. 2325 // middle range getting larger AND the new range appearing.
2338 CheckExpectedRanges("{ [0,46) [200,266) [332,398) }"); 2326 CheckExpectedRanges("{ [0,46) [200,266) [332,398) }");
2339 } 2327 }
2340 2328
2341 TEST_P(ChunkDemuxerTest, DifferentStreamTimecodes) { 2329 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) {
2342 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2330 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2343 2331
2344 // Create a cluster where the video timecode begins 25ms after the audio. 2332 // Create a cluster where the video timecode begins 25ms after the audio.
2345 AppendCluster(GenerateCluster(0, 25, 8)); 2333 AppendCluster(GenerateCluster(0, 25, 8));
2346 2334
2347 Seek(base::TimeDelta::FromSeconds(0)); 2335 Seek(base::TimeDelta::FromSeconds(0));
2348 GenerateExpectedReads(0, 25, 8); 2336 GenerateExpectedReads(0, 25, 8);
2349 2337
2350 // Seek to 5 seconds. 2338 // Seek to 5 seconds.
2351 Seek(base::TimeDelta::FromSeconds(5)); 2339 Seek(base::TimeDelta::FromSeconds(5));
2352 2340
2353 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms 2341 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms
2354 // after the video. 2342 // after the video.
2355 AppendCluster(GenerateCluster(5025, 5000, 8)); 2343 AppendCluster(GenerateCluster(5025, 5000, 8));
2356 GenerateExpectedReads(5025, 5000, 8); 2344 GenerateExpectedReads(5025, 5000, 8);
2357 } 2345 }
2358 2346
2359 TEST_P(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) { 2347 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) {
2360 std::string audio_id = "audio1"; 2348 std::string audio_id = "audio1";
2361 std::string video_id = "video1"; 2349 std::string video_id = "video1";
2362 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2350 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2363 2351
2364 // Generate two streams where the video stream starts 5ms after the audio 2352 // Generate two streams where the video stream starts 5ms after the audio
2365 // stream and append them. 2353 // stream and append them.
2366 AppendCluster(audio_id, GenerateSingleStreamCluster( 2354 AppendCluster(audio_id, GenerateSingleStreamCluster(
2367 25, 4 * kAudioBlockDuration + 25, kAudioTrackNum, kAudioBlockDuration)); 2355 25, 4 * kAudioBlockDuration + 25, kAudioTrackNum, kAudioBlockDuration));
2368 AppendCluster(video_id, GenerateSingleStreamCluster( 2356 AppendCluster(video_id, GenerateSingleStreamCluster(
2369 30, 4 * kVideoBlockDuration + 30, kVideoTrackNum, kVideoBlockDuration)); 2357 30, 4 * kVideoBlockDuration + 30, kVideoTrackNum, kVideoBlockDuration));
2370 2358
2371 // Both streams should be able to fulfill a seek to 25. 2359 // Both streams should be able to fulfill a seek to 25.
2372 Seek(base::TimeDelta::FromMilliseconds(25)); 2360 Seek(base::TimeDelta::FromMilliseconds(25));
2373 GenerateAudioStreamExpectedReads(25, 4); 2361 GenerateAudioStreamExpectedReads(25, 4);
2374 GenerateVideoStreamExpectedReads(30, 4); 2362 GenerateVideoStreamExpectedReads(30, 4);
2375 } 2363 }
2376 2364
2377 TEST_P(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) { 2365 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) {
2378 std::string audio_id = "audio1"; 2366 std::string audio_id = "audio1";
2379 std::string video_id = "video1"; 2367 std::string video_id = "video1";
2380 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2368 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2381 2369
2382 // Generate two streams where the video stream starts 10s after the audio 2370 // Generate two streams where the video stream starts 10s after the audio
2383 // stream and append them. 2371 // stream and append them.
2384 AppendCluster(audio_id, GenerateSingleStreamCluster(0, 2372 AppendCluster(audio_id, GenerateSingleStreamCluster(0,
2385 4 * kAudioBlockDuration + 0, kAudioTrackNum, kAudioBlockDuration)); 2373 4 * kAudioBlockDuration + 0, kAudioTrackNum, kAudioBlockDuration));
2386 AppendCluster(video_id, GenerateSingleStreamCluster(10000, 2374 AppendCluster(video_id, GenerateSingleStreamCluster(10000,
2387 4 * kVideoBlockDuration + 10000, kVideoTrackNum, kVideoBlockDuration)); 2375 4 * kVideoBlockDuration + 10000, kVideoTrackNum, kVideoBlockDuration));
2388 2376
2389 // Should not be able to fulfill a seek to 0. 2377 // Should not be able to fulfill a seek to 0.
2390 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0); 2378 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0);
2391 demuxer_->StartWaitingForSeek(seek_time); 2379 demuxer_->StartWaitingForSeek(seek_time);
2392 demuxer_->Seek(seek_time, 2380 demuxer_->Seek(seek_time,
2393 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); 2381 NewExpectedStatusCB(PIPELINE_ERROR_ABORT));
2394 ExpectRead(DemuxerStream::AUDIO, 0); 2382 ExpectRead(DemuxerStream::AUDIO, 0);
2395 ExpectEndOfStream(DemuxerStream::VIDEO); 2383 ExpectEndOfStream(DemuxerStream::VIDEO);
2396 } 2384 }
2397 2385
2398 TEST_P(ChunkDemuxerTest, ClusterWithNoBuffers) { 2386 TEST_F(ChunkDemuxerTest, ClusterWithNoBuffers) {
2399 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2387 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2400 2388
2401 // Generate and append an empty cluster beginning at 0. 2389 // Generate and append an empty cluster beginning at 0.
2402 AppendEmptyCluster(0); 2390 AppendEmptyCluster(0);
2403 2391
2404 // Sanity check that data can be appended after this cluster correctly. 2392 // Sanity check that data can be appended after this cluster correctly.
2405 AppendCluster(GenerateCluster(0, 2)); 2393 AppendCluster(GenerateCluster(0, 2));
2406 ExpectRead(DemuxerStream::AUDIO, 0); 2394 ExpectRead(DemuxerStream::AUDIO, 0);
2407 ExpectRead(DemuxerStream::VIDEO, 0); 2395 ExpectRead(DemuxerStream::VIDEO, 0);
2408 } 2396 }
2409 2397
2410 TEST_P(ChunkDemuxerTest, CodecPrefixMatching) { 2398 TEST_F(ChunkDemuxerTest, CodecPrefixMatching) {
2411 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; 2399 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported;
2412 2400
2413 #if defined(USE_PROPRIETARY_CODECS) 2401 #if defined(USE_PROPRIETARY_CODECS)
2414 expected = ChunkDemuxer::kOk; 2402 expected = ChunkDemuxer::kOk;
2415 #endif 2403 #endif
2416 2404
2417 std::vector<std::string> codecs; 2405 std::vector<std::string> codecs;
2418 codecs.push_back("avc1.4D4041"); 2406 codecs.push_back("avc1.4D4041");
2419 2407
2420 EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs, 2408 EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected);
2421 use_legacy_frame_processor_),
2422 expected);
2423 } 2409 }
2424 2410
2425 // Test codec ID's that are not compliant with RFC6381, but have been 2411 // Test codec ID's that are not compliant with RFC6381, but have been
2426 // seen in the wild. 2412 // seen in the wild.
2427 TEST_P(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { 2413 TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) {
2428 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; 2414 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported;
2429 2415
2430 #if defined(USE_PROPRIETARY_CODECS) 2416 #if defined(USE_PROPRIETARY_CODECS)
2431 expected = ChunkDemuxer::kOk; 2417 expected = ChunkDemuxer::kOk;
2432 #endif 2418 #endif
2433 const char* codec_ids[] = { 2419 const char* codec_ids[] = {
2434 // GPAC places leading zeros on the audio object type. 2420 // GPAC places leading zeros on the audio object type.
2435 "mp4a.40.02", 2421 "mp4a.40.02",
2436 "mp4a.40.05" 2422 "mp4a.40.05"
2437 }; 2423 };
2438 2424
2439 for (size_t i = 0; i < arraysize(codec_ids); ++i) { 2425 for (size_t i = 0; i < arraysize(codec_ids); ++i) {
2440 std::vector<std::string> codecs; 2426 std::vector<std::string> codecs;
2441 codecs.push_back(codec_ids[i]); 2427 codecs.push_back(codec_ids[i]);
2442 2428
2443 ChunkDemuxer::Status result = 2429 ChunkDemuxer::Status result =
2444 demuxer_->AddId("source_id", "audio/mp4", codecs, 2430 demuxer_->AddId("source_id", "audio/mp4", codecs);
2445 use_legacy_frame_processor_);
2446 2431
2447 EXPECT_EQ(result, expected) 2432 EXPECT_EQ(result, expected)
2448 << "Fail to add codec_id '" << codec_ids[i] << "'"; 2433 << "Fail to add codec_id '" << codec_ids[i] << "'";
2449 2434
2450 if (result == ChunkDemuxer::kOk) 2435 if (result == ChunkDemuxer::kOk)
2451 demuxer_->RemoveId("source_id"); 2436 demuxer_->RemoveId("source_id");
2452 } 2437 }
2453 } 2438 }
2454 2439
2455 TEST_P(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { 2440 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) {
2456 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2441 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2457 2442
2458 EXPECT_CALL(host_, SetDuration(_)) 2443 EXPECT_CALL(host_, SetDuration(_))
2459 .Times(AnyNumber()); 2444 .Times(AnyNumber());
2460 2445
2461 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92); 2446 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92);
2462 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99); 2447 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99);
2463 2448
2464 AppendCluster(kDefaultFirstCluster()); 2449 AppendCluster(kDefaultFirstCluster());
2465 AppendCluster(kDefaultSecondCluster()); 2450 AppendCluster(kDefaultSecondCluster());
(...skipping 16 matching lines...) Expand all
2482 2467
2483 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2468 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2484 EXPECT_EQ(DemuxerStream::kOk, status); 2469 EXPECT_EQ(DemuxerStream::kOk, status);
2485 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); 2470 EXPECT_EQ(kLastAudioTimestamp, last_timestamp);
2486 2471
2487 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 2472 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
2488 EXPECT_EQ(DemuxerStream::kOk, status); 2473 EXPECT_EQ(DemuxerStream::kOk, status);
2489 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); 2474 EXPECT_EQ(kLastVideoTimestamp, last_timestamp);
2490 } 2475 }
2491 2476
2492 TEST_P(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) { 2477 TEST_F(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) {
2493 EXPECT_CALL(*this, DemuxerOpened()); 2478 EXPECT_CALL(*this, DemuxerOpened());
2494 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK), true); 2479 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK), true);
2495 ASSERT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); 2480 ASSERT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
2496 ASSERT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk); 2481 ASSERT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
2497 2482
2498 CheckExpectedRanges("audio", "{ }"); 2483 CheckExpectedRanges("audio", "{ }");
2499 CheckExpectedRanges("video", "{ }"); 2484 CheckExpectedRanges("video", "{ }");
2500 } 2485 }
2501 2486
2502 // Test that Seek() completes successfully when the first cluster 2487 // Test that Seek() completes successfully when the first cluster
2503 // arrives. 2488 // arrives.
2504 TEST_P(ChunkDemuxerTest, EndOfStreamDuringSeek) { 2489 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) {
2505 InSequence s; 2490 InSequence s;
2506 2491
2507 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2492 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2508 2493
2509 AppendCluster(kDefaultFirstCluster()); 2494 AppendCluster(kDefaultFirstCluster());
2510 2495
2511 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 2496 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
2512 demuxer_->StartWaitingForSeek(seek_time); 2497 demuxer_->StartWaitingForSeek(seek_time);
2513 2498
2514 AppendCluster(kDefaultSecondCluster()); 2499 AppendCluster(kDefaultSecondCluster());
2515 EXPECT_CALL(host_, SetDuration( 2500 EXPECT_CALL(host_, SetDuration(
2516 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); 2501 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp)));
2517 MarkEndOfStream(PIPELINE_OK); 2502 MarkEndOfStream(PIPELINE_OK);
2518 2503
2519 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); 2504 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
2520 2505
2521 GenerateExpectedReads(0, 4); 2506 GenerateExpectedReads(0, 4);
2522 GenerateExpectedReads(46, 66, 5); 2507 GenerateExpectedReads(46, 66, 5);
2523 2508
2524 EndOfStreamHelper end_of_stream_helper(demuxer_.get()); 2509 EndOfStreamHelper end_of_stream_helper(demuxer_.get());
2525 end_of_stream_helper.RequestReads(); 2510 end_of_stream_helper.RequestReads();
2526 end_of_stream_helper.CheckIfReadDonesWereCalled(true); 2511 end_of_stream_helper.CheckIfReadDonesWereCalled(true);
2527 } 2512 }
2528 2513
2529 TEST_P(ChunkDemuxerTest, ConfigChange_Video) { 2514 TEST_F(ChunkDemuxerTest, ConfigChange_Video) {
2530 InSequence s; 2515 InSequence s;
2531 2516
2532 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2517 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2533 2518
2534 DemuxerStream::Status status; 2519 DemuxerStream::Status status;
2535 base::TimeDelta last_timestamp; 2520 base::TimeDelta last_timestamp;
2536 2521
2537 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 2522 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
2538 2523
2539 // Fetch initial video config and verify it matches what we expect. 2524 // Fetch initial video config and verify it matches what we expect.
(...skipping 26 matching lines...) Expand all
2566 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); 2551 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
2567 2552
2568 ExpectRead(DemuxerStream::VIDEO, 801); 2553 ExpectRead(DemuxerStream::VIDEO, 801);
2569 2554
2570 // Read until the end of the stream just to make sure there aren't any other 2555 // Read until the end of the stream just to make sure there aren't any other
2571 // config changes. 2556 // config changes.
2572 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 2557 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
2573 ASSERT_EQ(status, DemuxerStream::kOk); 2558 ASSERT_EQ(status, DemuxerStream::kOk);
2574 } 2559 }
2575 2560
2576 TEST_P(ChunkDemuxerTest, ConfigChange_Audio) { 2561 TEST_F(ChunkDemuxerTest, ConfigChange_Audio) {
2577 InSequence s; 2562 InSequence s;
2578 2563
2579 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2564 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2580 2565
2581 DemuxerStream::Status status; 2566 DemuxerStream::Status status;
2582 base::TimeDelta last_timestamp; 2567 base::TimeDelta last_timestamp;
2583 2568
2584 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); 2569 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
2585 2570
2586 // Fetch initial audio config and verify it matches what we expect. 2571 // Fetch initial audio config and verify it matches what we expect.
(...skipping 23 matching lines...) Expand all
2610 EXPECT_EQ(last_timestamp.InMilliseconds(), 782); 2595 EXPECT_EQ(last_timestamp.InMilliseconds(), 782);
2611 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config())); 2596 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config()));
2612 2597
2613 // Read until the end of the stream just to make sure there aren't any other 2598 // Read until the end of the stream just to make sure there aren't any other
2614 // config changes. 2599 // config changes.
2615 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2600 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2616 ASSERT_EQ(status, DemuxerStream::kOk); 2601 ASSERT_EQ(status, DemuxerStream::kOk);
2617 EXPECT_EQ(last_timestamp.InMilliseconds(), 2744); 2602 EXPECT_EQ(last_timestamp.InMilliseconds(), 2744);
2618 } 2603 }
2619 2604
2620 TEST_P(ChunkDemuxerTest, ConfigChange_Seek) { 2605 TEST_F(ChunkDemuxerTest, ConfigChange_Seek) {
2621 InSequence s; 2606 InSequence s;
2622 2607
2623 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2608 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2624 2609
2625 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 2610 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
2626 2611
2627 // Fetch initial video config and verify it matches what we expect. 2612 // Fetch initial video config and verify it matches what we expect.
2628 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); 2613 const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
2629 ASSERT_TRUE(video_config_1.IsValidConfig()); 2614 ASSERT_TRUE(video_config_1.IsValidConfig());
2630 EXPECT_EQ(video_config_1.natural_size().width(), 320); 2615 EXPECT_EQ(video_config_1.natural_size().width(), 320);
(...skipping 26 matching lines...) Expand all
2657 // seek to a new location that has the same configuration as 2642 // seek to a new location that has the same configuration as
2658 // the start of the file without a Read() in the middle. 2643 // the start of the file without a Read() in the middle.
2659 Seek(base::TimeDelta::FromMilliseconds(527)); 2644 Seek(base::TimeDelta::FromMilliseconds(527));
2660 Seek(base::TimeDelta::FromMilliseconds(801)); 2645 Seek(base::TimeDelta::FromMilliseconds(801));
2661 2646
2662 // Verify that no config change is signalled. 2647 // Verify that no config change is signalled.
2663 ExpectRead(DemuxerStream::VIDEO, 801); 2648 ExpectRead(DemuxerStream::VIDEO, 801);
2664 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); 2649 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
2665 } 2650 }
2666 2651
2667 TEST_P(ChunkDemuxerTest, TimestampPositiveOffset) { 2652 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) {
2668 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2653 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2669 2654
2670 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30))); 2655 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30)));
2671 AppendCluster(GenerateCluster(0, 2)); 2656 AppendCluster(GenerateCluster(0, 2));
2672 2657
2673 Seek(base::TimeDelta::FromMilliseconds(30000)); 2658 Seek(base::TimeDelta::FromMilliseconds(30000));
2674 2659
2675 GenerateExpectedReads(30000, 2); 2660 GenerateExpectedReads(30000, 2);
2676 } 2661 }
2677 2662
2678 TEST_P(ChunkDemuxerTest, TimestampNegativeOffset) { 2663 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) {
2679 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2664 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2680 2665
2681 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1))); 2666 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1)));
2682 AppendCluster(GenerateCluster(1000, 2)); 2667 AppendCluster(GenerateCluster(1000, 2));
2683 2668
2684 GenerateExpectedReads(0, 2); 2669 GenerateExpectedReads(0, 2);
2685 } 2670 }
2686 2671
2687 TEST_P(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { 2672 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
2688 std::string audio_id = "audio1"; 2673 std::string audio_id = "audio1";
2689 std::string video_id = "video1"; 2674 std::string video_id = "video1";
2690 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2675 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2691 2676
2692 ASSERT_TRUE(SetTimestampOffset( 2677 ASSERT_TRUE(SetTimestampOffset(
2693 audio_id, base::TimeDelta::FromMilliseconds(-2500))); 2678 audio_id, base::TimeDelta::FromMilliseconds(-2500)));
2694 ASSERT_TRUE(SetTimestampOffset( 2679 ASSERT_TRUE(SetTimestampOffset(
2695 video_id, base::TimeDelta::FromMilliseconds(-2500))); 2680 video_id, base::TimeDelta::FromMilliseconds(-2500)));
2696 AppendCluster(audio_id, GenerateSingleStreamCluster(2500, 2681 AppendCluster(audio_id, GenerateSingleStreamCluster(2500,
2697 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 2682 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration));
2698 AppendCluster(video_id, GenerateSingleStreamCluster(2500, 2683 AppendCluster(video_id, GenerateSingleStreamCluster(2500,
2699 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 2684 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration));
2700 GenerateAudioStreamExpectedReads(0, 4); 2685 GenerateAudioStreamExpectedReads(0, 4);
2701 GenerateVideoStreamExpectedReads(0, 4); 2686 GenerateVideoStreamExpectedReads(0, 4);
2702 2687
2703 Seek(base::TimeDelta::FromMilliseconds(27300)); 2688 Seek(base::TimeDelta::FromMilliseconds(27300));
2704 2689
2705 ASSERT_TRUE(SetTimestampOffset( 2690 ASSERT_TRUE(SetTimestampOffset(
2706 audio_id, base::TimeDelta::FromMilliseconds(27300))); 2691 audio_id, base::TimeDelta::FromMilliseconds(27300)));
2707 ASSERT_TRUE(SetTimestampOffset( 2692 ASSERT_TRUE(SetTimestampOffset(
2708 video_id, base::TimeDelta::FromMilliseconds(27300))); 2693 video_id, base::TimeDelta::FromMilliseconds(27300)));
2709 AppendCluster(audio_id, GenerateSingleStreamCluster( 2694 AppendCluster(audio_id, GenerateSingleStreamCluster(
2710 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 2695 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration));
2711 AppendCluster(video_id, GenerateSingleStreamCluster( 2696 AppendCluster(video_id, GenerateSingleStreamCluster(
2712 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 2697 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration));
2713 GenerateVideoStreamExpectedReads(27300, 4); 2698 GenerateVideoStreamExpectedReads(27300, 4);
2714 GenerateAudioStreamExpectedReads(27300, 4); 2699 GenerateAudioStreamExpectedReads(27300, 4);
2715 } 2700 }
2716 2701
2717 TEST_P(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { 2702 TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) {
2718 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2703 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2719 2704
2720 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); 2705 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2);
2721 // Append only part of the cluster data. 2706 // Append only part of the cluster data.
2722 AppendData(cluster->data(), cluster->size() - 13); 2707 AppendData(cluster->data(), cluster->size() - 13);
2723 2708
2724 // Confirm we're in the middle of parsing a media segment. 2709 // Confirm we're in the middle of parsing a media segment.
2725 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); 2710 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
2726 2711
2727 demuxer_->Abort(kSourceId, 2712 demuxer_->Abort(kSourceId,
2728 append_window_start_for_next_append_, 2713 append_window_start_for_next_append_,
2729 append_window_end_for_next_append_, 2714 append_window_end_for_next_append_,
2730 &timestamp_offset_map_[kSourceId]); 2715 &timestamp_offset_map_[kSourceId]);
2731 2716
2732 // After Abort(), parsing should no longer be in the middle of a media 2717 // After Abort(), parsing should no longer be in the middle of a media
2733 // segment. 2718 // segment.
2734 ASSERT_FALSE(demuxer_->IsParsingMediaSegment(kSourceId)); 2719 ASSERT_FALSE(demuxer_->IsParsingMediaSegment(kSourceId));
2735 } 2720 }
2736 2721
2737 #if defined(USE_PROPRIETARY_CODECS) 2722 #if defined(USE_PROPRIETARY_CODECS)
2738 #if defined(ENABLE_MPEG2TS_STREAM_PARSER) 2723 #if defined(ENABLE_MPEG2TS_STREAM_PARSER)
2739 TEST_P(ChunkDemuxerTest, EmitBuffersDuringAbort) { 2724 TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) {
2740 EXPECT_CALL(*this, DemuxerOpened()); 2725 EXPECT_CALL(*this, DemuxerOpened());
2741 demuxer_->Initialize( 2726 demuxer_->Initialize(
2742 &host_, CreateInitDoneCB(kInfiniteDuration(), PIPELINE_OK), true); 2727 &host_, CreateInitDoneCB(kInfiniteDuration(), PIPELINE_OK), true);
2743 EXPECT_EQ(ChunkDemuxer::kOk, AddIdForMp2tSource(kSourceId)); 2728 EXPECT_EQ(ChunkDemuxer::kOk, AddIdForMp2tSource(kSourceId));
2744 2729
2745 // For info: 2730 // For info:
2746 // DTS/PTS derived using dvbsnoop -s ts -if bear-1280x720.ts -tssubdecode 2731 // DTS/PTS derived using dvbsnoop -s ts -if bear-1280x720.ts -tssubdecode
2747 // Video: first PES: 2732 // Video: first PES:
2748 // PTS: 126912 (0x0001efc0) [= 90 kHz-Timestamp: 0:00:01.4101] 2733 // PTS: 126912 (0x0001efc0) [= 90 kHz-Timestamp: 0:00:01.4101]
2749 // DTS: 123909 (0x0001e405) [= 90 kHz-Timestamp: 0:00:01.3767] 2734 // DTS: 123909 (0x0001e405) [= 90 kHz-Timestamp: 0:00:01.3767]
(...skipping 24 matching lines...) Expand all
2774 demuxer_->GetBufferedRanges(kSourceId); 2759 demuxer_->GetBufferedRanges(kSourceId);
2775 2760
2776 ASSERT_EQ(range_before_abort.size(), 1u); 2761 ASSERT_EQ(range_before_abort.size(), 1u);
2777 ASSERT_EQ(range_after_abort.size(), 1u); 2762 ASSERT_EQ(range_after_abort.size(), 1u);
2778 EXPECT_EQ(range_after_abort.start(0), range_before_abort.start(0)); 2763 EXPECT_EQ(range_after_abort.start(0), range_before_abort.start(0));
2779 EXPECT_GT(range_after_abort.end(0), range_before_abort.end(0)); 2764 EXPECT_GT(range_after_abort.end(0), range_before_abort.end(0));
2780 } 2765 }
2781 #endif 2766 #endif
2782 #endif 2767 #endif
2783 2768
2784 TEST_P(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) { 2769 TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) {
2785 // TODO(wolenetz): Also test 'unknown' sized clusters. 2770 // TODO(wolenetz): Also test 'unknown' sized clusters.
2786 // See http://crbug.com/335676. 2771 // See http://crbug.com/335676.
2787 const uint8 kBuffer[] = { 2772 const uint8 kBuffer[] = {
2788 0x1F, 0x43, 0xB6, 0x75, 0x83, // CLUSTER (size = 3) 2773 0x1F, 0x43, 0xB6, 0x75, 0x83, // CLUSTER (size = 3)
2789 0xE7, 0x81, 0x01, // Cluster TIMECODE (value = 1) 2774 0xE7, 0x81, 0x01, // Cluster TIMECODE (value = 1)
2790 }; 2775 };
2791 2776
2792 // This array indicates expected return value of IsParsingMediaSegment() 2777 // This array indicates expected return value of IsParsingMediaSegment()
2793 // following each incrementally appended byte in |kBuffer|. 2778 // following each incrementally appended byte in |kBuffer|.
2794 const bool kExpectedReturnValues[] = { 2779 const bool kExpectedReturnValues[] = {
2795 false, false, false, false, true, 2780 false, false, false, false, true,
2796 true, true, false, 2781 true, true, false,
2797 }; 2782 };
2798 2783
2799 COMPILE_ASSERT(arraysize(kBuffer) == arraysize(kExpectedReturnValues), 2784 COMPILE_ASSERT(arraysize(kBuffer) == arraysize(kExpectedReturnValues),
2800 test_arrays_out_of_sync); 2785 test_arrays_out_of_sync);
2801 COMPILE_ASSERT(arraysize(kBuffer) == sizeof(kBuffer), not_one_byte_per_index); 2786 COMPILE_ASSERT(arraysize(kBuffer) == sizeof(kBuffer), not_one_byte_per_index);
2802 2787
2803 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2788 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2804 2789
2805 for (size_t i = 0; i < sizeof(kBuffer); i++) { 2790 for (size_t i = 0; i < sizeof(kBuffer); i++) {
2806 DVLOG(3) << "Appending and testing index " << i; 2791 DVLOG(3) << "Appending and testing index " << i;
2807 AppendData(kBuffer + i, 1); 2792 AppendData(kBuffer + i, 1);
2808 bool expected_return_value = kExpectedReturnValues[i]; 2793 bool expected_return_value = kExpectedReturnValues[i];
2809 EXPECT_EQ(expected_return_value, 2794 EXPECT_EQ(expected_return_value,
2810 demuxer_->IsParsingMediaSegment(kSourceId)); 2795 demuxer_->IsParsingMediaSegment(kSourceId));
2811 } 2796 }
2812 } 2797 }
2813 2798
2814 TEST_P(ChunkDemuxerTest, DurationChange) { 2799 TEST_F(ChunkDemuxerTest, DurationChange) {
2815 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2800 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2816 const int kStreamDuration = kDefaultDuration().InMilliseconds(); 2801 const int kStreamDuration = kDefaultDuration().InMilliseconds();
2817 2802
2818 // Add data leading up to the currently set duration. 2803 // Add data leading up to the currently set duration.
2819 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration, 2804 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration,
2820 kStreamDuration - kVideoBlockDuration, 2805 kStreamDuration - kVideoBlockDuration,
2821 2)); 2806 2));
2822 2807
2823 CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); 2808 CheckExpectedRanges(kSourceId, "{ [201191,201224) }");
2824 2809
2825 // Add data beginning at the currently set duration and expect a new duration 2810 // Add data beginning at the currently set duration and expect a new duration
2826 // to be signaled. Note that the last video block will have a higher end 2811 // to be signaled. Note that the last video block will have a higher end
2827 // timestamp than the last audio block. 2812 // timestamp than the last audio block.
2828 if (use_legacy_frame_processor_) {
2829 const int kNewStreamDurationAudio = kStreamDuration + kAudioBlockDuration;
2830 EXPECT_CALL(host_, SetDuration(
2831 base::TimeDelta::FromMilliseconds(kNewStreamDurationAudio)));
2832 }
2833 const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration; 2813 const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration;
2834 EXPECT_CALL(host_, SetDuration( 2814 EXPECT_CALL(host_, SetDuration(
2835 base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo))); 2815 base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo)));
2836 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)); 2816 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2));
2837 2817
2838 CheckExpectedRanges(kSourceId, "{ [201191,201247) }"); 2818 CheckExpectedRanges(kSourceId, "{ [201191,201247) }");
2839 2819
2840 // Add more data to the end of each media type. Note that the last audio block 2820 // Add more data to the end of each media type. Note that the last audio block
2841 // will have a higher end timestamp than the last video block. 2821 // will have a higher end timestamp than the last video block.
2842 const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3; 2822 const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3;
2843 EXPECT_CALL(host_, SetDuration( 2823 EXPECT_CALL(host_, SetDuration(
2844 base::TimeDelta::FromMilliseconds(kFinalStreamDuration))); 2824 base::TimeDelta::FromMilliseconds(kFinalStreamDuration)));
2845 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration, 2825 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration,
2846 kStreamDuration + kVideoBlockDuration, 2826 kStreamDuration + kVideoBlockDuration,
2847 3)); 2827 3));
2848 2828
2849 // See that the range has increased appropriately (but not to the full 2829 // See that the range has increased appropriately (but not to the full
2850 // duration of 201293, since there is not enough video appended for that). 2830 // duration of 201293, since there is not enough video appended for that).
2851 CheckExpectedRanges(kSourceId, "{ [201191,201290) }"); 2831 CheckExpectedRanges(kSourceId, "{ [201191,201290) }");
2852 } 2832 }
2853 2833
2854 TEST_P(ChunkDemuxerTest, DurationChangeTimestampOffset) { 2834 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
2855 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2835 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2856
2857 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration())); 2836 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration()));
2858
2859 if (use_legacy_frame_processor_) {
2860 EXPECT_CALL(host_, SetDuration(
2861 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
2862 kAudioBlockDuration * 2)));
2863 }
2864 EXPECT_CALL(host_, SetDuration( 2837 EXPECT_CALL(host_, SetDuration(
2865 kDefaultDuration() + base::TimeDelta::FromMilliseconds( 2838 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
2866 kVideoBlockDuration * 2))); 2839 kVideoBlockDuration * 2)));
2867 AppendCluster(GenerateCluster(0, 4)); 2840 AppendCluster(GenerateCluster(0, 4));
2868 } 2841 }
2869 2842
2870 TEST_P(ChunkDemuxerTest, EndOfStreamTruncateDuration) { 2843 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) {
2871 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2844 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2872 2845
2873 AppendCluster(kDefaultFirstCluster()); 2846 AppendCluster(kDefaultFirstCluster());
2874 2847
2875 EXPECT_CALL(host_, SetDuration( 2848 EXPECT_CALL(host_, SetDuration(
2876 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 2849 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
2877 MarkEndOfStream(PIPELINE_OK); 2850 MarkEndOfStream(PIPELINE_OK);
2878 } 2851 }
2879 2852
2880 2853
2881 TEST_P(ChunkDemuxerTest, ZeroLengthAppend) { 2854 TEST_F(ChunkDemuxerTest, ZeroLengthAppend) {
2882 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2855 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2883 AppendData(NULL, 0); 2856 AppendData(NULL, 0);
2884 } 2857 }
2885 2858
2886 TEST_P(ChunkDemuxerTest, AppendAfterEndOfStream) { 2859 TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) {
2887 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2860 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2888 2861
2889 EXPECT_CALL(host_, SetDuration(_)) 2862 EXPECT_CALL(host_, SetDuration(_))
2890 .Times(AnyNumber()); 2863 .Times(AnyNumber());
2891 2864
2892 AppendCluster(kDefaultFirstCluster()); 2865 AppendCluster(kDefaultFirstCluster());
2893 MarkEndOfStream(PIPELINE_OK); 2866 MarkEndOfStream(PIPELINE_OK);
2894 2867
2895 demuxer_->UnmarkEndOfStream(); 2868 demuxer_->UnmarkEndOfStream();
2896 2869
2897 AppendCluster(kDefaultSecondCluster()); 2870 AppendCluster(kDefaultSecondCluster());
2898 MarkEndOfStream(PIPELINE_OK); 2871 MarkEndOfStream(PIPELINE_OK);
2899 } 2872 }
2900 2873
2901 // Test receiving a Shutdown() call before we get an Initialize() 2874 // Test receiving a Shutdown() call before we get an Initialize()
2902 // call. This can happen if video element gets destroyed before 2875 // call. This can happen if video element gets destroyed before
2903 // the pipeline has a chance to initialize the demuxer. 2876 // the pipeline has a chance to initialize the demuxer.
2904 TEST_P(ChunkDemuxerTest, Shutdown_BeforeInitialize) { 2877 TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) {
2905 demuxer_->Shutdown(); 2878 demuxer_->Shutdown();
2906 demuxer_->Initialize( 2879 demuxer_->Initialize(
2907 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 2880 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
2908 message_loop_.RunUntilIdle(); 2881 message_loop_.RunUntilIdle();
2909 } 2882 }
2910 2883
2911 // Verifies that signaling end of stream while stalled at a gap 2884 // Verifies that signaling end of stream while stalled at a gap
2912 // boundary does not trigger end of stream buffers to be returned. 2885 // boundary does not trigger end of stream buffers to be returned.
2913 TEST_P(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { 2886 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
2914 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2887 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2915 2888
2916 AppendCluster(0, 10); 2889 AppendCluster(0, 10);
2917 AppendCluster(300, 10); 2890 AppendCluster(300, 10);
2918 CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }"); 2891 CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }");
2919 2892
2920 GenerateExpectedReads(0, 10); 2893 GenerateExpectedReads(0, 10);
2921 2894
2922 bool audio_read_done = false; 2895 bool audio_read_done = false;
2923 bool video_read_done = false; 2896 bool video_read_done = false;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2966 EXPECT_FALSE(audio_read_done); 2939 EXPECT_FALSE(audio_read_done);
2967 EXPECT_FALSE(video_read_done); 2940 EXPECT_FALSE(video_read_done);
2968 2941
2969 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(437))); 2942 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(437)));
2970 MarkEndOfStream(PIPELINE_OK); 2943 MarkEndOfStream(PIPELINE_OK);
2971 2944
2972 EXPECT_TRUE(audio_read_done); 2945 EXPECT_TRUE(audio_read_done);
2973 EXPECT_TRUE(video_read_done); 2946 EXPECT_TRUE(video_read_done);
2974 } 2947 }
2975 2948
2976 TEST_P(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) { 2949 TEST_F(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) {
2977 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2950 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2978 2951
2979 // Cancel preroll. 2952 // Cancel preroll.
2980 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200); 2953 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200);
2981 demuxer_->CancelPendingSeek(seek_time); 2954 demuxer_->CancelPendingSeek(seek_time);
2982 2955
2983 // Initiate the seek to the new location. 2956 // Initiate the seek to the new location.
2984 Seek(seek_time); 2957 Seek(seek_time);
2985 2958
2986 // Append data to satisfy the seek. 2959 // Append data to satisfy the seek.
2987 AppendCluster(seek_time.InMilliseconds(), 10); 2960 AppendCluster(seek_time.InMilliseconds(), 10);
2988 } 2961 }
2989 2962
2990 TEST_P(ChunkDemuxerTest, GCDuringSeek) { 2963 TEST_F(ChunkDemuxerTest, GCDuringSeek) {
2991 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 2964 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
2992 2965
2993 demuxer_->SetMemoryLimitsForTesting(5 * kBlockSize); 2966 demuxer_->SetMemoryLimitsForTesting(5 * kBlockSize);
2994 2967
2995 base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(1000); 2968 base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(1000);
2996 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(500); 2969 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(500);
2997 2970
2998 // Initiate a seek to |seek_time1|. 2971 // Initiate a seek to |seek_time1|.
2999 Seek(seek_time1); 2972 Seek(seek_time1);
3000 2973
(...skipping 22 matching lines...) Expand all
3023 // Append more data and make sure that the blocks for |seek_time2| 2996 // Append more data and make sure that the blocks for |seek_time2|
3024 // don't get removed. 2997 // don't get removed.
3025 // 2998 //
3026 // NOTE: The current GC algorithm tries to preserve the GOP at the 2999 // NOTE: The current GC algorithm tries to preserve the GOP at the
3027 // current position as well as the last appended GOP. This is 3000 // current position as well as the last appended GOP. This is
3028 // why there are 2 ranges in the expectations. 3001 // why there are 2 ranges in the expectations.
3029 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5); 3002 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5);
3030 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }"); 3003 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }");
3031 } 3004 }
3032 3005
3033 TEST_P(ChunkDemuxerTest, AppendWindow_Video) { 3006 TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
3034 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 3007 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
3035 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); 3008 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
3036 3009
3037 // Set the append window to [50,280). 3010 // Set the append window to [50,280).
3038 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50); 3011 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
3039 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 3012 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
3040 3013
3041 // Append a cluster that starts before and ends after the append window. 3014 // Append a cluster that starts before and ends after the append window.
3042 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3015 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
3043 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); 3016 "0K 30 60 90 120K 150 180 210 240K 270 300 330K");
3044 3017
3045 // Verify that GOPs that start outside the window are not included 3018 // Verify that GOPs that start outside the window are not included
3046 // in the buffer. Also verify that buffers that start inside the 3019 // in the buffer. Also verify that buffers that start inside the
3047 // window and extend beyond the end of the window are not included. 3020 // window and extend beyond the end of the window are not included.
3048 CheckExpectedRanges(kSourceId, "{ [120,270) }"); 3021 CheckExpectedRanges(kSourceId, "{ [120,270) }");
3049 CheckExpectedBuffers(stream, "120 150 180 210 240"); 3022 CheckExpectedBuffers(stream, "120 150 180 210 240");
3050 3023
3051 // Extend the append window to [50,650). 3024 // Extend the append window to [50,650).
3052 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); 3025 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
3053 3026
3054 // Append more data and verify that adding buffers start at the next 3027 // Append more data and verify that adding buffers start at the next
3055 // keyframe. 3028 // keyframe.
3056 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3029 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
3057 "360 390 420K 450 480 510 540K 570 600 630K"); 3030 "360 390 420K 450 480 510 540K 570 600 630K");
3058 CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }"); 3031 CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }");
3059 } 3032 }
3060 3033
3061 TEST_P(ChunkDemuxerTest, AppendWindow_Audio) { 3034 TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
3062 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 3035 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
3063 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 3036 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
3064 3037
3065 // Set the append window to [50,280). 3038 // Set the append window to [50,280).
3066 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50); 3039 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
3067 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 3040 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
3068 3041
3069 // Append a cluster that starts before and ends after the append window. 3042 // Append a cluster that starts before and ends after the append window.
3070 AppendSingleStreamCluster( 3043 AppendSingleStreamCluster(
3071 kSourceId, kAudioTrackNum, 3044 kSourceId, kAudioTrackNum,
(...skipping 14 matching lines...) Expand all
3086 // Extend the append window to [50,650). 3059 // Extend the append window to [50,650).
3087 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); 3060 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
3088 3061
3089 // Append more data and verify that a new range is created. 3062 // Append more data and verify that a new range is created.
3090 AppendSingleStreamCluster( 3063 AppendSingleStreamCluster(
3091 kSourceId, kAudioTrackNum, 3064 kSourceId, kAudioTrackNum,
3092 "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K"); 3065 "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K");
3093 CheckExpectedRanges(kSourceId, "{ [50,270) [360,630) }"); 3066 CheckExpectedRanges(kSourceId, "{ [50,270) [360,630) }");
3094 } 3067 }
3095 3068
3096 TEST_P(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) { 3069 TEST_F(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) {
3097 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 3070 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
3098 3071
3099 // Set the append window to [10,20). 3072 // Set the append window to [10,20).
3100 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(10); 3073 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(10);
3101 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(20); 3074 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
3102 3075
3103 // Append a cluster that starts before and ends after the append window. 3076 // Append a cluster that starts before and ends after the append window.
3104 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K"); 3077 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K");
3105 3078
3106 // Verify that everything is dropped in this case. No partial append should 3079 // Verify that everything is dropped in this case. No partial append should
3107 // be generated. 3080 // be generated.
3108 CheckExpectedRanges(kSourceId, "{ }"); 3081 CheckExpectedRanges(kSourceId, "{ }");
3109 } 3082 }
3110 3083
3111 TEST_P(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) { 3084 TEST_F(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) {
3112 EXPECT_CALL(*this, DemuxerOpened()); 3085 EXPECT_CALL(*this, DemuxerOpened());
3113 demuxer_->Initialize( 3086 demuxer_->Initialize(
3114 &host_, 3087 &host_,
3115 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK), 3088 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
3116 true); 3089 true);
3117 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO)); 3090 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO));
3118 3091
3119 // Set the append window to [50,150). 3092 // Set the append window to [50,150).
3120 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50); 3093 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
3121 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150); 3094 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150);
3122 3095
3123 // Read a WebM file into memory and send the data to the demuxer. The chunk 3096 // Read a WebM file into memory and send the data to the demuxer. The chunk
3124 // size has been chosen carefully to ensure the preroll buffer used by the 3097 // size has been chosen carefully to ensure the preroll buffer used by the
3125 // partial append window trim must come from a previous Append() call. 3098 // partial append window trim must come from a previous Append() call.
3126 scoped_refptr<DecoderBuffer> buffer = 3099 scoped_refptr<DecoderBuffer> buffer =
3127 ReadTestDataFile("bear-320x240-audio-only.webm"); 3100 ReadTestDataFile("bear-320x240-audio-only.webm");
3128 AppendDataInPieces(buffer->data(), buffer->data_size(), 128); 3101 AppendDataInPieces(buffer->data(), buffer->data_size(), 128);
3129 3102
3130 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 3103 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
3131 CheckExpectedBuffers(stream, "50P 50 62 86 109 122 125 128"); 3104 CheckExpectedBuffers(stream, "50P 50 62 86 109 122 125 128");
3132 } 3105 }
3133 3106
3134 TEST_P(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { 3107 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
3135 EXPECT_CALL(*this, DemuxerOpened()); 3108 EXPECT_CALL(*this, DemuxerOpened());
3136 demuxer_->Initialize( 3109 demuxer_->Initialize(
3137 &host_, 3110 &host_,
3138 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK), 3111 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
3139 true); 3112 true);
3140 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO)); 3113 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO));
3141 3114
3142 // Set the append window such that the first file is completely before the 3115 // Set the append window such that the first file is completely before the
3143 // append window. 3116 // append window.
3144 // TODO(wolenetz/acolwell): Update this duration once the files are fixed to 3117 // TODO(wolenetz/acolwell): Update this duration once the files are fixed to
(...skipping 19 matching lines...) Expand all
3164 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); 3137 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
3165 AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512); 3138 AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512);
3166 CheckExpectedRanges(kSourceId, "{ [2746,5519) }"); 3139 CheckExpectedRanges(kSourceId, "{ [2746,5519) }");
3167 3140
3168 Seek(duration_1); 3141 Seek(duration_1);
3169 ExpectConfigChanged(DemuxerStream::AUDIO); 3142 ExpectConfigChanged(DemuxerStream::AUDIO);
3170 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config())); 3143 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config()));
3171 CheckExpectedBuffers(stream, "2746 2767 2789 2810"); 3144 CheckExpectedBuffers(stream, "2746 2767 2789 2810");
3172 } 3145 }
3173 3146
3174 TEST_P(ChunkDemuxerTest, AppendWindow_Text) { 3147 TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
3175 DemuxerStream* text_stream = NULL; 3148 DemuxerStream* text_stream = NULL;
3176 EXPECT_CALL(host_, AddTextStream(_, _)) 3149 EXPECT_CALL(host_, AddTextStream(_, _))
3177 .WillOnce(SaveArg<0>(&text_stream)); 3150 .WillOnce(SaveArg<0>(&text_stream));
3178 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT)); 3151 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT));
3179 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 3152 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
3180 3153
3181 // Set the append window to [20,280). 3154 // Set the append window to [20,280).
3182 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); 3155 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
3183 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 3156 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
3184 3157
(...skipping 18 matching lines...) Expand all
3203 "360 390 420K 450 480 510 540K 570 600 630K"); 3176 "360 390 420K 450 480 510 540K 570 600 630K");
3204 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "400K 500K 600K 700K"); 3177 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "400K 500K 600K 700K");
3205 CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }"); 3178 CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }");
3206 3179
3207 // Seek to the new range and verify that the expected buffers are returned. 3180 // Seek to the new range and verify that the expected buffers are returned.
3208 Seek(base::TimeDelta::FromMilliseconds(420)); 3181 Seek(base::TimeDelta::FromMilliseconds(420));
3209 CheckExpectedBuffers(video_stream, "420 450 480 510 540 570 600"); 3182 CheckExpectedBuffers(video_stream, "420 450 480 510 540 570 600");
3210 CheckExpectedBuffers(text_stream, "400 500"); 3183 CheckExpectedBuffers(text_stream, "400 500");
3211 } 3184 }
3212 3185
3213 TEST_P(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { 3186 TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) {
3214 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3187 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3215 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 3188 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
3216 AppendGarbage(); 3189 AppendGarbage();
3217 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50); 3190 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50);
3218 demuxer_->StartWaitingForSeek(seek_time); 3191 demuxer_->StartWaitingForSeek(seek_time);
3219 } 3192 }
3220 3193
3221 TEST_P(ChunkDemuxerTest, Remove_AudioVideoText) { 3194 TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) {
3222 DemuxerStream* text_stream = NULL; 3195 DemuxerStream* text_stream = NULL;
3223 EXPECT_CALL(host_, AddTextStream(_, _)) 3196 EXPECT_CALL(host_, AddTextStream(_, _))
3224 .WillOnce(SaveArg<0>(&text_stream)); 3197 .WillOnce(SaveArg<0>(&text_stream));
3225 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 3198 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
3226 3199
3227 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 3200 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
3228 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 3201 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
3229 3202
3230 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 3203 AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
3231 "0K 20K 40K 60K 80K 100K 120K 140K"); 3204 "0K 20K 40K 60K 80K 100K 120K 140K");
(...skipping 19 matching lines...) Expand all
3251 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3224 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
3252 "1K 31 61 91 121K 151 181"); 3225 "1K 31 61 91 121K 151 181");
3253 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "1K 101K 201K"); 3226 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "1K 101K 201K");
3254 3227
3255 Seek(base::TimeDelta()); 3228 Seek(base::TimeDelta());
3256 CheckExpectedBuffers(audio_stream, "1 21 41 61 81 101 121 141"); 3229 CheckExpectedBuffers(audio_stream, "1 21 41 61 81 101 121 141");
3257 CheckExpectedBuffers(video_stream, "1 31 61 91 121 151 181"); 3230 CheckExpectedBuffers(video_stream, "1 31 61 91 121 151 181");
3258 CheckExpectedBuffers(text_stream, "1 101 201"); 3231 CheckExpectedBuffers(text_stream, "1 101 201");
3259 } 3232 }
3260 3233
3261 TEST_P(ChunkDemuxerTest, Remove_StartAtDuration) { 3234 TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) {
3262 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 3235 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
3263 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 3236 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
3264 3237
3265 // Set the duration to something small so that the append that 3238 // Set the duration to something small so that the append that
3266 // follows updates the duration to reflect the end of the appended data. 3239 // follows updates the duration to reflect the end of the appended data.
3267 EXPECT_CALL(host_, SetDuration( 3240 EXPECT_CALL(host_, SetDuration(
3268 base::TimeDelta::FromMilliseconds(1))); 3241 base::TimeDelta::FromMilliseconds(1)));
3269 demuxer_->SetDuration(0.001); 3242 demuxer_->SetDuration(0.001);
3270 3243
3271 EXPECT_CALL(host_, SetDuration( 3244 EXPECT_CALL(host_, SetDuration(
3272 base::TimeDelta::FromMilliseconds(160))); 3245 base::TimeDelta::FromMilliseconds(160)));
3273 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 3246 AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
3274 "0K 20K 40K 60K 80K 100K 120K 140K"); 3247 "0K 20K 40K 60K 80K 100K 120K 140K");
3275 3248
3276 CheckExpectedRanges(kSourceId, "{ [0,160) }"); 3249 CheckExpectedRanges(kSourceId, "{ [0,160) }");
3277 CheckExpectedBuffers(audio_stream, "0 20 40 60 80 100 120 140"); 3250 CheckExpectedBuffers(audio_stream, "0 20 40 60 80 100 120 140");
3278 3251
3279 demuxer_->Remove(kSourceId, 3252 demuxer_->Remove(kSourceId,
3280 base::TimeDelta::FromSecondsD(demuxer_->GetDuration()), 3253 base::TimeDelta::FromSecondsD(demuxer_->GetDuration()),
3281 kInfiniteDuration()); 3254 kInfiniteDuration());
3282 3255
3283 Seek(base::TimeDelta()); 3256 Seek(base::TimeDelta());
3284 CheckExpectedRanges(kSourceId, "{ [0,160) }"); 3257 CheckExpectedRanges(kSourceId, "{ [0,160) }");
3285 CheckExpectedBuffers(audio_stream, "0 20 40 60 80 100 120 140"); 3258 CheckExpectedBuffers(audio_stream, "0 20 40 60 80 100 120 140");
3286 } 3259 }
3287 3260
3288 // Verifies that a Seek() will complete without text cues for 3261 // Verifies that a Seek() will complete without text cues for
3289 // the seek point and will return cues after the seek position 3262 // the seek point and will return cues after the seek position
3290 // when they are eventually appended. 3263 // when they are eventually appended.
3291 TEST_P(ChunkDemuxerTest, SeekCompletesWithoutTextCues) { 3264 TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) {
3292 DemuxerStream* text_stream = NULL; 3265 DemuxerStream* text_stream = NULL;
3293 EXPECT_CALL(host_, AddTextStream(_, _)) 3266 EXPECT_CALL(host_, AddTextStream(_, _))
3294 .WillOnce(SaveArg<0>(&text_stream)); 3267 .WillOnce(SaveArg<0>(&text_stream));
3295 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 3268 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
3296 3269
3297 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 3270 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
3298 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 3271 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
3299 3272
3300 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(120); 3273 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(120);
3301 bool seek_cb_was_called = false; 3274 bool seek_cb_was_called = false;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3336 3309
3337 // NOTE: we start at 175 here because the buffer at 125 was returned 3310 // NOTE: we start at 175 here because the buffer at 125 was returned
3338 // to the pending read initiated above. 3311 // to the pending read initiated above.
3339 CheckExpectedBuffers(text_stream, "175 225"); 3312 CheckExpectedBuffers(text_stream, "175 225");
3340 3313
3341 // Verify that audio & video streams continue to return expected values. 3314 // Verify that audio & video streams continue to return expected values.
3342 CheckExpectedBuffers(audio_stream, "160 180"); 3315 CheckExpectedBuffers(audio_stream, "160 180");
3343 CheckExpectedBuffers(video_stream, "180 210"); 3316 CheckExpectedBuffers(video_stream, "180 210");
3344 } 3317 }
3345 3318
3346 // Generate two sets of tests: one using FrameProcessor, and one using
3347 // LegacyFrameProcessor.
3348 INSTANTIATE_TEST_CASE_P(NewFrameProcessor, ChunkDemuxerTest, Values(false));
3349 INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, ChunkDemuxerTest, Values(true));
3350
3351 } // namespace media 3319 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698