Introduce an offload option to DefaultRederersFactory

This introduces an option to turn on offload in the
audio sink.

#exo-offload

PiperOrigin-RevId: 314907088
This commit is contained in:
krocard 2020-06-05 12:48:52 +01:00 committed by Oliver Woodman
parent 97a80ac624
commit 8dedbbbfb4

View file

@ -24,6 +24,7 @@ import com.google.android.exoplayer2.audio.AudioCapabilities;
import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink;
import com.google.android.exoplayer2.audio.DefaultAudioSink.DefaultAudioProcessorChain;
import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
@ -90,6 +91,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
private boolean enableDecoderFallback; private boolean enableDecoderFallback;
private MediaCodecSelector mediaCodecSelector; private MediaCodecSelector mediaCodecSelector;
private @MediaCodecRenderer.MediaCodecOperationMode int mediaCodecOperationMode; private @MediaCodecRenderer.MediaCodecOperationMode int mediaCodecOperationMode;
private boolean enableOffload;
/** @param context A {@link Context}. */ /** @param context A {@link Context}. */
public DefaultRenderersFactory(Context context) { public DefaultRenderersFactory(Context context) {
@ -183,6 +185,20 @@ public class DefaultRenderersFactory implements RenderersFactory {
return this; return this;
} }
/**
* Sets whether audio should be played using the offload path. Audio offload disables audio
* processors (for example speed adjustment).
*
* <p>The default value is {@code false}.
*
* @param enableOffload If audio offload should be used.
* @return This factory, for convenience.
*/
public DefaultRenderersFactory setEnableAudioOffload(boolean enableOffload) {
this.enableOffload = enableOffload;
return this;
}
/** /**
* Sets the maximum duration for which video renderers can attempt to seamlessly join an ongoing * Sets the maximum duration for which video renderers can attempt to seamlessly join an ongoing
* playback. * playback.
@ -223,6 +239,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
buildAudioProcessors(), buildAudioProcessors(),
eventHandler, eventHandler,
audioRendererEventListener, audioRendererEventListener,
enableOffload,
renderersList); renderersList);
buildTextRenderers(context, textRendererOutput, eventHandler.getLooper(), buildTextRenderers(context, textRendererOutput, eventHandler.getLooper(),
extensionRendererMode, renderersList); extensionRendererMode, renderersList);
@ -373,6 +390,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
* before output. May be empty. * before output. May be empty.
* @param eventHandler A handler to use when invoking event listeners and outputs. * @param eventHandler A handler to use when invoking event listeners and outputs.
* @param eventListener An event listener. * @param eventListener An event listener.
* @param enableOffload If the renderer should use audio offload for all supported formats.
* @param out An array to which the built renderers should be appended. * @param out An array to which the built renderers should be appended.
*/ */
protected void buildAudioRenderers( protected void buildAudioRenderers(
@ -383,6 +401,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
AudioProcessor[] audioProcessors, AudioProcessor[] audioProcessors,
Handler eventHandler, Handler eventHandler,
AudioRendererEventListener eventListener, AudioRendererEventListener eventListener,
boolean enableOffload,
ArrayList<Renderer> out) { ArrayList<Renderer> out) {
MediaCodecAudioRenderer audioRenderer = MediaCodecAudioRenderer audioRenderer =
new MediaCodecAudioRenderer( new MediaCodecAudioRenderer(
@ -391,7 +410,11 @@ public class DefaultRenderersFactory implements RenderersFactory {
enableDecoderFallback, enableDecoderFallback,
eventHandler, eventHandler,
eventListener, eventListener,
new DefaultAudioSink(AudioCapabilities.getCapabilities(context), audioProcessors)); new DefaultAudioSink(
AudioCapabilities.getCapabilities(context),
new DefaultAudioProcessorChain(audioProcessors),
/* enableFloatOutput= */ false,
enableOffload));
audioRenderer.experimental_setMediaCodecOperationMode(mediaCodecOperationMode); audioRenderer.experimental_setMediaCodecOperationMode(mediaCodecOperationMode);
out.add(audioRenderer); out.add(audioRenderer);