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

Unified Diff: media/base/android/media_source_player_unittest.cc

Issue 113963005: Use decoder's timestamp instead of the timestamp from AU during prerolling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: adding crbug Created 6 years, 12 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/android/media_decoder_job.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/android/media_source_player_unittest.cc
diff --git a/media/base/android/media_source_player_unittest.cc b/media/base/android/media_source_player_unittest.cc
index d1ee9dcb72d84ed3624eebe709838e37a3d315de..981a490d4081cd69555d9a6e093c68d882aafb09 100644
--- a/media/base/android/media_source_player_unittest.cc
+++ b/media/base/android/media_source_player_unittest.cc
@@ -431,6 +431,37 @@ class MediaSourcePlayerTest : public testing::Test {
EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests());
}
+ // Preroll the decoder job to |target_timestamp|. The first access unit
+ // to decode will have a timestamp equal to |start_timestamp|.
+ // TODO(qinmin): Add additional test cases for out-of-order decodes.
+ // See http://crbug.com/331421.
+ void PrerollDecoderToTime(bool is_audio,
+ const base::TimeDelta& start_timestamp,
+ const base::TimeDelta& target_timestamp) {
+ EXPECT_EQ(target_timestamp, player_.GetCurrentTime());
+ // |start_timestamp| must be smaller than |target_timestamp|.
+ EXPECT_LE(start_timestamp, target_timestamp);
+ DemuxerData data = is_audio ? CreateReadFromDemuxerAckForAudio(1) :
+ CreateReadFromDemuxerAckForVideo();
+ int current_timestamp = start_timestamp.InMilliseconds();
+
+ // Send some data with access unit timestamps before the |target_timestamp|,
+ // and continue sending the data until preroll finishes.
+ // This simulates the common condition that AUs received after browser
+ // seek begin with timestamps before the seek target, and don't
+ // immediately complete preroll.
+ while (IsPrerolling(is_audio)) {
+ data.access_units[0].timestamp =
+ base::TimeDelta::FromMilliseconds(current_timestamp);
+ player_.OnDemuxerDataAvailable(data);
+ EXPECT_TRUE(GetMediaDecoderJob(is_audio)->is_decoding());
+ EXPECT_EQ(target_timestamp, player_.GetCurrentTime());
+ current_timestamp += 30;
+ message_loop_.Run();
+ }
+ EXPECT_LE(target_timestamp, player_.GetCurrentTime());
+ }
+
DemuxerData CreateReadFromDemuxerAckWithConfigChanged(bool is_audio,
int config_unit_index) {
DemuxerData data;
@@ -1347,24 +1378,8 @@ TEST_F(MediaSourcePlayerTest, PrerollAudioAfterSeek) {
SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
EXPECT_TRUE(IsPrerolling(true));
- EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
-
- // Send some data before the seek position.
- for (int i = 1; i < 4; ++i) {
- player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
- EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
- message_loop_.Run();
- }
- EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
- EXPECT_TRUE(IsPrerolling(true));
-
- // Send data after the seek position.
- DemuxerData data = CreateReadFromDemuxerAckForAudio(3);
- data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
- player_.OnDemuxerDataAvailable(data);
- message_loop_.Run();
- EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
- EXPECT_FALSE(IsPrerolling(true));
+ PrerollDecoderToTime(
+ true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
}
TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) {
@@ -1376,32 +1391,8 @@ TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) {
SeekPlayerWithAbort(false, base::TimeDelta::FromMilliseconds(100));
EXPECT_TRUE(IsPrerolling(false));
- EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
-
- // Send some data before the seek position.
- DemuxerData data;
- for (int i = 1; i < 4; ++i) {
- data = CreateReadFromDemuxerAckForVideo();
- data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30);
- player_.OnDemuxerDataAvailable(data);
- EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
- message_loop_.Run();
- }
- EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
- EXPECT_TRUE(IsPrerolling(false));
-
- // Send data at the seek position.
- data = CreateReadFromDemuxerAckForVideo();
- data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
- player_.OnDemuxerDataAvailable(data);
- message_loop_.Run();
-
- // TODO(wolenetz/qinmin): Player's maintenance of current time for video-only
- // streams depends on decoder output, which may be initially inaccurate, and
- // encoded video test data may also need updating. Verify at least that AU
- // timestamp-based preroll logic has determined video preroll has completed.
- // See http://crbug.com/310823 and http://b/11356652.
- EXPECT_FALSE(IsPrerolling(false));
+ PrerollDecoderToTime(
+ false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
}
TEST_F(MediaSourcePlayerTest, SeekingAfterCompletingPrerollRestartsPreroll) {
@@ -1453,7 +1444,8 @@ TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) {
// and Start().
StartAudioDecoderJob(true);
- SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
+ base::TimeDelta target_timestamp = base::TimeDelta::FromMilliseconds(100);
+ SeekPlayerWithAbort(true, target_timestamp);
EXPECT_TRUE(IsPrerolling(true));
EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
@@ -1492,12 +1484,7 @@ TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) {
EXPECT_TRUE(IsPrerolling(true));
// Send data after the seek position.
- data = CreateReadFromDemuxerAckForAudio(3);
- data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
- player_.OnDemuxerDataAvailable(data);
- message_loop_.Run();
- EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
- EXPECT_FALSE(IsPrerolling(true));
+ PrerollDecoderToTime(true, target_timestamp, target_timestamp);
}
TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) {
@@ -1522,22 +1509,8 @@ TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) {
// Simulate arrival of new configs.
player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis));
- // Send some data before the seek position.
- for (int i = 1; i < 4; ++i) {
- player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
- EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
- message_loop_.Run();
- }
- EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
- EXPECT_TRUE(IsPrerolling(true));
-
- // Send data after the seek position.
- data = CreateReadFromDemuxerAckForAudio(3);
- data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
- player_.OnDemuxerDataAvailable(data);
- message_loop_.Run();
- EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
- EXPECT_FALSE(IsPrerolling(true));
+ PrerollDecoderToTime(
+ true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
}
TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) {
@@ -1633,31 +1606,8 @@ TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) {
EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
EXPECT_EQ(2, demuxer_->num_data_requests());
- // Send some data with access unit timestamps before the actual browser seek
- // position. This is a bit unrealistic in this case where the browser seek
- // jumped forward and next data from demuxer would normally begin at this
- // browser seek position, immediately completing preroll. For simplicity and
- // coverage, this test simulates the more common condition that AUs received
- // after browser seek begin with timestamps before the seek target, and don't
- // immediately complete preroll.
- DemuxerData data;
- for (int i = 1; i < 4; ++i) {
- data = CreateReadFromDemuxerAckForVideo();
- data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30);
- player_.OnDemuxerDataAvailable(data);
- EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
- message_loop_.Run();
- EXPECT_TRUE(IsPrerolling(false));
- }
-
- EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
-
- // Send data after the browser seek position.
- data = CreateReadFromDemuxerAckForVideo();
- data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(120);
- player_.OnDemuxerDataAvailable(data);
- message_loop_.Run();
- EXPECT_FALSE(IsPrerolling(false));
+ PrerollDecoderToTime(
+ false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
}
TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) {
« no previous file with comments | « media/base/android/media_decoder_job.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698