diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java index df66adc42e..8255dfd23e 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java @@ -421,7 +421,8 @@ public class ExoPlayerTest { throws Exception { Timeline timeline = new FakeTimeline(/* windowCount= */ 1); ExoPlayer player = parameterizeTestExoPlayerBuilder(new TestExoPlayerBuilder(context)).build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 0))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 0)); + player.setVideoSurface(surface); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); AnalyticsListener mockAnalyticsListener = mock(AnalyticsListener.class); @@ -451,6 +452,7 @@ public class ExoPlayerTest { runUntilPlaybackState(player, Player.STATE_ENDED); videoSizesFromGetter.add(player.getVideoSize()); player.release(); + surface.release(); ShadowLooper.runMainLooperToNextTask(); InOrder playerListenerOrder = inOrder(mockPlayerListener); diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSourceTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSourceTest.java index 85b1f006d3..a3501c03fd 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSourceTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSourceTest.java @@ -411,7 +411,8 @@ public final class ServerSideAdInsertionMediaSourceTest { new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); AdPlaybackState adPlaybackState = new AdPlaybackState(/* adsId= */ new Object()); @@ -458,6 +459,7 @@ public final class ServerSideAdInsertionMediaSourceTest { player.play(); runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); // Assert all samples have been played. DumpFileAsserts.assertOutput( @@ -484,7 +486,8 @@ public final class ServerSideAdInsertionMediaSourceTest { new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); AdPlaybackState firstAdPlaybackState = @@ -535,6 +538,7 @@ public final class ServerSideAdInsertionMediaSourceTest { player.play(); runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); // Assert all samples have been played. DumpFileAsserts.assertOutput( @@ -563,7 +567,8 @@ public final class ServerSideAdInsertionMediaSourceTest { new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); AdPlaybackState firstAdPlaybackState = @@ -614,6 +619,7 @@ public final class ServerSideAdInsertionMediaSourceTest { player.play(); runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); // Assert all samples have been played. DumpFileAsserts.assertOutput( @@ -637,7 +643,8 @@ public final class ServerSideAdInsertionMediaSourceTest { Context context = ApplicationProvider.getApplicationContext(); ExoPlayer player = new ExoPlayer.Builder(context).setClock(new FakeClock(/* isAutoAdvancing= */ true)).build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); AdPlaybackState adPlaybackState = new AdPlaybackState(/* adsId= */ new Object()); adPlaybackState = @@ -689,6 +696,7 @@ public final class ServerSideAdInsertionMediaSourceTest { player.play(); runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); // Assert playback has been reported with ads: [ad0][content] seek [ad1][content][ad2][content] // 6*2(audio+video) format changes, 4 auto-transitions between parts, 1 seek with adjustment. diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java index 2b51c5e164..30e88af886 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/e2etest/DashPlaybackTest.java @@ -75,7 +75,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); // Ensure the subtitle track is selected. @@ -87,6 +88,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/standalone-webvtt.dump"); @@ -183,7 +185,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); // Ensure the subtitle track is selected. @@ -195,6 +198,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/standalone-ttml.dump"); @@ -210,7 +214,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); // Ensure the subtitle track is selected. @@ -222,6 +227,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/webvtt-in-mp4.dump"); @@ -236,7 +242,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); // Ensure the subtitle track is selected. @@ -248,6 +255,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/ttml-in-mp4.dump"); @@ -351,7 +359,8 @@ public final class DashPlaybackTest { .experimentalParseSubtitlesDuringExtraction(false)) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); // Ensure the subtitle track is selected. @@ -363,6 +372,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/cea608.dump"); @@ -387,7 +397,8 @@ public final class DashPlaybackTest { .experimentalParseSubtitlesDuringExtraction(true)) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); // Ensure the subtitle track is selected. @@ -399,6 +410,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/cea608.dump"); @@ -414,7 +426,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/emsg/sample.mpd")); @@ -422,6 +435,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/emsg.dump"); @@ -441,7 +455,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); @@ -451,6 +466,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.playUntilPosition(player, /* mediaItemIndex= */ 0, /* positionMs= */ 500); player.release(); + surface.release(); // Ensure output contains metadata up to the playback position. DumpFileAsserts.assertOutput( @@ -477,7 +493,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); @@ -487,6 +504,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.playUntilPosition(player, /* mediaItemIndex= */ 0, /* positionMs= */ 500); player.release(); + surface.release(); // Ensure output contains all metadata irrespective of the playback position. DumpFileAsserts.assertOutput( @@ -617,7 +635,8 @@ public final class DashPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem( @@ -626,6 +645,7 @@ public final class DashPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/dash/multi-period-with-offset.dump"); 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 f142f5a538..cc4cb8b16b 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 @@ -68,7 +68,8 @@ public final class HlsPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem( @@ -77,6 +78,7 @@ public final class HlsPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/hls/standalone-webvtt.dump"); @@ -166,7 +168,8 @@ public final class HlsPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem( @@ -175,6 +178,7 @@ public final class HlsPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/hls/ttml-in-mp4.dump"); @@ -272,7 +276,8 @@ public final class HlsPlaybackTest { .experimentalParseSubtitlesDuringExtraction(false)) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8")); @@ -280,6 +285,7 @@ public final class HlsPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/hls/cea608.dump"); @@ -304,7 +310,8 @@ public final class HlsPlaybackTest { .experimentalParseSubtitlesDuringExtraction(true)) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8")); @@ -312,6 +319,7 @@ public final class HlsPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); DumpFileAsserts.assertOutput( applicationContext, playbackOutput, "playbackdumps/hls/cea608.dump"); @@ -332,7 +340,8 @@ public final class HlsPlaybackTest { /* backBufferDurationMs= */ 10000, /* retainBackBufferFromKeyframe= */ true) .build()) .build(); - player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + Surface surface = new Surface(new SurfaceTexture(/* texName= */ 1)); + player.setVideoSurface(surface); 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")); @@ -346,6 +355,7 @@ public final class HlsPlaybackTest { player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); player.release(); + surface.release(); // Output only starts at 550ms (the first sample in the second segment) DumpFileAsserts.assertOutput(