From e3e57c9b9943fd160105001b2e8e26782173843e Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 1 Feb 2024 03:55:35 -0800 Subject: [PATCH] Fix HlsPlaybackTest flakiness The new test introduced in https://github.com/androidx/media/commit/45bd5c6f0a24b24282bdb971a3a780a9923eff01 is flaky because we only wait until the media is fully buffered. However, we can't fully control how much of this data is initially read by the Robolectric codec and thus the output dump files (containing these codec interactions) are flaky. This can be fixed by fully playing the media once and then seeking back instead. #minor-release PiperOrigin-RevId: 603324068 --- .../hls/e2etest/HlsPlaybackTest.java | 12 +- .../hls/multi-segment-with-seek.dump | 665 +++++++++++++++--- 2 files changed, 592 insertions(+), 85 deletions(-) diff --git a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/e2etest/HlsPlaybackTest.java b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/e2etest/HlsPlaybackTest.java index 75e087b0e8..060e6b0f8d 100644 --- a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/e2etest/HlsPlaybackTest.java +++ b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/e2etest/HlsPlaybackTest.java @@ -22,6 +22,7 @@ import android.view.Surface; import androidx.media3.common.MediaItem; import androidx.media3.common.Player; import androidx.media3.datasource.DefaultDataSource; +import androidx.media3.exoplayer.DefaultLoadControl; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.SeekParameters; import androidx.media3.exoplayer.hls.HlsMediaSource; @@ -167,14 +168,19 @@ public final class HlsPlaybackTest { new HlsMediaSource.Factory(new DefaultDataSource.Factory(applicationContext)) .experimentalParseSubtitlesDuringExtraction(true)) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) + .setLoadControl( + new DefaultLoadControl.Builder() + .setBackBuffer( + /* backBufferDurationMs= */ 10000, /* retainBackBufferFromKeyframe= */ true) + .build()) .build(); - // Prepare media fully to ensure we have all the segment data available. player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); + // Play media fully (with back buffer) to ensure we have all the segment data available. player.setMediaItem(MediaItem.fromUri("asset:///media/hls/multi-segment/playlist.m3u8")); player.prepare(); - TestPlayerRunHelper.runUntilIsLoading(player, true); - TestPlayerRunHelper.runUntilIsLoading(player, false); + player.play(); + TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); // Seek to beginning of second segment (at 500ms according to playlist) player.setSeekParameters(SeekParameters.PREVIOUS_SYNC); diff --git a/libraries/test_data/src/test/assets/playbackdumps/hls/multi-segment-with-seek.dump b/libraries/test_data/src/test/assets/playbackdumps/hls/multi-segment-with-seek.dump index 93f3369557..67c319336f 100644 --- a/libraries/test_data/src/test/assets/playbackdumps/hls/multi-segment-with-seek.dump +++ b/libraries/test_data/src/test/assets/playbackdumps/hls/multi-segment-with-seek.dump @@ -1,6 +1,6 @@ MediaCodecAdapter (exotest.audio.aac): inputBuffers: - count = 46 + count = 72 input buffer #0: timeUs = 1000000000000 contents = length 19, hash 1A6DF3F3 @@ -140,8 +140,87 @@ MediaCodecAdapter (exotest.audio.aac): timeUs = 0 flags = 4 contents = length 0, hash 1 + input buffer #46: + timeUs = 1000000464399 + contents = length 205, hash EAE6D6AD + input buffer #47: + timeUs = 1000000487619 + contents = length 226, hash BDD0EC44 + input buffer #48: + timeUs = 1000000510839 + contents = length 199, hash 60C719A2 + input buffer #49: + timeUs = 1000000534058 + contents = length 215, hash EDDE842F + input buffer #50: + timeUs = 1000000557278 + contents = length 201, hash D17187B + input buffer #51: + timeUs = 1000000580498 + contents = length 217, hash 58DD698C + input buffer #52: + timeUs = 1000000603718 + contents = length 202, hash 5168D405 + input buffer #53: + timeUs = 1000000626938 + contents = length 194, hash 7139AF8 + input buffer #54: + timeUs = 1000000650158 + contents = length 203, hash F775D9ED + input buffer #55: + timeUs = 1000000673378 + contents = length 200, hash 774C5045 + input buffer #56: + timeUs = 1000000696598 + contents = length 211, hash ED3C6FBC + input buffer #57: + timeUs = 1000000719818 + contents = length 205, hash FC4754A9 + input buffer #58: + timeUs = 1000000743038 + contents = length 216, hash 72F4AF29 + input buffer #59: + timeUs = 1000000766258 + contents = length 204, hash 1AF98D40 + input buffer #60: + timeUs = 1000000789478 + contents = length 200, hash E0004171 + input buffer #61: + timeUs = 1000000812698 + contents = length 215, hash B413079A + input buffer #62: + timeUs = 1000000835918 + contents = length 211, hash 107CEE52 + input buffer #63: + timeUs = 1000000859138 + contents = length 214, hash 1E588A0D + input buffer #64: + timeUs = 1000000882358 + contents = length 210, hash 84E5BBBD + input buffer #65: + timeUs = 1000000905578 + contents = length 211, hash 32D7ACAB + input buffer #66: + timeUs = 1000000928798 + contents = length 201, hash 1567F919 + input buffer #67: + timeUs = 1000000952018 + contents = length 196, hash 2F050463 + input buffer #68: + timeUs = 1000000975238 + contents = length 215, hash 4BDD9C81 + input buffer #69: + timeUs = 1000000998458 + contents = length 242, hash DD6FD967 + input buffer #70: + timeUs = 1000001021678 + contents = length 184, hash DAFC330D + input buffer #71: + timeUs = 0 + flags = 4 + contents = length 0, hash 1 outputBuffers: - count = 35 + count = 70 output buffer #0: timeUs = 1000000000000 size = 0 @@ -183,108 +262,248 @@ MediaCodecAdapter (exotest.audio.aac): size = 0 rendered = false output buffer #10: - timeUs = 1000000464399 + timeUs = 1000000232199 size = 0 rendered = false output buffer #11: - timeUs = 1000000487619 + timeUs = 1000000255419 size = 0 rendered = false output buffer #12: - timeUs = 1000000510839 + timeUs = 1000000278639 size = 0 rendered = false output buffer #13: - timeUs = 1000000534058 + timeUs = 1000000301859 size = 0 rendered = false output buffer #14: - timeUs = 1000000557278 + timeUs = 1000000325079 size = 0 rendered = false output buffer #15: - timeUs = 1000000580498 + timeUs = 1000000348299 size = 0 rendered = false output buffer #16: - timeUs = 1000000603718 + timeUs = 1000000371519 size = 0 rendered = false output buffer #17: - timeUs = 1000000626938 + timeUs = 1000000394739 size = 0 rendered = false output buffer #18: - timeUs = 1000000650158 + timeUs = 1000000417959 size = 0 rendered = false output buffer #19: - timeUs = 1000000673378 + timeUs = 1000000441179 size = 0 rendered = false output buffer #20: - timeUs = 1000000696598 + timeUs = 1000000464399 size = 0 rendered = false output buffer #21: - timeUs = 1000000719818 + timeUs = 1000000487619 size = 0 rendered = false output buffer #22: - timeUs = 1000000743038 + timeUs = 1000000510839 size = 0 rendered = false output buffer #23: - timeUs = 1000000766258 + timeUs = 1000000534058 size = 0 rendered = false output buffer #24: - timeUs = 1000000789478 + timeUs = 1000000557278 size = 0 rendered = false output buffer #25: - timeUs = 1000000812698 + timeUs = 1000000580498 size = 0 rendered = false output buffer #26: - timeUs = 1000000835918 + timeUs = 1000000603718 size = 0 rendered = false output buffer #27: - timeUs = 1000000859138 + timeUs = 1000000626938 size = 0 rendered = false output buffer #28: - timeUs = 1000000882358 + timeUs = 1000000650158 size = 0 rendered = false output buffer #29: - timeUs = 1000000905578 + timeUs = 1000000673378 size = 0 rendered = false output buffer #30: - timeUs = 1000000928798 + timeUs = 1000000696598 size = 0 rendered = false output buffer #31: - timeUs = 1000000952018 + timeUs = 1000000719818 size = 0 rendered = false output buffer #32: - timeUs = 1000000975238 + timeUs = 1000000743038 size = 0 rendered = false output buffer #33: - timeUs = 1000000998458 + timeUs = 1000000766258 size = 0 rendered = false output buffer #34: + timeUs = 1000000789478 + size = 0 + rendered = false + output buffer #35: + timeUs = 1000000812698 + size = 0 + rendered = false + output buffer #36: + timeUs = 1000000835918 + size = 0 + rendered = false + output buffer #37: + timeUs = 1000000859138 + size = 0 + rendered = false + output buffer #38: + timeUs = 1000000882358 + size = 0 + rendered = false + output buffer #39: + timeUs = 1000000905578 + size = 0 + rendered = false + output buffer #40: + timeUs = 1000000928798 + size = 0 + rendered = false + output buffer #41: + timeUs = 1000000952018 + size = 0 + rendered = false + output buffer #42: + timeUs = 1000000975238 + size = 0 + rendered = false + output buffer #43: + timeUs = 1000000998458 + size = 0 + rendered = false + output buffer #44: + timeUs = 1000001021678 + size = 0 + rendered = false + output buffer #45: + timeUs = 1000000464399 + size = 0 + rendered = false + output buffer #46: + timeUs = 1000000487619 + size = 0 + rendered = false + output buffer #47: + timeUs = 1000000510839 + size = 0 + rendered = false + output buffer #48: + timeUs = 1000000534058 + size = 0 + rendered = false + output buffer #49: + timeUs = 1000000557278 + size = 0 + rendered = false + output buffer #50: + timeUs = 1000000580498 + size = 0 + rendered = false + output buffer #51: + timeUs = 1000000603718 + size = 0 + rendered = false + output buffer #52: + timeUs = 1000000626938 + size = 0 + rendered = false + output buffer #53: + timeUs = 1000000650158 + size = 0 + rendered = false + output buffer #54: + timeUs = 1000000673378 + size = 0 + rendered = false + output buffer #55: + timeUs = 1000000696598 + size = 0 + rendered = false + output buffer #56: + timeUs = 1000000719818 + size = 0 + rendered = false + output buffer #57: + timeUs = 1000000743038 + size = 0 + rendered = false + output buffer #58: + timeUs = 1000000766258 + size = 0 + rendered = false + output buffer #59: + timeUs = 1000000789478 + size = 0 + rendered = false + output buffer #60: + timeUs = 1000000812698 + size = 0 + rendered = false + output buffer #61: + timeUs = 1000000835918 + size = 0 + rendered = false + output buffer #62: + timeUs = 1000000859138 + size = 0 + rendered = false + output buffer #63: + timeUs = 1000000882358 + size = 0 + rendered = false + output buffer #64: + timeUs = 1000000905578 + size = 0 + rendered = false + output buffer #65: + timeUs = 1000000928798 + size = 0 + rendered = false + output buffer #66: + timeUs = 1000000952018 + size = 0 + rendered = false + output buffer #67: + timeUs = 1000000975238 + size = 0 + rendered = false + output buffer #68: + timeUs = 1000000998458 + size = 0 + rendered = false + output buffer #69: timeUs = 1000001021678 size = 0 rendered = false MediaCodecAdapter (exotest.video.hevc): inputBuffers: - count = 27 + count = 47 input buffer #0: timeUs = 1000000000000 contents = length 29543, hash BE95CDE4 @@ -319,122 +538,299 @@ MediaCodecAdapter (exotest.video.hevc): timeUs = 1000000333666 contents = length 13358, hash 2F60BF6A input buffer #11: + timeUs = 1000000367033 + contents = length 13357, hash 522A8F9B + input buffer #12: + timeUs = 1000000400400 + contents = length 13232, hash 8ADFF6BA + input buffer #13: + timeUs = 1000000433766 + contents = length 13303, hash A716B1AA + input buffer #14: + timeUs = 1000000467133 + contents = length 13136, hash A9E26FF8 + input buffer #15: timeUs = 1000000500500 contents = length 13268, hash DDD99C4E - input buffer #12: + input buffer #16: timeUs = 1000000533866 contents = length 13229, hash 820FEB22 - input buffer #13: + input buffer #17: timeUs = 1000000567233 contents = length 13280, hash B4EA1751 - input buffer #14: + input buffer #18: timeUs = 1000000600600 contents = length 13143, hash 17CDA4C5 - input buffer #15: + input buffer #19: timeUs = 1000000633966 contents = length 13174, hash 7A0EDAED - input buffer #16: + input buffer #20: timeUs = 1000000667333 contents = length 13198, hash 9BE6A4F3 - input buffer #17: + input buffer #21: timeUs = 1000000700700 contents = length 13156, hash 8AACA88D - input buffer #18: + input buffer #22: timeUs = 1000000734066 contents = length 13130, hash 532EEB71 - input buffer #19: + input buffer #23: timeUs = 1000000767433 contents = length 13085, hash 25097DC9 - input buffer #20: + input buffer #24: timeUs = 1000000800800 contents = length 13156, hash 80FDD182 - input buffer #21: + input buffer #25: timeUs = 1000000834166 contents = length 13240, hash 80F8D5F1 - input buffer #22: + input buffer #26: timeUs = 1000000867533 contents = length 13162, hash 6F038C32 - input buffer #23: + input buffer #27: timeUs = 1000000900900 contents = length 13121, hash 340CD8C8 - input buffer #24: + input buffer #28: timeUs = 1000000934266 contents = length 13140, hash 9B1B6207 - input buffer #25: + input buffer #29: timeUs = 1000000967633 contents = length 13141, hash 74333A72 - input buffer #26: + input buffer #30: + timeUs = 0 + flags = 4 + contents = length 0, hash 1 + input buffer #31: + timeUs = 1000000500500 + contents = length 13268, hash DDD99C4E + input buffer #32: + timeUs = 1000000533866 + contents = length 13229, hash 820FEB22 + input buffer #33: + timeUs = 1000000567233 + contents = length 13280, hash B4EA1751 + input buffer #34: + timeUs = 1000000600600 + contents = length 13143, hash 17CDA4C5 + input buffer #35: + timeUs = 1000000633966 + contents = length 13174, hash 7A0EDAED + input buffer #36: + timeUs = 1000000667333 + contents = length 13198, hash 9BE6A4F3 + input buffer #37: + timeUs = 1000000700700 + contents = length 13156, hash 8AACA88D + input buffer #38: + timeUs = 1000000734066 + contents = length 13130, hash 532EEB71 + input buffer #39: + timeUs = 1000000767433 + contents = length 13085, hash 25097DC9 + input buffer #40: + timeUs = 1000000800800 + contents = length 13156, hash 80FDD182 + input buffer #41: + timeUs = 1000000834166 + contents = length 13240, hash 80F8D5F1 + input buffer #42: + timeUs = 1000000867533 + contents = length 13162, hash 6F038C32 + input buffer #43: + timeUs = 1000000900900 + contents = length 13121, hash 340CD8C8 + input buffer #44: + timeUs = 1000000934266 + contents = length 13140, hash 9B1B6207 + input buffer #45: + timeUs = 1000000967633 + contents = length 13141, hash 74333A72 + input buffer #46: timeUs = 0 flags = 4 contents = length 0, hash 1 outputBuffers: - count = 16 + count = 45 output buffer #0: timeUs = 1000000000000 size = 29543 rendered = true output buffer #1: + timeUs = 1000000033366 + size = 13331 + rendered = true + output buffer #2: + timeUs = 1000000066733 + size = 13421 + rendered = true + output buffer #3: + timeUs = 1000000100100 + size = 13246 + rendered = true + output buffer #4: + timeUs = 1000000133466 + size = 13222 + rendered = true + output buffer #5: + timeUs = 1000000166833 + size = 13347 + rendered = true + output buffer #6: + timeUs = 1000000200200 + size = 13297 + rendered = true + output buffer #7: + timeUs = 1000000233566 + size = 13230 + rendered = true + output buffer #8: + timeUs = 1000000266933 + size = 13352 + rendered = true + output buffer #9: + timeUs = 1000000300300 + size = 13325 + rendered = true + output buffer #10: + timeUs = 1000000333666 + size = 13358 + rendered = true + output buffer #11: + timeUs = 1000000367033 + size = 13357 + rendered = true + output buffer #12: + timeUs = 1000000400400 + size = 13232 + rendered = true + output buffer #13: + timeUs = 1000000433766 + size = 13303 + rendered = true + output buffer #14: + timeUs = 1000000467133 + size = 13136 + rendered = true + output buffer #15: timeUs = 1000000500500 size = 13268 rendered = true - output buffer #2: + output buffer #16: timeUs = 1000000533866 size = 13229 rendered = true - output buffer #3: + output buffer #17: timeUs = 1000000567233 size = 13280 rendered = true - output buffer #4: + output buffer #18: timeUs = 1000000600600 size = 13143 rendered = true - output buffer #5: + output buffer #19: timeUs = 1000000633966 size = 13174 rendered = true - output buffer #6: + output buffer #20: timeUs = 1000000667333 size = 13198 rendered = true - output buffer #7: + output buffer #21: timeUs = 1000000700700 size = 13156 rendered = true - output buffer #8: + output buffer #22: timeUs = 1000000734066 size = 13130 rendered = true - output buffer #9: + output buffer #23: timeUs = 1000000767433 size = 13085 rendered = true - output buffer #10: + output buffer #24: timeUs = 1000000800800 size = 13156 rendered = true - output buffer #11: + output buffer #25: timeUs = 1000000834166 size = 13240 rendered = true - output buffer #12: + output buffer #26: timeUs = 1000000867533 size = 13162 rendered = true - output buffer #13: + output buffer #27: timeUs = 1000000900900 size = 13121 rendered = true - output buffer #14: + output buffer #28: timeUs = 1000000934266 size = 13140 rendered = true - output buffer #15: + output buffer #29: + timeUs = 1000000967633 + size = 13141 + rendered = true + output buffer #30: + timeUs = 1000000500500 + size = 13268 + rendered = true + output buffer #31: + timeUs = 1000000533866 + size = 13229 + rendered = true + output buffer #32: + timeUs = 1000000567233 + size = 13280 + rendered = true + output buffer #33: + timeUs = 1000000600600 + size = 13143 + rendered = true + output buffer #34: + timeUs = 1000000633966 + size = 13174 + rendered = true + output buffer #35: + timeUs = 1000000667333 + size = 13198 + rendered = true + output buffer #36: + timeUs = 1000000700700 + size = 13156 + rendered = true + output buffer #37: + timeUs = 1000000734066 + size = 13130 + rendered = true + output buffer #38: + timeUs = 1000000767433 + size = 13085 + rendered = true + output buffer #39: + timeUs = 1000000800800 + size = 13156 + rendered = true + output buffer #40: + timeUs = 1000000834166 + size = 13240 + rendered = true + output buffer #41: + timeUs = 1000000867533 + size = 13162 + rendered = true + output buffer #42: + timeUs = 1000000900900 + size = 13121 + rendered = true + output buffer #43: + timeUs = 1000000934266 + size = 13140 + rendered = true + output buffer #44: timeUs = 1000000967633 size = 13141 rendered = true AudioSink: - buffer count = 33 + buffer count = 68 config: pcmEncoding = 2 channelCount = 1 @@ -469,74 +865,179 @@ AudioSink: buffer #9: time = 1000000208979 data = 1 - discontinuity: - discontinuity: buffer #10: - time = 1000000510839 + time = 1000000232199 data = 1 buffer #11: - time = 1000000534058 + time = 1000000255419 data = 1 buffer #12: - time = 1000000557278 + time = 1000000278639 data = 1 buffer #13: - time = 1000000580498 + time = 1000000301859 data = 1 buffer #14: - time = 1000000603718 + time = 1000000325079 data = 1 buffer #15: - time = 1000000626938 + time = 1000000348299 data = 1 buffer #16: - time = 1000000650158 + time = 1000000371519 data = 1 buffer #17: - time = 1000000673378 + time = 1000000394739 data = 1 buffer #18: - time = 1000000696598 + time = 1000000417959 data = 1 buffer #19: - time = 1000000719818 + time = 1000000441179 data = 1 buffer #20: - time = 1000000743038 + time = 1000000464399 data = 1 buffer #21: - time = 1000000766258 + time = 1000000487619 data = 1 buffer #22: - time = 1000000789478 + time = 1000000510839 data = 1 buffer #23: - time = 1000000812698 + time = 1000000534058 data = 1 buffer #24: - time = 1000000835918 + time = 1000000557278 data = 1 buffer #25: - time = 1000000859138 + time = 1000000580498 data = 1 buffer #26: - time = 1000000882358 + time = 1000000603718 data = 1 buffer #27: - time = 1000000905578 + time = 1000000626938 data = 1 buffer #28: - time = 1000000928798 + time = 1000000650158 data = 1 buffer #29: - time = 1000000952018 + time = 1000000673378 data = 1 buffer #30: - time = 1000000975238 + time = 1000000696598 data = 1 buffer #31: - time = 1000000998458 + time = 1000000719818 data = 1 buffer #32: + time = 1000000743038 + data = 1 + buffer #33: + time = 1000000766258 + data = 1 + buffer #34: + time = 1000000789478 + data = 1 + buffer #35: + time = 1000000812698 + data = 1 + buffer #36: + time = 1000000835918 + data = 1 + buffer #37: + time = 1000000859138 + data = 1 + buffer #38: + time = 1000000882358 + data = 1 + buffer #39: + time = 1000000905578 + data = 1 + buffer #40: + time = 1000000928798 + data = 1 + buffer #41: + time = 1000000952018 + data = 1 + buffer #42: + time = 1000000975238 + data = 1 + buffer #43: + time = 1000000998458 + data = 1 + buffer #44: + time = 1000001021678 + data = 1 + discontinuity: + discontinuity: + buffer #45: + time = 1000000510839 + data = 1 + buffer #46: + time = 1000000534058 + data = 1 + buffer #47: + time = 1000000557278 + data = 1 + buffer #48: + time = 1000000580498 + data = 1 + buffer #49: + time = 1000000603718 + data = 1 + buffer #50: + time = 1000000626938 + data = 1 + buffer #51: + time = 1000000650158 + data = 1 + buffer #52: + time = 1000000673378 + data = 1 + buffer #53: + time = 1000000696598 + data = 1 + buffer #54: + time = 1000000719818 + data = 1 + buffer #55: + time = 1000000743038 + data = 1 + buffer #56: + time = 1000000766258 + data = 1 + buffer #57: + time = 1000000789478 + data = 1 + buffer #58: + time = 1000000812698 + data = 1 + buffer #59: + time = 1000000835918 + data = 1 + buffer #60: + time = 1000000859138 + data = 1 + buffer #61: + time = 1000000882358 + data = 1 + buffer #62: + time = 1000000905578 + data = 1 + buffer #63: + time = 1000000928798 + data = 1 + buffer #64: + time = 1000000952018 + data = 1 + buffer #65: + time = 1000000975238 + data = 1 + buffer #66: + time = 1000000998458 + data = 1 + buffer #67: time = 1000001021678 data = 1