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

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

Issue 11088047: Support encrypted audio stream in demuxer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase, resolved comments and changed more, sorry! Created 8 years, 2 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/message_loop.h" 6 #include "base/message_loop.h"
7 #include "media/base/audio_decoder_config.h" 7 #include "media/base/audio_decoder_config.h"
8 #include "media/base/decoder_buffer.h" 8 #include "media/base/decoder_buffer.h"
9 #include "media/base/mock_callback.h" 9 #include "media/base/mock_callback.h"
10 #include "media/base/mock_demuxer_host.h" 10 #include "media/base/mock_demuxer_host.h"
11 #include "media/base/test_data_util.h" 11 #include "media/base/test_data_util.h"
12 #include "media/filters/chunk_demuxer.h" 12 #include "media/filters/chunk_demuxer.h"
13 #include "media/webm/cluster_builder.h" 13 #include "media/webm/cluster_builder.h"
14 #include "media/webm/webm_constants.h" 14 #include "media/webm/webm_constants.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 16
17 using ::testing::AnyNumber; 17 using ::testing::AnyNumber;
18 using ::testing::Exactly;
18 using ::testing::InSequence; 19 using ::testing::InSequence;
19 using ::testing::NotNull; 20 using ::testing::NotNull;
20 using ::testing::Return; 21 using ::testing::Return;
21 using ::testing::SaveArg; 22 using ::testing::SaveArg;
22 using ::testing::SetArgumentPointee; 23 using ::testing::SetArgumentPointee;
23 using ::testing::_; 24 using ::testing::_;
24 25
25 namespace media { 26 namespace media {
26 27
27 static const uint8 kTracksHeader[] = { 28 static const uint8 kTracksHeader[] = {
28 0x16, 0x54, 0xAE, 0x6B, // Tracks ID 29 0x16, 0x54, 0xAE, 0x6B, // Tracks ID
29 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0) 30 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tracks(size = 0)
30 }; 31 };
31 32
32 static const int kTracksHeaderSize = sizeof(kTracksHeader); 33 static const int kTracksHeaderSize = sizeof(kTracksHeader);
33 static const int kTracksSizeOffset = 4; 34 static const int kTracksSizeOffset = 4;
34 35
36 // The size of TrackEntry element in test file "webm_vorbis_track_entry" starts
37 // at index 1 and spans 8 bytes.
38 static const int kAudioTrackSizeOffset = 1;
39 static const int kAudioTrackSizeWidth = 8;
40 static const int kAudioTrackEntryHeaderSize = kAudioTrackSizeOffset +
41 kAudioTrackSizeWidth;
42
35 // The size of TrackEntry element in test file "webm_vp8_track_entry" starts at 43 // The size of TrackEntry element in test file "webm_vp8_track_entry" starts at
36 // index 1 and spans 8 bytes. 44 // index 1 and spans 8 bytes.
37 static const int kVideoTrackSizeOffset = 1; 45 static const int kVideoTrackSizeOffset = 1;
38 static const int kVideoTrackSizeWidth = 8; 46 static const int kVideoTrackSizeWidth = 8;
39 static const int kVideoTrackEntryHeaderSize = kVideoTrackSizeOffset + 47 static const int kVideoTrackEntryHeaderSize = kVideoTrackSizeOffset +
40 kVideoTrackSizeWidth; 48 kVideoTrackSizeWidth;
41 49
42 static const int kVideoTrackNum = 1; 50 static const int kVideoTrackNum = 1;
43 static const int kAudioTrackNum = 2; 51 static const int kAudioTrackNum = 2;
44 52
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 ChunkDemuxer::NeedKeyCB need_key_cb = 163 ChunkDemuxer::NeedKeyCB need_key_cb =
156 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); 164 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this));
157 demuxer_ = new ChunkDemuxer(open_cb, need_key_cb); 165 demuxer_ = new ChunkDemuxer(open_cb, need_key_cb);
158 } 166 }
159 167
160 virtual ~ChunkDemuxerTest() { 168 virtual ~ChunkDemuxerTest() {
161 ShutdownDemuxer(); 169 ShutdownDemuxer();
162 } 170 }
163 171
164 void CreateInitSegment(bool has_audio, bool has_video, 172 void CreateInitSegment(bool has_audio, bool has_video,
165 bool video_content_encoded, 173 bool is_audio_encrypted, bool is_video_encrypted,
166 scoped_array<uint8>* buffer, 174 scoped_array<uint8>* buffer,
167 int* size) { 175 int* size) {
168 scoped_refptr<DecoderBuffer> ebml_header; 176 scoped_refptr<DecoderBuffer> ebml_header;
169 scoped_refptr<DecoderBuffer> info; 177 scoped_refptr<DecoderBuffer> info;
170 scoped_refptr<DecoderBuffer> audio_track_entry; 178 scoped_refptr<DecoderBuffer> audio_track_entry;
171 scoped_refptr<DecoderBuffer> video_track_entry; 179 scoped_refptr<DecoderBuffer> video_track_entry;
180 scoped_refptr<DecoderBuffer> audio_content_encodings;
172 scoped_refptr<DecoderBuffer> video_content_encodings; 181 scoped_refptr<DecoderBuffer> video_content_encodings;
173 182
174 ebml_header = ReadTestDataFile("webm_ebml_element"); 183 ebml_header = ReadTestDataFile("webm_ebml_element");
175 184
176 info = ReadTestDataFile("webm_info_element"); 185 info = ReadTestDataFile("webm_info_element");
177 186
178 int tracks_element_size = 0; 187 int tracks_element_size = 0;
179 188
180 if (has_audio) { 189 if (has_audio) {
181 audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry"); 190 audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry");
182 tracks_element_size += audio_track_entry->GetDataSize(); 191 tracks_element_size += audio_track_entry->GetDataSize();
192 if (is_audio_encrypted) {
193 audio_content_encodings = ReadTestDataFile("webm_content_encodings");
194 tracks_element_size += audio_content_encodings->GetDataSize();
195 }
183 } 196 }
184 197
185 if (has_video) { 198 if (has_video) {
186 video_track_entry = ReadTestDataFile("webm_vp8_track_entry"); 199 video_track_entry = ReadTestDataFile("webm_vp8_track_entry");
187 tracks_element_size += video_track_entry->GetDataSize(); 200 tracks_element_size += video_track_entry->GetDataSize();
188 if (video_content_encoded) { 201 if (is_video_encrypted) {
189 video_content_encodings = ReadTestDataFile("webm_content_encodings"); 202 video_content_encodings = ReadTestDataFile("webm_content_encodings");
190 tracks_element_size += video_content_encodings->GetDataSize(); 203 tracks_element_size += video_content_encodings->GetDataSize();
191 } 204 }
192 } 205 }
193 206
194 *size = ebml_header->GetDataSize() + info->GetDataSize() + 207 *size = ebml_header->GetDataSize() + info->GetDataSize() +
195 kTracksHeaderSize + tracks_element_size; 208 kTracksHeaderSize + tracks_element_size;
196 209
197 buffer->reset(new uint8[*size]); 210 buffer->reset(new uint8[*size]);
198 211
199 uint8* buf = buffer->get(); 212 uint8* buf = buffer->get();
200 memcpy(buf, ebml_header->GetData(), ebml_header->GetDataSize()); 213 memcpy(buf, ebml_header->GetData(), ebml_header->GetDataSize());
201 buf += ebml_header->GetDataSize(); 214 buf += ebml_header->GetDataSize();
202 215
203 memcpy(buf, info->GetData(), info->GetDataSize()); 216 memcpy(buf, info->GetData(), info->GetDataSize());
204 buf += info->GetDataSize(); 217 buf += info->GetDataSize();
205 218
206 memcpy(buf, kTracksHeader, kTracksHeaderSize); 219 memcpy(buf, kTracksHeader, kTracksHeaderSize);
207 WriteInt64(buf + kTracksSizeOffset, tracks_element_size); 220 WriteInt64(buf + kTracksSizeOffset, tracks_element_size);
208 buf += kTracksHeaderSize; 221 buf += kTracksHeaderSize;
209 222
223 // TODO(xhwang): Simplify this! Probably have test data files that contain
acolwell GONE FROM CHROMIUM 2012/10/11 01:11:24 +1
224 // ContentEncodings directly instead of trying to create one at run-time.
210 if (has_audio) { 225 if (has_audio) {
211 memcpy(buf, audio_track_entry->GetData(), 226 memcpy(buf, audio_track_entry->GetData(),
212 audio_track_entry->GetDataSize()); 227 audio_track_entry->GetDataSize());
228 if (is_audio_encrypted) {
229 memcpy(buf + audio_track_entry->GetDataSize(),
230 audio_content_encodings->GetData(),
231 audio_content_encodings->GetDataSize());
232 WriteInt64(buf + kAudioTrackSizeOffset,
233 audio_track_entry->GetDataSize() +
234 audio_content_encodings->GetDataSize() -
235 kAudioTrackEntryHeaderSize);
236 buf += audio_content_encodings->GetDataSize();
237 }
213 buf += audio_track_entry->GetDataSize(); 238 buf += audio_track_entry->GetDataSize();
214 } 239 }
215 240
216 if (has_video) { 241 if (has_video) {
217 memcpy(buf, video_track_entry->GetData(), 242 memcpy(buf, video_track_entry->GetData(),
218 video_track_entry->GetDataSize()); 243 video_track_entry->GetDataSize());
219 if (video_content_encoded) { 244 if (is_video_encrypted) {
220 memcpy(buf + video_track_entry->GetDataSize(), 245 memcpy(buf + video_track_entry->GetDataSize(),
221 video_content_encodings->GetData(), 246 video_content_encodings->GetData(),
222 video_content_encodings->GetDataSize()); 247 video_content_encodings->GetDataSize());
223 WriteInt64(buf + kVideoTrackSizeOffset, 248 WriteInt64(buf + kVideoTrackSizeOffset,
224 video_track_entry->GetDataSize() + 249 video_track_entry->GetDataSize() +
225 video_content_encodings->GetDataSize() - 250 video_content_encodings->GetDataSize() -
226 kVideoTrackEntryHeaderSize); 251 kVideoTrackEntryHeaderSize);
227 buf += video_content_encodings->GetDataSize(); 252 buf += video_content_encodings->GetDataSize();
228 } 253 }
229 buf += video_track_entry->GetDataSize(); 254 buf += video_track_entry->GetDataSize();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 while (start < end) { 307 while (start < end) {
283 size_t append_size = std::min(piece_size, 308 size_t append_size = std::min(piece_size,
284 static_cast<size_t>(end - start)); 309 static_cast<size_t>(end - start));
285 if (!AppendData(start, append_size)) 310 if (!AppendData(start, append_size))
286 return false; 311 return false;
287 start += append_size; 312 start += append_size;
288 } 313 }
289 return true; 314 return true;
290 } 315 }
291 316
292 bool AppendInitSegment(bool has_audio, bool has_video, 317 bool AppendInitSegment(bool has_audio, bool has_video) {
293 bool video_content_encoded) { 318 return AppendInitSegmentWithSourceId(kSourceId, has_audio, has_video);
294 return AppendInitSegment(kSourceId, has_audio, has_video,
295 video_content_encoded);
296 } 319 }
297 320
298 bool AppendInitSegment(const std::string& source_id, 321 bool AppendInitSegmentWithSourceId(const std::string& source_id,
299 bool has_audio, bool has_video, 322 bool has_audio, bool has_video) {
300 bool video_content_encoded) { 323 return AppendInitSegmentWithEncryptedInfo(
324 source_id, has_audio, has_video, false, false);
325 }
326
327 bool AppendInitSegmentWithEncryptedInfo(const std::string& source_id,
328 bool has_audio, bool has_video,
329 bool is_audio_encrypted,
330 bool is_video_encrypted) {
301 scoped_array<uint8> info_tracks; 331 scoped_array<uint8> info_tracks;
302 int info_tracks_size = 0; 332 int info_tracks_size = 0;
303 CreateInitSegment(has_audio, has_video, video_content_encoded, 333 CreateInitSegment(has_audio, has_video,
334 is_audio_encrypted, is_video_encrypted,
304 &info_tracks, &info_tracks_size); 335 &info_tracks, &info_tracks_size);
305 return AppendData(source_id, info_tracks.get(), info_tracks_size); 336 return AppendData(source_id, info_tracks.get(), info_tracks_size);
306 } 337 }
307 338
308 bool AppendGarbage() { 339 bool AppendGarbage() {
309 // Fill up an array with gibberish. 340 // Fill up an array with gibberish.
310 int garbage_cluster_size = 10; 341 int garbage_cluster_size = 10;
311 scoped_array<uint8> garbage_cluster(new uint8[garbage_cluster_size]); 342 scoped_array<uint8> garbage_cluster(new uint8[garbage_cluster_size]);
312 for (int i = 0; i < garbage_cluster_size; ++i) 343 for (int i = 0; i < garbage_cluster_size; ++i)
313 garbage_cluster[i] = i; 344 garbage_cluster[i] = i;
(...skipping 16 matching lines...) Expand all
330 EXPECT_CALL(host_, SetDuration(expected_duration)); 361 EXPECT_CALL(host_, SetDuration(expected_duration));
331 return CreateInitDoneCB(expected_status); 362 return CreateInitDoneCB(expected_status);
332 } 363 }
333 364
334 PipelineStatusCB CreateInitDoneCB(PipelineStatus expected_status) { 365 PipelineStatusCB CreateInitDoneCB(PipelineStatus expected_status) {
335 return base::Bind(&ChunkDemuxerTest::InitDoneCalled, 366 return base::Bind(&ChunkDemuxerTest::InitDoneCalled,
336 base::Unretained(this), 367 base::Unretained(this),
337 expected_status); 368 expected_status);
338 } 369 }
339 370
340 bool InitDemuxer(bool has_audio, bool has_video, 371 bool InitDemuxer(bool has_audio, bool has_video) {
341 bool video_content_encoded) { 372 return InitDemuxerWithEncryptionInfo(has_audio, has_video, false, false);
373 }
374
375 bool InitDemuxerWithEncryptionInfo(
376 bool has_audio, bool has_video,
377 bool is_audio_encrypted, bool is_video_encrypted) {
342 PipelineStatus expected_status = 378 PipelineStatus expected_status =
343 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; 379 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN;
344 380
345 base::TimeDelta expected_duration = kNoTimestamp(); 381 base::TimeDelta expected_duration = kNoTimestamp();
346 if (expected_status == PIPELINE_OK) 382 if (expected_status == PIPELINE_OK)
347 expected_duration = kDefaultDuration(); 383 expected_duration = kDefaultDuration();
348 384
349 EXPECT_CALL(*this, DemuxerOpened()); 385 EXPECT_CALL(*this, DemuxerOpened());
350 demuxer_->Initialize( 386 demuxer_->Initialize(
351 &host_, CreateInitDoneCB(expected_duration, expected_status)); 387 &host_, CreateInitDoneCB(expected_duration, expected_status));
352 388
353 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) 389 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk)
354 return false; 390 return false;
355 391
356 return AppendInitSegment(has_audio, has_video, video_content_encoded); 392 return AppendInitSegmentWithEncryptedInfo(
393 kSourceId, has_audio, has_video,
394 is_audio_encrypted, is_video_encrypted);
357 } 395 }
358 396
359 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id, 397 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id,
360 const std::string& video_id) { 398 const std::string& video_id) {
361 EXPECT_CALL(*this, DemuxerOpened()); 399 EXPECT_CALL(*this, DemuxerOpened());
362 demuxer_->Initialize( 400 demuxer_->Initialize(
363 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 401 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
364 402
365 if (AddId(audio_id, true, false) != ChunkDemuxer::kOk) 403 if (AddId(audio_id, true, false) != ChunkDemuxer::kOk)
366 return false; 404 return false;
367 if (AddId(video_id, false, true) != ChunkDemuxer::kOk) 405 if (AddId(video_id, false, true) != ChunkDemuxer::kOk)
368 return false; 406 return false;
369 407
370 bool success = AppendInitSegment(audio_id, true, false, false); 408 bool success = AppendInitSegmentWithSourceId(audio_id, true, false);
371 success &= AppendInitSegment(video_id, false, true, false); 409 success &= AppendInitSegmentWithSourceId(video_id, false, true);
372 return success; 410 return success;
373 } 411 }
374 412
375 // Initializes the demuxer with data from 2 files with different 413 // Initializes the demuxer with data from 2 files with different
376 // decoder configurations. This is used to test the decoder config change 414 // decoder configurations. This is used to test the decoder config change
377 // logic. 415 // logic.
378 // 416 //
379 // bear-320x240.webm VideoDecoderConfig returns 320x240 for its natural_size() 417 // bear-320x240.webm VideoDecoderConfig returns 320x240 for its natural_size()
380 // bear-640x360.webm VideoDecoderConfig returns 640x360 for its natural_size() 418 // bear-640x360.webm VideoDecoderConfig returns 640x360 for its natural_size()
381 // The resulting video stream returns data from each file for the following 419 // The resulting video stream returns data from each file for the following
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 MessageLoop message_loop_; 740 MessageLoop message_loop_;
703 MockDemuxerHost host_; 741 MockDemuxerHost host_;
704 742
705 scoped_refptr<ChunkDemuxer> demuxer_; 743 scoped_refptr<ChunkDemuxer> demuxer_;
706 744
707 private: 745 private:
708 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 746 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
709 }; 747 };
710 748
711 TEST_F(ChunkDemuxerTest, TestInit) { 749 TEST_F(ChunkDemuxerTest, TestInit) {
712 // Test no streams, audio-only, video-only, and audio & video scenarios, 750 // Test no streams, audio-only, video-only, and audio & video scenarios.
713 // with video encrypted or not. 751 // Audio and video streams can be encrypted or not encrypted.
714 for (int i = 0; i < 8; i++) { 752 for (int i = 0; i < 16; i++) {
715 bool has_audio = (i & 0x1) != 0; 753 bool has_audio = (i & 0x1) != 0;
716 bool has_video = (i & 0x2) != 0; 754 bool has_video = (i & 0x2) != 0;
717 bool is_video_encrypted = (i & 0x4) != 0; 755 bool is_audio_encrypted = (i & 0x4) != 0;
756 bool is_video_encrypted = (i & 0x8) != 0;
718 757
719 // No test on invalid combination. 758 // No test on invalid combination.
720 if (!has_video && is_video_encrypted) 759 if ((!has_audio && is_audio_encrypted) ||
760 (!has_video && is_video_encrypted)) {
721 continue; 761 continue;
762 }
722 763
723 CreateNewDemuxer(); 764 CreateNewDemuxer();
724 if (has_video && is_video_encrypted)
725 EXPECT_CALL(*this, NeedKeyMock(NotNull(), 16));
726 765
727 ASSERT_TRUE(InitDemuxer(has_audio, has_video, is_video_encrypted)); 766 if (is_audio_encrypted || is_video_encrypted) {
767 int need_key_count = (is_audio_encrypted ? 1 : 0) +
768 (is_video_encrypted ? 1 : 0);
769 EXPECT_CALL(*this, NeedKeyMock(NotNull(), 16))
770 .Times(Exactly(need_key_count));
771 }
772
773 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
774 has_audio, has_video, is_audio_encrypted, is_video_encrypted));
728 775
729 scoped_refptr<DemuxerStream> audio_stream = 776 scoped_refptr<DemuxerStream> audio_stream =
730 demuxer_->GetStream(DemuxerStream::AUDIO); 777 demuxer_->GetStream(DemuxerStream::AUDIO);
731 if (has_audio) { 778 if (has_audio) {
732 ASSERT_TRUE(audio_stream); 779 ASSERT_TRUE(audio_stream);
733 780
734 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); 781 const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
735 EXPECT_EQ(kCodecVorbis, config.codec()); 782 EXPECT_EQ(kCodecVorbis, config.codec());
736 EXPECT_EQ(16, config.bits_per_channel()); 783 EXPECT_EQ(16, config.bits_per_channel());
737 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); 784 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
738 EXPECT_EQ(44100, config.samples_per_second()); 785 EXPECT_EQ(44100, config.samples_per_second());
739 EXPECT_TRUE(config.extra_data()); 786 EXPECT_TRUE(config.extra_data());
740 EXPECT_GT(config.extra_data_size(), 0u); 787 EXPECT_GT(config.extra_data_size(), 0u);
788 EXPECT_EQ(is_audio_encrypted,
789 audio_stream->audio_decoder_config().is_encrypted());
741 } else { 790 } else {
742 EXPECT_FALSE(audio_stream); 791 EXPECT_FALSE(audio_stream);
743 } 792 }
744 793
745 scoped_refptr<DemuxerStream> video_stream = 794 scoped_refptr<DemuxerStream> video_stream =
746 demuxer_->GetStream(DemuxerStream::VIDEO); 795 demuxer_->GetStream(DemuxerStream::VIDEO);
747 if (has_video) { 796 if (has_video) {
748 EXPECT_TRUE(video_stream); 797 EXPECT_TRUE(video_stream);
749 EXPECT_EQ(is_video_encrypted, 798 EXPECT_EQ(is_video_encrypted,
750 video_stream->video_decoder_config().is_encrypted()); 799 video_stream->video_decoder_config().is_encrypted());
(...skipping 10 matching lines...) Expand all
761 // is called before all the initialization segments are appended. 810 // is called before all the initialization segments are appended.
762 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) { 811 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) {
763 EXPECT_CALL(*this, DemuxerOpened()); 812 EXPECT_CALL(*this, DemuxerOpened());
764 demuxer_->Initialize( 813 demuxer_->Initialize(
765 &host_, CreateInitDoneCB( 814 &host_, CreateInitDoneCB(
766 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); 815 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN));
767 816
768 EXPECT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); 817 EXPECT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk);
769 EXPECT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); 818 EXPECT_EQ(AddId("video", false, true), ChunkDemuxer::kOk);
770 819
771 EXPECT_TRUE(AppendInitSegment("audio", true, false, false)); 820 EXPECT_TRUE(AppendInitSegmentWithSourceId("audio", true, false));
772 } 821 }
773 822
774 // Test that Seek() completes successfully when the first cluster 823 // Test that Seek() completes successfully when the first cluster
775 // arrives. 824 // arrives.
776 TEST_F(ChunkDemuxerTest, TestAppendDataAfterSeek) { 825 TEST_F(ChunkDemuxerTest, TestAppendDataAfterSeek) {
777 ASSERT_TRUE(InitDemuxer(true, true, false)); 826 ASSERT_TRUE(InitDemuxer(true, true));
778 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); 827 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster());
779 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size())); 828 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size()));
780 829
781 InSequence s; 830 InSequence s;
782 831
783 EXPECT_CALL(*this, Checkpoint(1)); 832 EXPECT_CALL(*this, Checkpoint(1));
784 833
785 demuxer_->Seek(base::TimeDelta::FromMilliseconds(46), 834 demuxer_->Seek(base::TimeDelta::FromMilliseconds(46),
786 NewExpectedStatusCB(PIPELINE_OK)); 835 NewExpectedStatusCB(PIPELINE_OK));
787 836
788 EXPECT_CALL(*this, Checkpoint(2)); 837 EXPECT_CALL(*this, Checkpoint(2));
789 838
790 scoped_ptr<Cluster> cluster(kDefaultSecondCluster()); 839 scoped_ptr<Cluster> cluster(kDefaultSecondCluster());
791 840
792 Checkpoint(1); 841 Checkpoint(1);
793 842
794 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 843 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
795 844
796 Checkpoint(2); 845 Checkpoint(2);
797 } 846 }
798 847
799 // Test that parsing errors are handled for clusters appended after init. 848 // Test that parsing errors are handled for clusters appended after init.
800 TEST_F(ChunkDemuxerTest, TestErrorWhileParsingClusterAfterInit) { 849 TEST_F(ChunkDemuxerTest, TestErrorWhileParsingClusterAfterInit) {
801 ASSERT_TRUE(InitDemuxer(true, true, false)); 850 ASSERT_TRUE(InitDemuxer(true, true));
802 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); 851 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster());
803 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size())); 852 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size()));
804 853
805 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 854 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
806 ASSERT_TRUE(AppendGarbage()); 855 ASSERT_TRUE(AppendGarbage());
807 } 856 }
808 857
809 // Test the case where a Seek() is requested while the parser 858 // Test the case where a Seek() is requested while the parser
810 // is in the middle of cluster. This is to verify that the parser 859 // is in the middle of cluster. This is to verify that the parser
811 // does not reset itself on a seek. 860 // does not reset itself on a seek.
812 TEST_F(ChunkDemuxerTest, TestSeekWhileParsingCluster) { 861 TEST_F(ChunkDemuxerTest, TestSeekWhileParsingCluster) {
813 ASSERT_TRUE(InitDemuxer(true, true, false)); 862 ASSERT_TRUE(InitDemuxer(true, true));
814 863
815 scoped_refptr<DemuxerStream> audio = 864 scoped_refptr<DemuxerStream> audio =
816 demuxer_->GetStream(DemuxerStream::AUDIO); 865 demuxer_->GetStream(DemuxerStream::AUDIO);
817 scoped_refptr<DemuxerStream> video = 866 scoped_refptr<DemuxerStream> video =
818 demuxer_->GetStream(DemuxerStream::VIDEO); 867 demuxer_->GetStream(DemuxerStream::VIDEO);
819 868
820 InSequence s; 869 InSequence s;
821 870
822 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 6)); 871 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 6));
823 872
(...skipping 24 matching lines...) Expand all
848 // in the new cluster are returned. 897 // in the new cluster are returned.
849 scoped_ptr<Cluster> cluster_b(GenerateCluster(5000, 6)); 898 scoped_ptr<Cluster> cluster_b(GenerateCluster(5000, 6));
850 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 899 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
851 GenerateExpectedReads(5000, 6, audio, video); 900 GenerateExpectedReads(5000, 6, audio, video);
852 } 901 }
853 902
854 // Test the case where AppendData() is called before Init(). 903 // Test the case where AppendData() is called before Init().
855 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) { 904 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) {
856 scoped_array<uint8> info_tracks; 905 scoped_array<uint8> info_tracks;
857 int info_tracks_size = 0; 906 int info_tracks_size = 0;
858 CreateInitSegment(true, true, false, &info_tracks, &info_tracks_size); 907 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size);
859 908
860 EXPECT_FALSE(demuxer_->AppendData(kSourceId, info_tracks.get(), 909 EXPECT_FALSE(demuxer_->AppendData(kSourceId, info_tracks.get(),
861 info_tracks_size)); 910 info_tracks_size));
862 } 911 }
863 912
864 // Make sure Read() callbacks are dispatched with the proper data. 913 // Make sure Read() callbacks are dispatched with the proper data.
865 TEST_F(ChunkDemuxerTest, TestRead) { 914 TEST_F(ChunkDemuxerTest, TestRead) {
866 ASSERT_TRUE(InitDemuxer(true, true, false)); 915 ASSERT_TRUE(InitDemuxer(true, true));
867 916
868 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 917 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
869 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 918 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
870 919
871 scoped_refptr<DemuxerStream> audio = 920 scoped_refptr<DemuxerStream> audio =
872 demuxer_->GetStream(DemuxerStream::AUDIO); 921 demuxer_->GetStream(DemuxerStream::AUDIO);
873 scoped_refptr<DemuxerStream> video = 922 scoped_refptr<DemuxerStream> video =
874 demuxer_->GetStream(DemuxerStream::VIDEO); 923 demuxer_->GetStream(DemuxerStream::VIDEO);
875 924
876 bool audio_read_done = false; 925 bool audio_read_done = false;
877 bool video_read_done = false; 926 bool video_read_done = false;
878 audio->Read(base::Bind(&OnReadDone, 927 audio->Read(base::Bind(&OnReadDone,
879 base::TimeDelta::FromMilliseconds(0), 928 base::TimeDelta::FromMilliseconds(0),
880 &audio_read_done)); 929 &audio_read_done));
881 video->Read(base::Bind(&OnReadDone, 930 video->Read(base::Bind(&OnReadDone,
882 base::TimeDelta::FromMilliseconds(0), 931 base::TimeDelta::FromMilliseconds(0),
883 &video_read_done)); 932 &video_read_done));
884 933
885 EXPECT_TRUE(audio_read_done); 934 EXPECT_TRUE(audio_read_done);
886 EXPECT_TRUE(video_read_done); 935 EXPECT_TRUE(video_read_done);
887 } 936 }
888 937
889 TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) { 938 TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) {
890 ASSERT_TRUE(InitDemuxer(true, true, false)); 939 ASSERT_TRUE(InitDemuxer(true, true));
891 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 940 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
892 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 941 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
893 942
894 scoped_ptr<Cluster> cluster_a(GenerateCluster(10, 4)); 943 scoped_ptr<Cluster> cluster_a(GenerateCluster(10, 4));
895 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 944 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
896 945
897 // Cluster B starts before cluster_a and has data 946 // Cluster B starts before cluster_a and has data
898 // that overlaps. 947 // that overlaps.
899 scoped_ptr<Cluster> cluster_b(GenerateCluster(5, 4)); 948 scoped_ptr<Cluster> cluster_b(GenerateCluster(5, 4));
900 949
901 // Make sure that AppendData() does not fail. 950 // Make sure that AppendData() does not fail.
902 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 951 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
903 952
904 // Verify that AppendData() can still accept more data. 953 // Verify that AppendData() can still accept more data.
905 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); 954 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
906 ASSERT_TRUE(demuxer_->AppendData(kSourceId, cluster_c->data(), 955 ASSERT_TRUE(demuxer_->AppendData(kSourceId, cluster_c->data(),
907 cluster_c->size())); 956 cluster_c->size()));
908 } 957 }
909 958
910 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) { 959 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) {
911 ASSERT_TRUE(InitDemuxer(true, true, false)); 960 ASSERT_TRUE(InitDemuxer(true, true));
912 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); 961 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster());
913 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size())); 962 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size()));
914 963
915 ClusterBuilder cb; 964 ClusterBuilder cb;
916 965
917 // Test the case where block timecodes are not monotonically 966 // Test the case where block timecodes are not monotonically
918 // increasing but stay above the cluster timecode. 967 // increasing but stay above the cluster timecode.
919 cb.SetClusterTimecode(5); 968 cb.SetClusterTimecode(5);
920 AddSimpleBlock(&cb, kAudioTrackNum, 5); 969 AddSimpleBlock(&cb, kAudioTrackNum, 5);
921 AddSimpleBlock(&cb, kVideoTrackNum, 10); 970 AddSimpleBlock(&cb, kVideoTrackNum, 10);
922 AddSimpleBlock(&cb, kAudioTrackNum, 7); 971 AddSimpleBlock(&cb, kAudioTrackNum, 7);
923 AddSimpleBlock(&cb, kVideoTrackNum, 15); 972 AddSimpleBlock(&cb, kVideoTrackNum, 15);
924 scoped_ptr<Cluster> cluster_a(cb.Finish()); 973 scoped_ptr<Cluster> cluster_a(cb.Finish());
925 974
926 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 975 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
927 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 976 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
928 977
929 // Verify that AppendData() doesn't accept more data now. 978 // Verify that AppendData() doesn't accept more data now.
930 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); 979 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
931 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(), 980 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(),
932 cluster_b->size())); 981 cluster_b->size()));
933 } 982 }
934 983
935 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) { 984 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) {
936 ASSERT_TRUE(InitDemuxer(true, true, false)); 985 ASSERT_TRUE(InitDemuxer(true, true));
937 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); 986 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster());
938 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size())); 987 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size()));
939 988
940 ClusterBuilder cb; 989 ClusterBuilder cb;
941 990
942 // Test timecodes going backwards and including values less than the cluster 991 // Test timecodes going backwards and including values less than the cluster
943 // timecode. 992 // timecode.
944 cb.SetClusterTimecode(5); 993 cb.SetClusterTimecode(5);
945 AddSimpleBlock(&cb, kAudioTrackNum, 5); 994 AddSimpleBlock(&cb, kAudioTrackNum, 5);
946 AddSimpleBlock(&cb, kVideoTrackNum, 5); 995 AddSimpleBlock(&cb, kVideoTrackNum, 5);
947 AddSimpleBlock(&cb, kAudioTrackNum, 3); 996 AddSimpleBlock(&cb, kAudioTrackNum, 3);
948 AddSimpleBlock(&cb, kVideoTrackNum, 3); 997 AddSimpleBlock(&cb, kVideoTrackNum, 3);
949 scoped_ptr<Cluster> cluster_a(cb.Finish()); 998 scoped_ptr<Cluster> cluster_a(cb.Finish());
950 999
951 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1000 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
952 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 1001 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
953 1002
954 // Verify that AppendData() doesn't accept more data now. 1003 // Verify that AppendData() doesn't accept more data now.
955 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); 1004 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
956 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(), 1005 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(),
957 cluster_b->size())); 1006 cluster_b->size()));
958 } 1007 }
959 1008
960 1009
961 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) { 1010 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) {
962 ASSERT_TRUE(InitDemuxer(true, true, false)); 1011 ASSERT_TRUE(InitDemuxer(true, true));
963 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); 1012 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster());
964 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size())); 1013 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size()));
965 1014
966 ClusterBuilder cb; 1015 ClusterBuilder cb;
967 1016
968 // Test monotonic increasing timestamps on a per stream 1017 // Test monotonic increasing timestamps on a per stream
969 // basis. 1018 // basis.
970 cb.SetClusterTimecode(5); 1019 cb.SetClusterTimecode(5);
971 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1020 AddSimpleBlock(&cb, kAudioTrackNum, 5);
972 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1021 AddSimpleBlock(&cb, kVideoTrackNum, 5);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 1058
1010 CheckExpectedRanges("{ }"); 1059 CheckExpectedRanges("{ }");
1011 demuxer_->EndOfStream(PIPELINE_OK); 1060 demuxer_->EndOfStream(PIPELINE_OK);
1012 ShutdownDemuxer(); 1061 ShutdownDemuxer();
1013 CheckExpectedRanges("{ }"); 1062 CheckExpectedRanges("{ }");
1014 demuxer_->RemoveId(kSourceId); 1063 demuxer_->RemoveId(kSourceId);
1015 demuxer_ = NULL; 1064 demuxer_ = NULL;
1016 } 1065 }
1017 1066
1018 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { 1067 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) {
1019 ASSERT_TRUE(InitDemuxer(true, true, false)); 1068 ASSERT_TRUE(InitDemuxer(true, true));
1020 1069
1021 CheckExpectedRanges("{ }"); 1070 CheckExpectedRanges("{ }");
1022 demuxer_->EndOfStream(PIPELINE_OK); 1071 demuxer_->EndOfStream(PIPELINE_OK);
1023 CheckExpectedRanges("{ }"); 1072 CheckExpectedRanges("{ }");
1024 } 1073 }
1025 1074
1026 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { 1075 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) {
1027 ASSERT_TRUE(InitDemuxer(true, true, false)); 1076 ASSERT_TRUE(InitDemuxer(true, true));
1028 1077
1029 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 1078 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
1030 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 1079 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
1031 CheckExpectedRanges(kDefaultFirstClusterRange); 1080 CheckExpectedRanges(kDefaultFirstClusterRange);
1032 1081
1033 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1082 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1034 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE); 1083 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE);
1035 CheckExpectedRanges(kDefaultFirstClusterRange); 1084 CheckExpectedRanges(kDefaultFirstClusterRange);
1036 } 1085 }
1037 1086
1038 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) { 1087 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) {
1039 ASSERT_TRUE(InitDemuxer(true, true, false)); 1088 ASSERT_TRUE(InitDemuxer(true, true));
1040 1089
1041 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 1090 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
1042 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 1091 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
1043 CheckExpectedRanges(kDefaultFirstClusterRange); 1092 CheckExpectedRanges(kDefaultFirstClusterRange);
1044 1093
1045 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 1094 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
1046 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); 1095 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK);
1047 } 1096 }
1048 1097
1049 // Helper class to reduce duplicate code when testing end of stream 1098 // Helper class to reduce duplicate code when testing end of stream
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1093 scoped_refptr<Demuxer> demuxer_; 1142 scoped_refptr<Demuxer> demuxer_;
1094 bool audio_read_done_; 1143 bool audio_read_done_;
1095 bool video_read_done_; 1144 bool video_read_done_;
1096 1145
1097 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); 1146 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
1098 }; 1147 };
1099 1148
1100 // Make sure that all pending reads that we don't have media data for get an 1149 // Make sure that all pending reads that we don't have media data for get an
1101 // "end of stream" buffer when EndOfStream() is called. 1150 // "end of stream" buffer when EndOfStream() is called.
1102 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { 1151 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) {
1103 ASSERT_TRUE(InitDemuxer(true, true, false)); 1152 ASSERT_TRUE(InitDemuxer(true, true));
1104 1153
1105 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); 1154 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
1106 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 1155 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
1107 1156
1108 scoped_refptr<DemuxerStream> audio = 1157 scoped_refptr<DemuxerStream> audio =
1109 demuxer_->GetStream(DemuxerStream::AUDIO); 1158 demuxer_->GetStream(DemuxerStream::AUDIO);
1110 scoped_refptr<DemuxerStream> video = 1159 scoped_refptr<DemuxerStream> video =
1111 demuxer_->GetStream(DemuxerStream::VIDEO); 1160 demuxer_->GetStream(DemuxerStream::VIDEO);
1112 1161
1113 bool audio_read_done_1 = false; 1162 bool audio_read_done_1 = false;
(...skipping 21 matching lines...) Expand all
1135 base::TimeDelta::FromMilliseconds(kVideoBlockDuration))); 1184 base::TimeDelta::FromMilliseconds(kVideoBlockDuration)));
1136 demuxer_->EndOfStream(PIPELINE_OK); 1185 demuxer_->EndOfStream(PIPELINE_OK);
1137 1186
1138 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); 1187 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
1139 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1188 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1140 } 1189 }
1141 1190
1142 // Make sure that all Read() calls after we get an EndOfStream() 1191 // Make sure that all Read() calls after we get an EndOfStream()
1143 // call return an "end of stream" buffer. 1192 // call return an "end of stream" buffer.
1144 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { 1193 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) {
1145 ASSERT_TRUE(InitDemuxer(true, true, false)); 1194 ASSERT_TRUE(InitDemuxer(true, true));
1146 1195
1147 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); 1196 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
1148 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 1197 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
1149 1198
1150 scoped_refptr<DemuxerStream> audio = 1199 scoped_refptr<DemuxerStream> audio =
1151 demuxer_->GetStream(DemuxerStream::AUDIO); 1200 demuxer_->GetStream(DemuxerStream::AUDIO);
1152 scoped_refptr<DemuxerStream> video = 1201 scoped_refptr<DemuxerStream> video =
1153 demuxer_->GetStream(DemuxerStream::VIDEO); 1202 demuxer_->GetStream(DemuxerStream::VIDEO);
1154 1203
1155 bool audio_read_done_1 = false; 1204 bool audio_read_done_1 = false;
(...skipping 25 matching lines...) Expand all
1181 // Request a few more reads and make sure we immediately get 1230 // Request a few more reads and make sure we immediately get
1182 // end of stream buffers. 1231 // end of stream buffers.
1183 end_of_stream_helper_2.RequestReads(); 1232 end_of_stream_helper_2.RequestReads();
1184 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1233 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1185 1234
1186 end_of_stream_helper_3.RequestReads(); 1235 end_of_stream_helper_3.RequestReads();
1187 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); 1236 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
1188 } 1237 }
1189 1238
1190 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) { 1239 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) {
1191 ASSERT_TRUE(InitDemuxer(true, true, false)); 1240 ASSERT_TRUE(InitDemuxer(true, true));
1192 scoped_refptr<DemuxerStream> audio = 1241 scoped_refptr<DemuxerStream> audio =
1193 demuxer_->GetStream(DemuxerStream::AUDIO); 1242 demuxer_->GetStream(DemuxerStream::AUDIO);
1194 scoped_refptr<DemuxerStream> video = 1243 scoped_refptr<DemuxerStream> video =
1195 demuxer_->GetStream(DemuxerStream::VIDEO); 1244 demuxer_->GetStream(DemuxerStream::VIDEO);
1196 1245
1197 ASSERT_TRUE(AppendCluster(0, 10)); 1246 ASSERT_TRUE(AppendCluster(0, 10));
1198 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); 1247 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138)));
1199 EXPECT_TRUE(demuxer_->EndOfStream(PIPELINE_OK)); 1248 EXPECT_TRUE(demuxer_->EndOfStream(PIPELINE_OK));
1200 1249
1201 // Start the first seek. 1250 // Start the first seek.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 // Make sure AppendData() will accept elements that span multiple calls. 1287 // Make sure AppendData() will accept elements that span multiple calls.
1239 TEST_F(ChunkDemuxerTest, TestAppendingInPieces) { 1288 TEST_F(ChunkDemuxerTest, TestAppendingInPieces) {
1240 EXPECT_CALL(*this, DemuxerOpened()); 1289 EXPECT_CALL(*this, DemuxerOpened());
1241 demuxer_->Initialize( 1290 demuxer_->Initialize(
1242 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1291 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1243 1292
1244 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1293 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1245 1294
1246 scoped_array<uint8> info_tracks; 1295 scoped_array<uint8> info_tracks;
1247 int info_tracks_size = 0; 1296 int info_tracks_size = 0;
1248 CreateInitSegment(true, true, false, &info_tracks, &info_tracks_size); 1297 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size);
1249 1298
1250 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 1299 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
1251 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); 1300 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster());
1252 1301
1253 size_t buffer_size = info_tracks_size + cluster_a->size() + cluster_b->size(); 1302 size_t buffer_size = info_tracks_size + cluster_a->size() + cluster_b->size();
1254 scoped_array<uint8> buffer(new uint8[buffer_size]); 1303 scoped_array<uint8> buffer(new uint8[buffer_size]);
1255 uint8* dst = buffer.get(); 1304 uint8* dst = buffer.get();
1256 memcpy(dst, info_tracks.get(), info_tracks_size); 1305 memcpy(dst, info_tracks.get(), info_tracks_size);
1257 dst += info_tracks_size; 1306 dst += info_tracks_size;
1258 1307
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1342 {100, 12}, 1391 {100, 12},
1343 {kSkip, kSkip}, 1392 {kSkip, kSkip},
1344 }; 1393 };
1345 1394
1346 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps, 1395 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps,
1347 base::TimeDelta::FromMilliseconds(2767))); 1396 base::TimeDelta::FromMilliseconds(2767)));
1348 } 1397 }
1349 1398
1350 // Verify that we output buffers before the entire cluster has been parsed. 1399 // Verify that we output buffers before the entire cluster has been parsed.
1351 TEST_F(ChunkDemuxerTest, TestIncrementalClusterParsing) { 1400 TEST_F(ChunkDemuxerTest, TestIncrementalClusterParsing) {
1352 ASSERT_TRUE(InitDemuxer(true, true, false)); 1401 ASSERT_TRUE(InitDemuxer(true, true));
1353 ASSERT_TRUE(AppendEmptyCluster(0)); 1402 ASSERT_TRUE(AppendEmptyCluster(0));
1354 1403
1355 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); 1404 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6));
1356 scoped_refptr<DemuxerStream> audio = 1405 scoped_refptr<DemuxerStream> audio =
1357 demuxer_->GetStream(DemuxerStream::AUDIO); 1406 demuxer_->GetStream(DemuxerStream::AUDIO);
1358 scoped_refptr<DemuxerStream> video = 1407 scoped_refptr<DemuxerStream> video =
1359 demuxer_->GetStream(DemuxerStream::VIDEO); 1408 demuxer_->GetStream(DemuxerStream::VIDEO);
1360 1409
1361 bool audio_read_done = false; 1410 bool audio_read_done = false;
1362 bool video_read_done = false; 1411 bool video_read_done = false;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1429 EXPECT_CALL(*this, DemuxerOpened()); 1478 EXPECT_CALL(*this, DemuxerOpened());
1430 demuxer_->Initialize( 1479 demuxer_->Initialize(
1431 &host_, CreateInitDoneCB(kNoTimestamp(), 1480 &host_, CreateInitDoneCB(kNoTimestamp(),
1432 DEMUXER_ERROR_COULD_NOT_OPEN)); 1481 DEMUXER_ERROR_COULD_NOT_OPEN));
1433 1482
1434 std::vector<std::string> codecs(1); 1483 std::vector<std::string> codecs(1);
1435 codecs[0] = "vorbis"; 1484 codecs[0] = "vorbis";
1436 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), 1485 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
1437 ChunkDemuxer::kOk); 1486 ChunkDemuxer::kOk);
1438 1487
1439 ASSERT_TRUE(AppendInitSegment(true, true, false)); 1488 ASSERT_TRUE(AppendInitSegment(true, true));
1440 } 1489 }
1441 1490
1442 TEST_F(ChunkDemuxerTest, TestAVHeadersWithVideoOnlyType) { 1491 TEST_F(ChunkDemuxerTest, TestAVHeadersWithVideoOnlyType) {
1443 EXPECT_CALL(*this, DemuxerOpened()); 1492 EXPECT_CALL(*this, DemuxerOpened());
1444 demuxer_->Initialize( 1493 demuxer_->Initialize(
1445 &host_, CreateInitDoneCB(kNoTimestamp(), 1494 &host_, CreateInitDoneCB(kNoTimestamp(),
1446 DEMUXER_ERROR_COULD_NOT_OPEN)); 1495 DEMUXER_ERROR_COULD_NOT_OPEN));
1447 1496
1448 std::vector<std::string> codecs(1); 1497 std::vector<std::string> codecs(1);
1449 codecs[0] = "vp8"; 1498 codecs[0] = "vp8";
1450 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 1499 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
1451 ChunkDemuxer::kOk); 1500 ChunkDemuxer::kOk);
1452 1501
1453 ASSERT_TRUE(AppendInitSegment(true, true, false)); 1502 ASSERT_TRUE(AppendInitSegment(true, true));
1454 } 1503 }
1455 1504
1456 TEST_F(ChunkDemuxerTest, TestMultipleHeaders) { 1505 TEST_F(ChunkDemuxerTest, TestMultipleHeaders) {
1457 ASSERT_TRUE(InitDemuxer(true, true, false)); 1506 ASSERT_TRUE(InitDemuxer(true, true));
1458 1507
1459 scoped_refptr<DemuxerStream> audio = 1508 scoped_refptr<DemuxerStream> audio =
1460 demuxer_->GetStream(DemuxerStream::AUDIO); 1509 demuxer_->GetStream(DemuxerStream::AUDIO);
1461 scoped_refptr<DemuxerStream> video = 1510 scoped_refptr<DemuxerStream> video =
1462 demuxer_->GetStream(DemuxerStream::VIDEO); 1511 demuxer_->GetStream(DemuxerStream::VIDEO);
1463 1512
1464 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 1513 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
1465 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 1514 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
1466 1515
1467 // Append another identical initialization segment. 1516 // Append another identical initialization segment.
1468 ASSERT_TRUE(AppendInitSegment(true, true, false)); 1517 ASSERT_TRUE(AppendInitSegment(true, true));
1469 1518
1470 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); 1519 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster());
1471 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 1520 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
1472 1521
1473 GenerateExpectedReads(0, 9, audio, video); 1522 GenerateExpectedReads(0, 9, audio, video);
1474 } 1523 }
1475 1524
1476 TEST_F(ChunkDemuxerTest, TestAddSeparateSourcesForAudioAndVideo) { 1525 TEST_F(ChunkDemuxerTest, TestAddSeparateSourcesForAudioAndVideo) {
1477 std::string audio_id = "audio1"; 1526 std::string audio_id = "audio1";
1478 std::string video_id = "video1"; 1527 std::string video_id = "video1";
(...skipping 23 matching lines...) Expand all
1502 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1551 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1503 1552
1504 std::string audio_id = "audio1"; 1553 std::string audio_id = "audio1";
1505 std::string video_id = "video1"; 1554 std::string video_id = "video1";
1506 1555
1507 ASSERT_EQ(AddId(audio_id, true, false), ChunkDemuxer::kOk); 1556 ASSERT_EQ(AddId(audio_id, true, false), ChunkDemuxer::kOk);
1508 1557
1509 // Adding an id with audio/video should fail because we already added audio. 1558 // Adding an id with audio/video should fail because we already added audio.
1510 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); 1559 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
1511 1560
1512 ASSERT_TRUE(AppendInitSegment(audio_id, true, false, false)); 1561 ASSERT_TRUE(AppendInitSegmentWithSourceId(audio_id, true, false));
1513 1562
1514 // Adding an id after append should fail. 1563 // Adding an id after append should fail.
1515 ASSERT_EQ(AddId(video_id, false, true), ChunkDemuxer::kReachedIdLimit); 1564 ASSERT_EQ(AddId(video_id, false, true), ChunkDemuxer::kReachedIdLimit);
1516 } 1565 }
1517 1566
1518 // Test that Read() calls after a RemoveId() return "end of stream" buffers. 1567 // Test that Read() calls after a RemoveId() return "end of stream" buffers.
1519 TEST_F(ChunkDemuxerTest, TestRemoveId) { 1568 TEST_F(ChunkDemuxerTest, TestRemoveId) {
1520 std::string audio_id = "audio1"; 1569 std::string audio_id = "audio1";
1521 std::string video_id = "video1"; 1570 std::string video_id = "video1";
1522 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1571 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
(...skipping 22 matching lines...) Expand all
1545 &audio_read_done)); 1594 &audio_read_done));
1546 EXPECT_TRUE(audio_read_done); 1595 EXPECT_TRUE(audio_read_done);
1547 1596
1548 // Read() from video should still return normal buffers. 1597 // Read() from video should still return normal buffers.
1549 scoped_refptr<DemuxerStream> video = 1598 scoped_refptr<DemuxerStream> video =
1550 demuxer_->GetStream(DemuxerStream::VIDEO); 1599 demuxer_->GetStream(DemuxerStream::VIDEO);
1551 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration); 1600 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration);
1552 } 1601 }
1553 1602
1554 TEST_F(ChunkDemuxerTest, TestSeekCanceled) { 1603 TEST_F(ChunkDemuxerTest, TestSeekCanceled) {
1555 ASSERT_TRUE(InitDemuxer(true, true, false)); 1604 ASSERT_TRUE(InitDemuxer(true, true));
1556 1605
1557 scoped_refptr<DemuxerStream> audio = 1606 scoped_refptr<DemuxerStream> audio =
1558 demuxer_->GetStream(DemuxerStream::AUDIO); 1607 demuxer_->GetStream(DemuxerStream::AUDIO);
1559 scoped_refptr<DemuxerStream> video = 1608 scoped_refptr<DemuxerStream> video =
1560 demuxer_->GetStream(DemuxerStream::VIDEO); 1609 demuxer_->GetStream(DemuxerStream::VIDEO);
1561 1610
1562 // Append cluster at the beginning of the stream. 1611 // Append cluster at the beginning of the stream.
1563 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4)); 1612 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4));
1564 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size())); 1613 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size()));
1565 1614
(...skipping 17 matching lines...) Expand all
1583 EXPECT_TRUE(video_read_done); 1632 EXPECT_TRUE(video_read_done);
1584 1633
1585 // A seek back to the buffered region should succeed. 1634 // A seek back to the buffered region should succeed.
1586 demuxer_->StartWaitingForSeek(); 1635 demuxer_->StartWaitingForSeek();
1587 demuxer_->Seek(base::TimeDelta::FromSeconds(0), 1636 demuxer_->Seek(base::TimeDelta::FromSeconds(0),
1588 NewExpectedStatusCB(PIPELINE_OK)); 1637 NewExpectedStatusCB(PIPELINE_OK));
1589 GenerateExpectedReads(0, 4, audio, video); 1638 GenerateExpectedReads(0, 4, audio, video);
1590 } 1639 }
1591 1640
1592 TEST_F(ChunkDemuxerTest, TestSeekCanceledWhileWaitingForSeek) { 1641 TEST_F(ChunkDemuxerTest, TestSeekCanceledWhileWaitingForSeek) {
1593 ASSERT_TRUE(InitDemuxer(true, true, false)); 1642 ASSERT_TRUE(InitDemuxer(true, true));
1594 1643
1595 scoped_refptr<DemuxerStream> audio = 1644 scoped_refptr<DemuxerStream> audio =
1596 demuxer_->GetStream(DemuxerStream::AUDIO); 1645 demuxer_->GetStream(DemuxerStream::AUDIO);
1597 scoped_refptr<DemuxerStream> video = 1646 scoped_refptr<DemuxerStream> video =
1598 demuxer_->GetStream(DemuxerStream::VIDEO); 1647 demuxer_->GetStream(DemuxerStream::VIDEO);
1599 1648
1600 // Append cluster at the beginning of the stream. 1649 // Append cluster at the beginning of the stream.
1601 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4)); 1650 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4));
1602 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size())); 1651 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size()));
1603 1652
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1690 EXPECT_TRUE(video_read_done); 1739 EXPECT_TRUE(video_read_done);
1691 } 1740 }
1692 1741
1693 // Test ranges in an audio-only stream. 1742 // Test ranges in an audio-only stream.
1694 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { 1743 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
1695 EXPECT_CALL(*this, DemuxerOpened()); 1744 EXPECT_CALL(*this, DemuxerOpened());
1696 demuxer_->Initialize( 1745 demuxer_->Initialize(
1697 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1746 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1698 1747
1699 ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk); 1748 ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk);
1700 ASSERT_TRUE(AppendInitSegment(true, false, false)); 1749 ASSERT_TRUE(AppendInitSegment(true, false));
1701 1750
1702 // Test a simple cluster. 1751 // Test a simple cluster.
1703 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 92, 1752 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 92,
1704 kAudioTrackNum, kAudioBlockDuration)); 1753 kAudioTrackNum, kAudioBlockDuration));
1705 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); 1754 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size()));
1706 1755
1707 CheckExpectedRanges("{ [0,92) }"); 1756 CheckExpectedRanges("{ [0,92) }");
1708 1757
1709 // Append a disjoint cluster to check for two separate ranges. 1758 // Append a disjoint cluster to check for two separate ranges.
1710 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 219, 1759 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 219,
1711 kAudioTrackNum, kAudioBlockDuration)); 1760 kAudioTrackNum, kAudioBlockDuration));
1712 1761
1713 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); 1762 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size()));
1714 1763
1715 CheckExpectedRanges("{ [0,92) [150,219) }"); 1764 CheckExpectedRanges("{ [0,92) [150,219) }");
1716 } 1765 }
1717 1766
1718 // Test ranges in a video-only stream. 1767 // Test ranges in a video-only stream.
1719 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { 1768 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
1720 EXPECT_CALL(*this, DemuxerOpened()); 1769 EXPECT_CALL(*this, DemuxerOpened());
1721 demuxer_->Initialize( 1770 demuxer_->Initialize(
1722 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1771 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1723 1772
1724 ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk); 1773 ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk);
1725 ASSERT_TRUE(AppendInitSegment(false, true, false)); 1774 ASSERT_TRUE(AppendInitSegment(false, true));
1726 1775
1727 // Test a simple cluster. 1776 // Test a simple cluster.
1728 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 132, 1777 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 132,
1729 kVideoTrackNum, kVideoBlockDuration)); 1778 kVideoTrackNum, kVideoBlockDuration));
1730 1779
1731 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); 1780 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size()));
1732 1781
1733 CheckExpectedRanges("{ [0,132) }"); 1782 CheckExpectedRanges("{ [0,132) }");
1734 1783
1735 // Append a disjoint cluster to check for two separate ranges. 1784 // Append a disjoint cluster to check for two separate ranges.
1736 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(200, 299, 1785 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(200, 299,
1737 kVideoTrackNum, kVideoBlockDuration)); 1786 kVideoTrackNum, kVideoBlockDuration));
1738 1787
1739 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); 1788 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size()));
1740 1789
1741 CheckExpectedRanges("{ [0,132) [200,299) }"); 1790 CheckExpectedRanges("{ [0,132) [200,299) }");
1742 } 1791 }
1743 1792
1744 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { 1793 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
1745 ASSERT_TRUE(InitDemuxer(true, true, false)); 1794 ASSERT_TRUE(InitDemuxer(true, true));
1746 1795
1747 // Audio: 0 -> 23 1796 // Audio: 0 -> 23
1748 // Video: 0 -> 33 1797 // Video: 0 -> 33
1749 // Buffered Range: 0 -> 23 1798 // Buffered Range: 0 -> 23
1750 // Audio block duration is smaller than video block duration, 1799 // Audio block duration is smaller than video block duration,
1751 // so the buffered ranges should correspond to the audio blocks. 1800 // so the buffered ranges should correspond to the audio blocks.
1752 scoped_ptr<Cluster> cluster_a0( 1801 scoped_ptr<Cluster> cluster_a0(
1753 GenerateSingleStreamCluster(0, kAudioBlockDuration, kAudioTrackNum, 1802 GenerateSingleStreamCluster(0, kAudioBlockDuration, kAudioTrackNum,
1754 kAudioBlockDuration)); 1803 kAudioBlockDuration));
1755 1804
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1829 scoped_ptr<Cluster> cluster_v5( 1878 scoped_ptr<Cluster> cluster_v5(
1830 GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10)); 1879 GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10));
1831 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size())); 1880 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size()));
1832 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 1881 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
1833 } 1882 }
1834 1883
1835 // Once EndOfStream() is called, GetBufferedRanges should not cut off any 1884 // Once EndOfStream() is called, GetBufferedRanges should not cut off any
1836 // over-hanging tails at the end of the ranges as this is likely due to block 1885 // over-hanging tails at the end of the ranges as this is likely due to block
1837 // duration differences. 1886 // duration differences.
1838 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { 1887 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
1839 ASSERT_TRUE(InitDemuxer(true, true, false)); 1888 ASSERT_TRUE(InitDemuxer(true, true));
1840 1889
1841 scoped_ptr<Cluster> cluster_a( 1890 scoped_ptr<Cluster> cluster_a(
1842 GenerateSingleStreamCluster(0, 90, kAudioTrackNum, 90)); 1891 GenerateSingleStreamCluster(0, 90, kAudioTrackNum, 90));
1843 scoped_ptr<Cluster> cluster_v( 1892 scoped_ptr<Cluster> cluster_v(
1844 GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 100)); 1893 GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 100));
1845 1894
1846 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 1895 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
1847 ASSERT_TRUE(AppendData(cluster_v->data(), cluster_v->size())); 1896 ASSERT_TRUE(AppendData(cluster_v->data(), cluster_v->size()));
1848 1897
1849 CheckExpectedRanges("{ [0,90) }"); 1898 CheckExpectedRanges("{ [0,90) }");
1850 1899
1851 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(100))); 1900 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(100)));
1852 demuxer_->EndOfStream(PIPELINE_OK); 1901 demuxer_->EndOfStream(PIPELINE_OK);
1853 1902
1854 CheckExpectedRanges("{ [0,100) }"); 1903 CheckExpectedRanges("{ [0,100) }");
1855 } 1904 }
1856 1905
1857 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) { 1906 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) {
1858 ASSERT_TRUE(InitDemuxer(true, true, false)); 1907 ASSERT_TRUE(InitDemuxer(true, true));
1859 1908
1860 scoped_refptr<DemuxerStream> audio = 1909 scoped_refptr<DemuxerStream> audio =
1861 demuxer_->GetStream(DemuxerStream::AUDIO); 1910 demuxer_->GetStream(DemuxerStream::AUDIO);
1862 scoped_refptr<DemuxerStream> video = 1911 scoped_refptr<DemuxerStream> video =
1863 demuxer_->GetStream(DemuxerStream::VIDEO); 1912 demuxer_->GetStream(DemuxerStream::VIDEO);
1864 1913
1865 // Create a cluster where the video timecode begins 25ms after the audio. 1914 // Create a cluster where the video timecode begins 25ms after the audio.
1866 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 25, 8)); 1915 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 25, 8));
1867 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size())); 1916 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size()));
1868 1917
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1932 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); 1981 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size()));
1933 1982
1934 // Should not be able to fulfill a seek to 0. 1983 // Should not be able to fulfill a seek to 0.
1935 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), 1984 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0),
1936 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); 1985 NewExpectedStatusCB(PIPELINE_ERROR_ABORT));
1937 ExpectRead(audio, 0); 1986 ExpectRead(audio, 0);
1938 ExpectEndOfStream(video); 1987 ExpectEndOfStream(video);
1939 } 1988 }
1940 1989
1941 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) { 1990 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) {
1942 ASSERT_TRUE(InitDemuxer(true, true, false)); 1991 ASSERT_TRUE(InitDemuxer(true, true));
1943 1992
1944 // Generate and append an empty cluster beginning at 0. 1993 // Generate and append an empty cluster beginning at 0.
1945 ASSERT_TRUE(AppendEmptyCluster(0)); 1994 ASSERT_TRUE(AppendEmptyCluster(0));
1946 1995
1947 // Sanity check that data can be appended after this cluster correctly. 1996 // Sanity check that data can be appended after this cluster correctly.
1948 scoped_ptr<Cluster> media_data(GenerateCluster(0, 2)); 1997 scoped_ptr<Cluster> media_data(GenerateCluster(0, 2));
1949 ASSERT_TRUE(AppendData(media_data->data(), media_data->size())); 1998 ASSERT_TRUE(AppendData(media_data->data(), media_data->size()));
1950 scoped_refptr<DemuxerStream> audio = 1999 scoped_refptr<DemuxerStream> audio =
1951 demuxer_->GetStream(DemuxerStream::AUDIO); 2000 demuxer_->GetStream(DemuxerStream::AUDIO);
1952 scoped_refptr<DemuxerStream> video = 2001 scoped_refptr<DemuxerStream> video =
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2028 2077
2029 CheckExpectedRanges("audio", "{ }"); 2078 CheckExpectedRanges("audio", "{ }");
2030 CheckExpectedRanges("video", "{ }"); 2079 CheckExpectedRanges("video", "{ }");
2031 } 2080 }
2032 2081
2033 // Test that Seek() completes successfully when the first cluster 2082 // Test that Seek() completes successfully when the first cluster
2034 // arrives. 2083 // arrives.
2035 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringSeek) { 2084 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringSeek) {
2036 InSequence s; 2085 InSequence s;
2037 2086
2038 ASSERT_TRUE(InitDemuxer(true, true, false)); 2087 ASSERT_TRUE(InitDemuxer(true, true));
2039 2088
2040 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2089 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2041 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); 2090 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster());
2042 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 2091 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
2043 2092
2044 demuxer_->StartWaitingForSeek(); 2093 demuxer_->StartWaitingForSeek();
2045 2094
2046 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 2095 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
2047 EXPECT_CALL(host_, SetDuration( 2096 EXPECT_CALL(host_, SetDuration(
2048 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); 2097 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp)));
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
2204 NewExpectedStatusCB(PIPELINE_OK)); 2253 NewExpectedStatusCB(PIPELINE_OK));
2205 demuxer_->Seek(base::TimeDelta::FromMilliseconds(801), 2254 demuxer_->Seek(base::TimeDelta::FromMilliseconds(801),
2206 NewExpectedStatusCB(PIPELINE_OK)); 2255 NewExpectedStatusCB(PIPELINE_OK));
2207 2256
2208 // Verify that no config change is signalled. 2257 // Verify that no config change is signalled.
2209 ExpectRead(stream, 801); 2258 ExpectRead(stream, 801);
2210 ASSERT_TRUE(video_config_1.Matches(stream->video_decoder_config())); 2259 ASSERT_TRUE(video_config_1.Matches(stream->video_decoder_config()));
2211 } 2260 }
2212 2261
2213 TEST_F(ChunkDemuxerTest, TestTimestampPositiveOffset) { 2262 TEST_F(ChunkDemuxerTest, TestTimestampPositiveOffset) {
2214 ASSERT_TRUE(InitDemuxer(true, true, false)); 2263 ASSERT_TRUE(InitDemuxer(true, true));
2215 2264
2216 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2265 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2217 kSourceId, base::TimeDelta::FromSeconds(30))); 2266 kSourceId, base::TimeDelta::FromSeconds(30)));
2218 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); 2267 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
2219 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 2268 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
2220 2269
2221 demuxer_->StartWaitingForSeek(); 2270 demuxer_->StartWaitingForSeek();
2222 demuxer_->Seek(base::TimeDelta::FromMilliseconds(30000), 2271 demuxer_->Seek(base::TimeDelta::FromMilliseconds(30000),
2223 NewExpectedStatusCB(PIPELINE_OK)); 2272 NewExpectedStatusCB(PIPELINE_OK));
2224 2273
2225 scoped_refptr<DemuxerStream> audio = 2274 scoped_refptr<DemuxerStream> audio =
2226 demuxer_->GetStream(DemuxerStream::AUDIO); 2275 demuxer_->GetStream(DemuxerStream::AUDIO);
2227 scoped_refptr<DemuxerStream> video = 2276 scoped_refptr<DemuxerStream> video =
2228 demuxer_->GetStream(DemuxerStream::VIDEO); 2277 demuxer_->GetStream(DemuxerStream::VIDEO);
2229 GenerateExpectedReads(30000, 2, audio, video); 2278 GenerateExpectedReads(30000, 2, audio, video);
2230 } 2279 }
2231 2280
2232 TEST_F(ChunkDemuxerTest, TestTimestampNegativeOffset) { 2281 TEST_F(ChunkDemuxerTest, TestTimestampNegativeOffset) {
2233 ASSERT_TRUE(InitDemuxer(true, true, false)); 2282 ASSERT_TRUE(InitDemuxer(true, true));
2234 2283
2235 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2284 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2236 kSourceId, base::TimeDelta::FromSeconds(-1))); 2285 kSourceId, base::TimeDelta::FromSeconds(-1)));
2237 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); 2286 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2);
2238 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 2287 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
2239 2288
2240 scoped_refptr<DemuxerStream> audio = 2289 scoped_refptr<DemuxerStream> audio =
2241 demuxer_->GetStream(DemuxerStream::AUDIO); 2290 demuxer_->GetStream(DemuxerStream::AUDIO);
2242 scoped_refptr<DemuxerStream> video = 2291 scoped_refptr<DemuxerStream> video =
2243 demuxer_->GetStream(DemuxerStream::VIDEO); 2292 demuxer_->GetStream(DemuxerStream::VIDEO);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2289 audio_id, base::TimeDelta::FromMilliseconds(27300))); 2338 audio_id, base::TimeDelta::FromMilliseconds(27300)));
2290 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2339 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2291 video_id, base::TimeDelta::FromMilliseconds(27300))); 2340 video_id, base::TimeDelta::FromMilliseconds(27300)));
2292 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size())); 2341 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size()));
2293 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); 2342 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size()));
2294 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration); 2343 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration);
2295 GenerateSingleStreamExpectedReads(27300, 4, audio, kAudioBlockDuration); 2344 GenerateSingleStreamExpectedReads(27300, 4, audio, kAudioBlockDuration);
2296 } 2345 }
2297 2346
2298 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) { 2347 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) {
2299 ASSERT_TRUE(InitDemuxer(true, true, false)); 2348 ASSERT_TRUE(InitDemuxer(true, true));
2300 2349
2301 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); 2350 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2);
2302 // Append only part of the cluster data. 2351 // Append only part of the cluster data.
2303 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13)); 2352 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13));
2304 2353
2305 // Setting a timestamp should fail because we're in the middle of a cluster. 2354 // Setting a timestamp should fail because we're in the middle of a cluster.
2306 ASSERT_FALSE(demuxer_->SetTimestampOffset( 2355 ASSERT_FALSE(demuxer_->SetTimestampOffset(
2307 kSourceId, base::TimeDelta::FromSeconds(25))); 2356 kSourceId, base::TimeDelta::FromSeconds(25)));
2308 2357
2309 demuxer_->Abort(kSourceId); 2358 demuxer_->Abort(kSourceId);
2310 // After Abort(), setting a timestamp should succeed since we're no longer 2359 // After Abort(), setting a timestamp should succeed since we're no longer
2311 // in the middle of a cluster 2360 // in the middle of a cluster
2312 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2361 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2313 kSourceId, base::TimeDelta::FromSeconds(25))); 2362 kSourceId, base::TimeDelta::FromSeconds(25)));
2314 } 2363 }
2315 2364
2316 TEST_F(ChunkDemuxerTest, TestDurationChange) { 2365 TEST_F(ChunkDemuxerTest, TestDurationChange) {
2317 ASSERT_TRUE(InitDemuxer(true, true, false)); 2366 ASSERT_TRUE(InitDemuxer(true, true));
2318 static const int kStreamDuration = kDefaultDuration().InMilliseconds(); 2367 static const int kStreamDuration = kDefaultDuration().InMilliseconds();
2319 2368
2320 // Add data leading up to the currently set duration. 2369 // Add data leading up to the currently set duration.
2321 scoped_ptr<Cluster> first_cluster = GenerateCluster( 2370 scoped_ptr<Cluster> first_cluster = GenerateCluster(
2322 kStreamDuration - kAudioBlockDuration, 2371 kStreamDuration - kAudioBlockDuration,
2323 kStreamDuration - kVideoBlockDuration, 2); 2372 kStreamDuration - kVideoBlockDuration, 2);
2324 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size())); 2373 ASSERT_TRUE(AppendData(first_cluster->data(), first_cluster->size()));
2325 2374
2326 CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); 2375 CheckExpectedRanges(kSourceId, "{ [201191,201224) }");
2327 2376
(...skipping 13 matching lines...) Expand all
2341 kStreamDuration + kVideoBlockDuration, 2); 2390 kStreamDuration + kVideoBlockDuration, 2);
2342 EXPECT_CALL(host_, SetDuration( 2391 EXPECT_CALL(host_, SetDuration(
2343 base::TimeDelta::FromMilliseconds(kNewStreamDuration))); 2392 base::TimeDelta::FromMilliseconds(kNewStreamDuration)));
2344 ASSERT_TRUE(AppendData(third_cluster->data(), third_cluster->size())); 2393 ASSERT_TRUE(AppendData(third_cluster->data(), third_cluster->size()));
2345 2394
2346 // See that the range has increased appropriately. 2395 // See that the range has increased appropriately.
2347 CheckExpectedRanges(kSourceId, "{ [201191,201270) }"); 2396 CheckExpectedRanges(kSourceId, "{ [201191,201270) }");
2348 } 2397 }
2349 2398
2350 TEST_F(ChunkDemuxerTest, TestDurationChangeTimestampOffset) { 2399 TEST_F(ChunkDemuxerTest, TestDurationChangeTimestampOffset) {
2351 ASSERT_TRUE(InitDemuxer(true, true, false)); 2400 ASSERT_TRUE(InitDemuxer(true, true));
2352 2401
2353 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, kDefaultDuration())); 2402 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, kDefaultDuration()));
2354 scoped_ptr<Cluster> cluster = GenerateCluster(0, 4); 2403 scoped_ptr<Cluster> cluster = GenerateCluster(0, 4);
2355 2404
2356 EXPECT_CALL(host_, SetDuration( 2405 EXPECT_CALL(host_, SetDuration(
2357 kDefaultDuration() + base::TimeDelta::FromMilliseconds( 2406 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
2358 kAudioBlockDuration * 2))); 2407 kAudioBlockDuration * 2)));
2359 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 2408 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
2360 } 2409 }
2361 2410
2362 TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) { 2411 TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) {
2363 ASSERT_TRUE(InitDemuxer(true, true, false)); 2412 ASSERT_TRUE(InitDemuxer(true, true));
2364 2413
2365 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2414 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2366 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 2415 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
2367 2416
2368 EXPECT_CALL(host_, SetDuration( 2417 EXPECT_CALL(host_, SetDuration(
2369 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 2418 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
2370 demuxer_->EndOfStream(PIPELINE_OK); 2419 demuxer_->EndOfStream(PIPELINE_OK);
2371 } 2420 }
2372 2421
2373 } // namespace media 2422 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698