From cc7684d09f0a66de0e501882da668cdd35504752 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 4 Oct 2018 06:56:29 -0700 Subject: [PATCH] Introduce Renderer.reset - It's a no-op for now - Renderers that want to support retaining resources will move some functionality from their disable() implementations into reset() - ExoPlayerImplInternal will be updated to not always call reset() immediately after disable(), which is what will enable resources to actually be retained. Issue: #2826 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=215729783 --- .../android/exoplayer2/BaseRenderer.java | 15 +++++++++++++++ .../exoplayer2/ExoPlayerImplInternal.java | 1 + .../android/exoplayer2/NoSampleRenderer.java | 15 +++++++++++++++ .../google/android/exoplayer2/Renderer.java | 18 +++++++++++++++--- .../video/spherical/CameraMotionRenderer.java | 6 +++--- .../audio/SimpleDecoderAudioRendererTest.java | 1 + 6 files changed, 50 insertions(+), 6 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index 51e724bee1..73602d85aa 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -153,6 +153,12 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { onDisabled(); } + @Override + public final void reset() { + Assertions.checkState(state == STATE_DISABLED); + onReset(); + } + // RendererCapabilities implementation. @Override @@ -247,6 +253,15 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { // Do nothing. } + /** + * Called when the renderer is reset. + * + *

The default implementation is a no-op. + */ + protected void onReset() { + // Do nothing. + } + // Methods to be called by subclasses. /** Returns the formats of the currently enabled stream. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 40716c14c0..891ea48108 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -989,6 +989,7 @@ import java.util.Collections; mediaClock.onRendererDisabled(renderer); ensureStopped(renderer); renderer.disable(); + renderer.reset(); } private void reselectTracksInternal() throws ExoPlaybackException { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java index 45d6537b84..6645850d3b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java @@ -158,6 +158,12 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities onDisabled(); } + @Override + public final void reset() { + Assertions.checkState(state == STATE_DISABLED); + onReset(); + } + @Override public boolean isReady() { return true; @@ -260,6 +266,15 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities // Do nothing. } + /** + * Called when the renderer is reset. + * + *

The default implementation is a no-op. + */ + protected void onReset() { + // Do nothing. + } + // Methods to be called by subclasses. /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index c6456e5f7f..1d4d587aeb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -44,12 +44,16 @@ public interface Renderer extends PlayerMessage.Target { @IntDef({STATE_DISABLED, STATE_ENABLED, STATE_STARTED}) @interface State {} /** - * The renderer is disabled. + * The renderer is disabled. A renderer in this state may hold resources that it requires for + * rendering (e.g. media decoders), for use if it's subsequently enabled. {@link #reset()} can be + * called to force the renderer to release these resources. */ int STATE_DISABLED = 0; /** - * The renderer is enabled but not started. A renderer in this state is not actively rendering - * media, but will typically hold resources that it requires for rendering (e.g. media decoders). + * The renderer is enabled but not started. A renderer in this state may render media at the + * current position (e.g. an initial video frame), but the position will not advance. A renderer + * in this state will typically hold resources that it requires for rendering (e.g. media + * decoders). */ int STATE_ENABLED = 1; /** @@ -279,4 +283,12 @@ public interface Renderer extends PlayerMessage.Target { */ void disable(); + /** + * Forces the renderer to give up any resources (e.g. media decoders) that it may be holding. If + * the renderer is not holding any resources, the call is a no-op. + * + *

This method may be called when the renderer is in the following states: {@link + * #STATE_DISABLED}. + */ + void reset(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java index 4a8354d17f..663c9fe284 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java @@ -72,12 +72,12 @@ public class CameraMotionRenderer extends BaseRenderer { @Override protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException { - reset(); + resetListener(); } @Override protected void onDisabled() { - reset(); + resetListener(); } @Override @@ -124,7 +124,7 @@ public class CameraMotionRenderer extends BaseRenderer { return result; } - private void reset() { + private void resetListener() { lastTimestampUs = 0; if (listener != null) { listener.onCameraMotionReset(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRendererTest.java index 8dc60a15a4..48e71c619c 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRendererTest.java @@ -103,6 +103,7 @@ public class SimpleDecoderAudioRendererTest { } verify(mockAudioSink, times(1)).playToEndOfStream(); audioRenderer.disable(); + audioRenderer.reset(); verify(mockAudioSink, times(1)).release(); }