Commit 97206b9c by krocard Committed by Ian Baker

Add a builder to `DefaultAudioSink`

`DefaultAudioSink` already has 3 telescoping
constructors and an other one would be have been
needed to add a buffer size tuning option.

PiperOrigin-RevId: 414703366
parent 0f48dfc9
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
targeting Android 12, and will crash with an `IllegalArgumentException` targeting Android 12, and will crash with an `IllegalArgumentException`
when creating `PendingIntent`s when creating `PendingIntent`s
([#9528](https://github.com/google/ExoPlayer/issues/9528)). ([#9528](https://github.com/google/ExoPlayer/issues/9528)).
* Audio:
* Add a `Builder` to `DefaultAudioSink` and deprecate the existing
constructors.
* Extractors: * Extractors:
* Fix inconsistency with spec in H.265 SPS nal units parsing * Fix inconsistency with spec in H.265 SPS nal units parsing
((#9719)[https://github.com/google/ExoPlayer/issues/9719]). ((#9719)[https://github.com/google/ExoPlayer/issues/9719]).
......
...@@ -64,7 +64,7 @@ public final class FfmpegAudioRenderer extends DecoderAudioRenderer<FfmpegAudioD ...@@ -64,7 +64,7 @@ public final class FfmpegAudioRenderer extends DecoderAudioRenderer<FfmpegAudioD
this( this(
eventHandler, eventHandler,
eventListener, eventListener,
new DefaultAudioSink(/* audioCapabilities= */ null, audioProcessors)); new DefaultAudioSink.Builder().setAudioProcessors(audioProcessors).build());
} }
/** /**
......
...@@ -29,7 +29,6 @@ import com.google.android.exoplayer2.PlaybackException; ...@@ -29,7 +29,6 @@ import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink;
import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink;
import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor;
...@@ -67,9 +66,7 @@ public class FlacPlaybackTest { ...@@ -67,9 +66,7 @@ public class FlacPlaybackTest {
} }
private static void playAndAssertAudioSinkInput(String fileName) throws Exception { private static void playAndAssertAudioSinkInput(String fileName) throws Exception {
CapturingAudioSink audioSink = CapturingAudioSink audioSink = new CapturingAudioSink(new DefaultAudioSink.Builder().build());
new CapturingAudioSink(
new DefaultAudioSink(/* audioCapabilities= */ null, new AudioProcessor[0]));
TestPlaybackRunnable testPlaybackRunnable = TestPlaybackRunnable testPlaybackRunnable =
new TestPlaybackRunnable( new TestPlaybackRunnable(
......
...@@ -47,6 +47,7 @@ dependencies { ...@@ -47,6 +47,7 @@ dependencies {
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion
compileOnly 'com.google.errorprone:error_prone_annotations:' + errorProneVersion
androidTestImplementation 'androidx.test:runner:' + androidxTestRunnerVersion androidTestImplementation 'androidx.test:runner:' + androidxTestRunnerVersion
androidTestImplementation 'com.linkedin.dexmaker:dexmaker:' + dexmakerVersion androidTestImplementation 'com.linkedin.dexmaker:dexmaker:' + dexmakerVersion
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:' + dexmakerVersion androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:' + dexmakerVersion
......
...@@ -26,7 +26,6 @@ import com.google.android.exoplayer2.audio.AudioCapabilities; ...@@ -26,7 +26,6 @@ import com.google.android.exoplayer2.audio.AudioCapabilities;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink;
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.DefaultMediaCodecAdapterFactory; import com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory;
import com.google.android.exoplayer2.mediacodec.MediaCodecAdapter; import com.google.android.exoplayer2.mediacodec.MediaCodecAdapter;
...@@ -666,14 +665,15 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -666,14 +665,15 @@ public class DefaultRenderersFactory implements RenderersFactory {
boolean enableFloatOutput, boolean enableFloatOutput,
boolean enableAudioTrackPlaybackParams, boolean enableAudioTrackPlaybackParams,
boolean enableOffload) { boolean enableOffload) {
return new DefaultAudioSink( return new DefaultAudioSink.Builder()
AudioCapabilities.getCapabilities(context), .setAudioCapabilities(AudioCapabilities.getCapabilities(context))
new DefaultAudioProcessorChain(), .setEnableFloatOutput(enableFloatOutput)
enableFloatOutput, .setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
enableAudioTrackPlaybackParams, .setOffloadMode(
enableOffload enableOffload
? DefaultAudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED ? DefaultAudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
: DefaultAudioSink.OFFLOAD_MODE_DISABLED); : DefaultAudioSink.OFFLOAD_MODE_DISABLED)
.build();
} }
/** /**
......
...@@ -33,7 +33,6 @@ import androidx.annotation.VisibleForTesting; ...@@ -33,7 +33,6 @@ import androidx.annotation.VisibleForTesting;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.analytics.AnalyticsListener;
import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.audio.AudioCapabilities;
import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink;
import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.AuxEffectInfo;
import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink;
...@@ -1492,8 +1491,7 @@ public interface ExoPlayer extends Player { ...@@ -1492,8 +1491,7 @@ public interface ExoPlayer extends Player {
* <ul> * <ul>
* <li>Audio offload rendering is enabled in {@link * <li>Audio offload rendering is enabled in {@link
* DefaultRenderersFactory#setEnableAudioOffload} or the equivalent option passed to {@link * DefaultRenderersFactory#setEnableAudioOffload} or the equivalent option passed to {@link
* DefaultAudioSink#DefaultAudioSink(AudioCapabilities, * DefaultAudioSink.Builder#setOffloadMode}.
* DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)}.
* <li>An audio track is playing in a format that the device supports offloading (for example, * <li>An audio track is playing in a format that the device supports offloading (for example,
* MP3 or AAC). * MP3 or AAC).
* <li>The {@link AudioSink} is playing with an offload {@link AudioTrack}. * <li>The {@link AudioSink} is playing with an offload {@link AudioTrack}.
......
...@@ -54,6 +54,7 @@ import com.google.android.exoplayer2.util.MediaClock; ...@@ -54,6 +54,7 @@ import com.google.android.exoplayer2.util.MediaClock;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.TraceUtil;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.common.base.MoreObjects;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
...@@ -171,7 +172,15 @@ public abstract class DecoderAudioRenderer< ...@@ -171,7 +172,15 @@ public abstract class DecoderAudioRenderer<
@Nullable AudioRendererEventListener eventListener, @Nullable AudioRendererEventListener eventListener,
@Nullable AudioCapabilities audioCapabilities, @Nullable AudioCapabilities audioCapabilities,
AudioProcessor... audioProcessors) { AudioProcessor... audioProcessors) {
this(eventHandler, eventListener, new DefaultAudioSink(audioCapabilities, audioProcessors)); this(
eventHandler,
eventListener,
new DefaultAudioSink.Builder()
.setAudioCapabilities(
MoreObjects.firstNonNull(
audioCapabilities, AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES))
.setAudioProcessors(audioProcessors)
.build());
} }
/** /**
......
...@@ -155,7 +155,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media ...@@ -155,7 +155,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
mediaCodecSelector, mediaCodecSelector,
eventHandler, eventHandler,
eventListener, eventListener,
new DefaultAudioSink(audioCapabilities, audioProcessors)); new DefaultAudioSink.Builder()
.setAudioCapabilities(audioCapabilities)
.setAudioProcessors(audioProcessors)
.build());
} }
/** /**
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.audio; package com.google.android.exoplayer2.audio;
import static com.google.android.exoplayer2.audio.AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES;
import static com.google.android.exoplayer2.audio.AudioSink.CURRENT_POSITION_NOT_SET; import static com.google.android.exoplayer2.audio.AudioSink.CURRENT_POSITION_NOT_SET;
import static com.google.android.exoplayer2.audio.AudioSink.SINK_FORMAT_SUPPORTED_DIRECTLY; import static com.google.android.exoplayer2.audio.AudioSink.SINK_FORMAT_SUPPORTED_DIRECTLY;
import static com.google.android.exoplayer2.audio.AudioSink.SINK_FORMAT_SUPPORTED_WITH_TRANSCODING; import static com.google.android.exoplayer2.audio.AudioSink.SINK_FORMAT_SUPPORTED_WITH_TRANSCODING;
...@@ -24,6 +25,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; ...@@ -24,6 +25,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.audio.DefaultAudioSink.DefaultAudioProcessorChain;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
...@@ -37,7 +39,6 @@ import org.robolectric.annotation.Config; ...@@ -37,7 +39,6 @@ import org.robolectric.annotation.Config;
/** Unit tests for {@link DefaultAudioSink}. */ /** Unit tests for {@link DefaultAudioSink}. */
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public final class DefaultAudioSinkTest { public final class DefaultAudioSinkTest {
private static final int CHANNEL_COUNT_MONO = 1; private static final int CHANNEL_COUNT_MONO = 1;
private static final int CHANNEL_COUNT_STEREO = 2; private static final int CHANNEL_COUNT_STEREO = 2;
private static final int BYTES_PER_FRAME_16_BIT = 2; private static final int BYTES_PER_FRAME_16_BIT = 2;
...@@ -59,19 +60,20 @@ public final class DefaultAudioSinkTest { ...@@ -59,19 +60,20 @@ public final class DefaultAudioSinkTest {
arrayAudioBufferSink = new ArrayAudioBufferSink(); arrayAudioBufferSink = new ArrayAudioBufferSink();
TeeAudioProcessor teeAudioProcessor = new TeeAudioProcessor(arrayAudioBufferSink); TeeAudioProcessor teeAudioProcessor = new TeeAudioProcessor(arrayAudioBufferSink);
defaultAudioSink = defaultAudioSink =
new DefaultAudioSink( new DefaultAudioSink.Builder()
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES, .setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
new DefaultAudioSink.DefaultAudioProcessorChain(teeAudioProcessor), .setAudioProcessorChain(new DefaultAudioProcessorChain(teeAudioProcessor))
/* enableFloatOutput= */ false, .setOffloadMode(DefaultAudioSink.OFFLOAD_MODE_DISABLED)
/* enableAudioTrackPlaybackParams= */ false, .build();
DefaultAudioSink.OFFLOAD_MODE_DISABLED);
} }
@Test @Test
public void handlesSpecializedAudioProcessorArray() { public void handlesSpecializedAudioProcessorArray() {
defaultAudioSink = defaultAudioSink =
new DefaultAudioSink( new DefaultAudioSink.Builder()
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES, new TeeAudioProcessor[0]); .setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
.setAudioProcessors(new TeeAudioProcessor[0])
.build();
} }
@Test @Test
...@@ -203,10 +205,7 @@ public final class DefaultAudioSinkTest { ...@@ -203,10 +205,7 @@ public final class DefaultAudioSinkTest {
@Test @Test
public void floatPcmNeedsTranscodingIfFloatOutputDisabled() { public void floatPcmNeedsTranscodingIfFloatOutputDisabled() {
defaultAudioSink = defaultAudioSink =
new DefaultAudioSink( new DefaultAudioSink.Builder().setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES).build();
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES,
new AudioProcessor[0],
/* enableFloatOutput= */ false);
Format floatFormat = Format floatFormat =
STEREO_44_1_FORMAT STEREO_44_1_FORMAT
.buildUpon() .buildUpon()
...@@ -221,10 +220,10 @@ public final class DefaultAudioSinkTest { ...@@ -221,10 +220,10 @@ public final class DefaultAudioSinkTest {
@Test @Test
public void floatPcmNeedsTranscodingIfFloatOutputEnabledBeforeApi21() { public void floatPcmNeedsTranscodingIfFloatOutputEnabledBeforeApi21() {
defaultAudioSink = defaultAudioSink =
new DefaultAudioSink( new DefaultAudioSink.Builder()
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES, .setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
new AudioProcessor[0], .setEnableFloatOutput(true)
/* enableFloatOutput= */ true); .build();
Format floatFormat = Format floatFormat =
STEREO_44_1_FORMAT STEREO_44_1_FORMAT
.buildUpon() .buildUpon()
...@@ -239,10 +238,10 @@ public final class DefaultAudioSinkTest { ...@@ -239,10 +238,10 @@ public final class DefaultAudioSinkTest {
@Test @Test
public void floatOutputSupportedIfFloatOutputEnabledFromApi21() { public void floatOutputSupportedIfFloatOutputEnabledFromApi21() {
defaultAudioSink = defaultAudioSink =
new DefaultAudioSink( new DefaultAudioSink.Builder()
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES, .setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
new AudioProcessor[0], .setEnableFloatOutput(true)
/* enableFloatOutput= */ true); .build();
Format floatFormat = Format floatFormat =
STEREO_44_1_FORMAT STEREO_44_1_FORMAT
.buildUpon() .buildUpon()
...@@ -267,8 +266,9 @@ public final class DefaultAudioSinkTest { ...@@ -267,8 +266,9 @@ public final class DefaultAudioSinkTest {
@Test @Test
public void audioSinkWithAacAudioCapabilitiesWithoutOffload_doesNotSupportAac() { public void audioSinkWithAacAudioCapabilitiesWithoutOffload_doesNotSupportAac() {
DefaultAudioSink defaultAudioSink = DefaultAudioSink defaultAudioSink =
new DefaultAudioSink( new DefaultAudioSink.Builder()
new AudioCapabilities(new int[] {C.ENCODING_AAC_LC}, 2), new AudioProcessor[0]); .setAudioCapabilities(new AudioCapabilities(new int[] {C.ENCODING_AAC_LC}, 2))
.build();
Format aacLcFormat = Format aacLcFormat =
STEREO_44_1_FORMAT STEREO_44_1_FORMAT
.buildUpon() .buildUpon()
......
...@@ -31,7 +31,6 @@ import com.google.android.exoplayer2.DefaultRenderersFactory; ...@@ -31,7 +31,6 @@ import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioCapabilities;
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.MediaCodecAudioRenderer; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer;
...@@ -94,7 +93,9 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa ...@@ -94,7 +93,9 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa
/* enableDecoderFallback= */ false, /* enableDecoderFallback= */ false,
eventHandler, eventHandler,
audioRendererEventListener, audioRendererEventListener,
new DefaultAudioSink(AudioCapabilities.getCapabilities(context), new AudioProcessor[0])), new DefaultAudioSink.Builder()
.setAudioCapabilities(AudioCapabilities.getCapabilities(context))
.build()),
new TextRenderer(textRendererOutput, eventHandler.getLooper()), new TextRenderer(textRendererOutput, eventHandler.getLooper()),
new MetadataRenderer(metadataRendererOutput, eventHandler.getLooper()) new MetadataRenderer(metadataRendererOutput, eventHandler.getLooper())
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment