OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <deque> | 9 #include <deque> |
10 #include <string> | 10 #include <string> |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 std::unique_ptr<FileDataSource> data_source_; | 233 std::unique_ptr<FileDataSource> data_source_; |
234 std::unique_ptr<FFmpegDemuxer> demuxer_; | 234 std::unique_ptr<FFmpegDemuxer> demuxer_; |
235 StrictMock<MockDemuxerHost> host_; | 235 StrictMock<MockDemuxerHost> host_; |
236 std::unique_ptr<MediaTracks> media_tracks_; | 236 std::unique_ptr<MediaTracks> media_tracks_; |
237 base::MessageLoop message_loop_; | 237 base::MessageLoop message_loop_; |
238 | 238 |
239 AVFormatContext* format_context() { | 239 AVFormatContext* format_context() { |
240 return demuxer_->glue_->format_context(); | 240 return demuxer_->glue_->format_context(); |
241 } | 241 } |
242 | 242 |
243 int preferred_seeking_stream_index() const { | 243 DemuxerStream* preferred_seeking_stream(base::TimeDelta seek_time) const { |
244 return demuxer_->preferred_stream_for_seeking_.first; | 244 return demuxer_->FindPreferredStreamForSeeking(seek_time); |
245 } | 245 } |
246 | 246 |
247 void ReadUntilEndOfStream(DemuxerStream* stream) { | 247 void ReadUntilEndOfStream(DemuxerStream* stream) { |
248 bool got_eos_buffer = false; | 248 bool got_eos_buffer = false; |
249 const int kMaxBuffers = 170; | 249 const int kMaxBuffers = 170; |
250 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { | 250 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { |
251 stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); | 251 stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); |
252 base::RunLoop().Run(); | 252 base::RunLoop().Run(); |
253 } | 253 } |
254 | 254 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); | 465 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); |
466 base::RunLoop().Run(); | 466 base::RunLoop().Run(); |
467 | 467 |
468 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); | 468 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); |
469 base::RunLoop().Run(); | 469 base::RunLoop().Run(); |
470 } | 470 } |
471 | 471 |
472 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { | 472 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { |
473 CreateDemuxer("audio-start-time-only.webm"); | 473 CreateDemuxer("audio-start-time-only.webm"); |
474 InitializeDemuxer(); | 474 InitializeDemuxer(); |
475 EXPECT_EQ(0, preferred_seeking_stream_index()); | 475 // Video stream should be preferred for seeking even if video start time is |
| 476 // unknown. |
| 477 DemuxerStream* vstream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 478 EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); |
| 479 } |
| 480 |
| 481 TEST_F(FFmpegDemuxerTest, Seeking_PreferredStreamSelection) { |
| 482 const int64_t kTimelineOffsetMs = 1352550896000LL; |
| 483 |
| 484 // Test the start time is the first timestamp of the video and audio stream. |
| 485 CreateDemuxer("nonzero-start-time.webm"); |
| 486 InitializeDemuxerWithTimelineOffset( |
| 487 base::Time::FromJsTime(kTimelineOffsetMs)); |
| 488 |
| 489 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 490 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 491 |
| 492 const base::TimeDelta video_start_time = |
| 493 base::TimeDelta::FromMicroseconds(400000); |
| 494 const base::TimeDelta audio_start_time = |
| 495 base::TimeDelta::FromMicroseconds(396000); |
| 496 |
| 497 // Seeking to a position lower than the start time of either stream should |
| 498 // prefer video stream for seeking. |
| 499 EXPECT_EQ(video, preferred_seeking_stream(base::TimeDelta())); |
| 500 // Seeking to a position that has audio data, but not video, should prefer |
| 501 // the audio stream for seeking. |
| 502 EXPECT_EQ(audio, preferred_seeking_stream(audio_start_time)); |
| 503 // Seeking to a position where both audio and video streams have data should |
| 504 // prefer the video stream for seeking. |
| 505 EXPECT_EQ(video, preferred_seeking_stream(video_start_time)); |
| 506 |
| 507 // A disabled stream should not be preferred for seeking. |
| 508 audio->set_enabled(false, base::TimeDelta()); |
| 509 EXPECT_EQ(video, preferred_seeking_stream(base::TimeDelta())); |
| 510 EXPECT_EQ(video, preferred_seeking_stream(audio_start_time)); |
| 511 EXPECT_EQ(video, preferred_seeking_stream(video_start_time)); |
| 512 |
| 513 audio->set_enabled(true, base::TimeDelta()); |
| 514 video->set_enabled(false, base::TimeDelta()); |
| 515 EXPECT_EQ(audio, preferred_seeking_stream(base::TimeDelta())); |
| 516 EXPECT_EQ(audio, preferred_seeking_stream(audio_start_time)); |
| 517 EXPECT_EQ(audio, preferred_seeking_stream(video_start_time)); |
476 } | 518 } |
477 | 519 |
478 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { | 520 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { |
479 const int64_t kTimelineOffsetMs = 1352550896000LL; | 521 const int64_t kTimelineOffsetMs = 1352550896000LL; |
480 | 522 |
481 // Test the start time is the first timestamp of the video and audio stream. | 523 // Test the start time is the first timestamp of the video and audio stream. |
482 CreateDemuxer("nonzero-start-time.webm"); | 524 CreateDemuxer("nonzero-start-time.webm"); |
483 InitializeDemuxerWithTimelineOffset( | 525 InitializeDemuxerWithTimelineOffset( |
484 base::Time::FromJsTime(kTimelineOffsetMs)); | 526 base::Time::FromJsTime(kTimelineOffsetMs)); |
485 | 527 |
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 | 1277 |
1236 const MediaTrack& audio_track = *(media_tracks_->tracks()[1]); | 1278 const MediaTrack& audio_track = *(media_tracks_->tracks()[1]); |
1237 EXPECT_EQ(audio_track.type(), MediaTrack::Audio); | 1279 EXPECT_EQ(audio_track.type(), MediaTrack::Audio); |
1238 EXPECT_EQ(audio_track.bytestream_track_id(), 2); | 1280 EXPECT_EQ(audio_track.bytestream_track_id(), 2); |
1239 EXPECT_EQ(audio_track.kind(), "main"); | 1281 EXPECT_EQ(audio_track.kind(), "main"); |
1240 EXPECT_EQ(audio_track.label(), ""); | 1282 EXPECT_EQ(audio_track.label(), ""); |
1241 EXPECT_EQ(audio_track.language(), ""); | 1283 EXPECT_EQ(audio_track.language(), ""); |
1242 } | 1284 } |
1243 | 1285 |
1244 } // namespace media | 1286 } // namespace media |
OLD | NEW |