Commit 73a3d1d1 by krocard Committed by Ian Baker

Fix DefaultAudioTrackBufferSizeProvider test

And move them in separate top level classes so that presubmit runs them.

#minor-release

PiperOrigin-RevId: 427482430
parent 6118d94b
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.exoplayer2.audio;
import static com.google.android.exoplayer2.C.MICROS_PER_SECOND;
import static com.google.android.exoplayer2.audio.DefaultAudioSink.OUTPUT_MODE_PASSTHROUGH;
import static com.google.android.exoplayer2.audio.DefaultAudioTrackBufferSizeProvider.getMaximumEncodedRateBytesPerSecond;
import static com.google.common.truth.Truth.assertThat;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import org.junit.Test;
import org.junit.runner.RunWith;
/** Tests for {@link DefaultAudioTrackBufferSizeProvider} AC3 audio. */
@RunWith(AndroidJUnit4.class)
public class DefaultAudioTrackBufferSizeProviderAC3Test {
private static final DefaultAudioTrackBufferSizeProvider DEFAULT =
new DefaultAudioTrackBufferSizeProvider.Builder().build();
@Test
public void
getBufferSizeInBytes_passthroughAC3_isPassthroughBufferSizeTimesMultiplicationFactor() {
int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ 0,
/* encoding= */ C.ENCODING_AC3,
/* outputMode= */ OUTPUT_MODE_PASSTHROUGH,
/* pcmFrameSize= */ 1,
/* sampleRate= */ 0,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize)
.isEqualTo(
durationUsToAc3MaxBytes(DEFAULT.passthroughBufferDurationUs)
* DEFAULT.ac3BufferMultiplicationFactor);
}
private static int durationUsToAc3MaxBytes(long durationUs) {
return (int)
(durationUs * getMaximumEncodedRateBytesPerSecond(C.ENCODING_AC3) / MICROS_PER_SECOND);
}
}
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.exoplayer2.audio;
import static com.google.android.exoplayer2.audio.DefaultAudioSink.OUTPUT_MODE_PASSTHROUGH;
import static com.google.common.truth.Truth.assertThat;
import com.google.android.exoplayer2.C;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.ParameterizedRobolectricTestRunner;
/**
* Tests for {@link DefaultAudioTrackBufferSizeProvider} for encoded audio except {@link
* C#ENCODING_AC3}.
*/
@RunWith(ParameterizedRobolectricTestRunner.class)
public class DefaultAudioTrackBufferSizeProviderEncodedTest {
private static final DefaultAudioTrackBufferSizeProvider DEFAULT =
new DefaultAudioTrackBufferSizeProvider.Builder().build();
@ParameterizedRobolectricTestRunner.Parameter(0)
public @C.Encoding int encoding;
@ParameterizedRobolectricTestRunner.Parameters(name = "{index}: encoding={0}")
public static ImmutableList<Integer> data() {
return ImmutableList.of(
C.ENCODING_MP3,
C.ENCODING_AAC_LC,
C.ENCODING_AAC_HE_V1,
C.ENCODING_AC4,
C.ENCODING_DTS,
C.ENCODING_DOLBY_TRUEHD);
}
@Test
public void getBufferSizeInBytes_veryBigMinBufferSize_isMinBufferSize() {
int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ 123456789,
/* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PASSTHROUGH,
/* pcmFrameSize= */ 1,
/* sampleRate= */ 0,
/* maxAudioTrackPlaybackSpeed= */ 0);
assertThat(bufferSize).isEqualTo(123456789);
}
}
...@@ -15,10 +15,10 @@ ...@@ -15,10 +15,10 @@
*/ */
package com.google.android.exoplayer2.audio; package com.google.android.exoplayer2.audio;
import static com.google.android.exoplayer2.audio.DefaultAudioSink.OUTPUT_MODE_PASSTHROUGH; import static com.google.android.exoplayer2.C.MICROS_PER_SECOND;
import static com.google.android.exoplayer2.audio.DefaultAudioSink.OUTPUT_MODE_PCM; import static com.google.android.exoplayer2.audio.DefaultAudioSink.OUTPUT_MODE_PCM;
import static com.google.android.exoplayer2.audio.DefaultAudioTrackBufferSizeProvider.getMaximumEncodedRateBytesPerSecond;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static java.lang.Math.ceil;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
...@@ -29,240 +29,185 @@ import java.util.List; ...@@ -29,240 +29,185 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.robolectric.ParameterizedRobolectricTestRunner;
import org.junit.runners.Parameterized;
/** Tests for {@link DefaultAudioTrackBufferSizeProvider}. */ /** Tests for {@link DefaultAudioTrackBufferSizeProvider} for PCM audio. */
@RunWith(JUnit4.class) @RunWith(ParameterizedRobolectricTestRunner.class)
public class DefaultAudioTrackBufferSizeProviderTest { public class DefaultAudioTrackBufferSizeProviderPcmTest {
private static final DefaultAudioTrackBufferSizeProvider DEFAULT = private static final DefaultAudioTrackBufferSizeProvider DEFAULT =
new DefaultAudioTrackBufferSizeProvider.Builder().build(); new DefaultAudioTrackBufferSizeProvider.Builder().build();
/** Tests for {@link DefaultAudioTrackBufferSizeProvider} for PCM audio. */ @ParameterizedRobolectricTestRunner.Parameter(0)
@RunWith(Parameterized.class) public @C.PcmEncoding int encoding;
public static class PcmTest {
@ParameterizedRobolectricTestRunner.Parameter(1)
@Parameterized.Parameter(0) public int channelCount;
public @C.PcmEncoding int encoding;
@ParameterizedRobolectricTestRunner.Parameter(2)
@Parameterized.Parameter(1) public int sampleRate;
public int channelCount;
@ParameterizedRobolectricTestRunner.Parameters(
@Parameterized.Parameter(2) name = "{index}: encoding={0}, channelCount={1}, sampleRate={2}")
public int sampleRate; public static List<Integer[]> data() {
return Sets.cartesianProduct(
@Parameterized.Parameters(name = "{index}: encoding={0}, channelCount={1}, sampleRate={2}") ImmutableList.of(
public static List<Integer[]> data() { /* encoding */ ImmutableSet.of(
return Sets.cartesianProduct( C.ENCODING_PCM_8BIT,
ImmutableList.of( C.ENCODING_PCM_16BIT,
/* encoding */ ImmutableSet.of( C.ENCODING_PCM_16BIT_BIG_ENDIAN,
C.ENCODING_PCM_8BIT, C.ENCODING_PCM_24BIT,
C.ENCODING_PCM_16BIT, C.ENCODING_PCM_32BIT,
C.ENCODING_PCM_16BIT_BIG_ENDIAN, C.ENCODING_PCM_FLOAT),
C.ENCODING_PCM_24BIT, /* channelCount */ ImmutableSet.of(1, 2, 3, 4, 6, 8),
C.ENCODING_PCM_32BIT, /* sampleRate*/ ImmutableSet.of(
C.ENCODING_PCM_FLOAT), 8000, 11025, 16000, 22050, 44100, 48000, 88200, 96000)))
/* channelCount */ ImmutableSet.of(1, 2, 3, 4, 6, 8), .stream()
/* sampleRate*/ ImmutableSet.of( .map(s -> s.toArray(new Integer[0]))
8000, 11025, 16000, 22050, 44100, 48000, 88200, 96000))) .collect(Collectors.toList());
.stream() }
.map(s -> s.toArray(new Integer[0]))
.collect(Collectors.toList());
}
private int getPcmFrameSize() {
return Util.getPcmFrameSize(encoding, channelCount);
}
private int durationUsToBytes(int durationUs) {
return (int) (((long) durationUs * getPcmFrameSize() * sampleRate) / C.MICROS_PER_SECOND);
}
@Test
public void getBufferSizeInBytes_veryBigMinBufferSize_isMinBufferSize() {
int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ 123456789,
/* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(123456789);
}
@Test
public void getBufferSizeInBytes_noMinBufferSize_isMinBufferDuration() {
int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ 0,
/* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs));
assertThat(bufferSize % getPcmFrameSize()).isEqualTo(0);
}
@Test
public void getBufferSizeInBytes_tooSmallMinBufferSize_isMinBufferDuration() {
int minBufferSizeInBytes =
durationUsToBytes(DEFAULT.minPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor)
- 1;
int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ minBufferSizeInBytes,
/* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)); private int getPcmFrameSize() {
} return Util.getPcmFrameSize(encoding, channelCount);
}
@Test private int roundUpToFrame(int buffer) {
public void getBufferSizeInBytes_lowMinBufferSize_multipliesAudioTrackMinBuffer() { int pcmFrameSize = getPcmFrameSize();
int minBufferSizeInBytes = return (int) ceil((double) buffer / pcmFrameSize) * pcmFrameSize;
durationUsToBytes(DEFAULT.minPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor) }
+ 1;
int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ minBufferSizeInBytes,
/* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize) private int durationUsToBytes(int durationUs) {
.isEqualTo(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor); return (int) ((long) durationUs * getPcmFrameSize() * sampleRate / MICROS_PER_SECOND);
} }
@Test @Test
public void getBufferSizeInBytes_highMinBufferSize_multipliesAudioTrackMinBuffer() { public void getBufferSizeInBytes_veryBigMinBufferSize_isMinBufferSize() {
int minBufferSizeInBytes = int bufferSize =
durationUsToBytes(DEFAULT.maxPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor) DEFAULT.getBufferSizeInBytes(
- 1; /* minBufferSizeInBytes= */ 1234567890,
int bufferSize = /* encoding= */ encoding,
DEFAULT.getBufferSizeInBytes( /* outputMode= */ OUTPUT_MODE_PCM,
/* minBufferSizeInBytes= */ minBufferSizeInBytes, /* pcmFrameSize= */ getPcmFrameSize(),
/* encoding= */ encoding, /* sampleRate= */ sampleRate,
/* outputMode= */ OUTPUT_MODE_PCM, /* maxAudioTrackPlaybackSpeed= */ 1);
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize) assertThat(bufferSize).isEqualTo(roundUpToFrame(1234567890));
.isEqualTo(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor); }
}
@Test @Test
public void getBufferSizeInBytes_tooHighMinBufferSize_isMaxBufferDuration() { public void getBufferSizeInBytes_noMinBufferSize_isMinBufferDuration() {
int minBufferSizeInBytes = int bufferSize =
durationUsToBytes(DEFAULT.maxPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor) DEFAULT.getBufferSizeInBytes(
+ 1; /* minBufferSizeInBytes= */ 0,
int bufferSize = /* encoding= */ encoding,
DEFAULT.getBufferSizeInBytes( /* outputMode= */ OUTPUT_MODE_PCM,
/* minBufferSizeInBytes= */ minBufferSizeInBytes, /* pcmFrameSize= */ getPcmFrameSize(),
/* encoding= */ encoding, /* sampleRate= */ sampleRate,
/* outputMode= */ OUTPUT_MODE_PCM, /* maxAudioTrackPlaybackSpeed= */ 1);
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.maxPcmBufferDurationUs)); assertThat(bufferSize)
assertThat(bufferSize % getPcmFrameSize()).isEqualTo(0); .isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)));
} }
@Test @Test
public void getBufferSizeInBytes_lowPlaybackSpeed_isScaledByPlaybackSpeed() { public void getBufferSizeInBytes_tooSmallMinBufferSize_isMinBufferDuration() {
int bufferSize = int minBufferSizeInBytes =
DEFAULT.getBufferSizeInBytes( durationUsToBytes(DEFAULT.minPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor)
/* minBufferSizeInBytes= */ 0, - 1;
/* encoding= */ encoding, int bufferSize =
/* outputMode= */ OUTPUT_MODE_PCM, DEFAULT.getBufferSizeInBytes(
/* pcmFrameSize= */ getPcmFrameSize(), /* minBufferSizeInBytes= */ minBufferSizeInBytes,
/* sampleRate= */ sampleRate, /* encoding= */ encoding,
/* maxAudioTrackPlaybackSpeed= */ 1 / 5F); /* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs / 5)); assertThat(bufferSize)
} .isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)));
}
@Test @Test
public void getBufferSizeInBytes_highPlaybackSpeed_isScaledByPlaybackSpeed() { public void getBufferSizeInBytes_lowMinBufferSize_multipliesAudioTrackMinBuffer() {
int bufferSize = int minBufferSizeInBytes =
DEFAULT.getBufferSizeInBytes( durationUsToBytes(DEFAULT.minPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor)
/* minBufferSizeInBytes= */ 0, + 1;
/* encoding= */ encoding, int bufferSize =
/* outputMode= */ OUTPUT_MODE_PCM, DEFAULT.getBufferSizeInBytes(
/* pcmFrameSize= */ getPcmFrameSize(), /* minBufferSizeInBytes= */ minBufferSizeInBytes,
/* sampleRate= */ sampleRate, /* encoding= */ encoding,
/* maxAudioTrackPlaybackSpeed= */ 8F); /* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs * 8)); assertThat(bufferSize)
} .isEqualTo(roundUpToFrame(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor));
} }
/**
* Tests for {@link DefaultAudioTrackBufferSizeProvider} for encoded audio except {@link
* C#ENCODING_AC3}.
*/
@RunWith(Parameterized.class)
public static class EncodedTest {
@Parameterized.Parameter(0) @Test
public @C.Encoding int encoding; public void getBufferSizeInBytes_highMinBufferSize_multipliesAudioTrackMinBuffer() {
int minBufferSizeInBytes =
durationUsToBytes(DEFAULT.maxPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor)
- 1;
int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ minBufferSizeInBytes,
/* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
@Parameterized.Parameters(name = "{index}: encoding={0}") assertThat(bufferSize)
public static ImmutableList<Integer> data() { .isEqualTo(roundUpToFrame(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor));
return ImmutableList.of( }
C.ENCODING_MP3,
C.ENCODING_AAC_LC,
C.ENCODING_AAC_HE_V1,
C.ENCODING_AC4,
C.ENCODING_DTS,
C.ENCODING_DOLBY_TRUEHD);
}
@Test @Test
public void getBufferSizeInBytes_veryBigMinBufferSize_isMinBufferSize() { public void getBufferSizeInBytes_tooHighMinBufferSize_isMaxBufferDuration() {
int bufferSize = int minBufferSizeInBytes =
DEFAULT.getBufferSizeInBytes( durationUsToBytes(DEFAULT.maxPcmBufferDurationUs / DEFAULT.pcmBufferMultiplicationFactor)
/* minBufferSizeInBytes= */ 123456789, + 1;
/* encoding= */ encoding, int bufferSize =
/* outputMode= */ OUTPUT_MODE_PASSTHROUGH, DEFAULT.getBufferSizeInBytes(
/* pcmFrameSize= */ 1, /* minBufferSizeInBytes= */ minBufferSizeInBytes,
/* sampleRate= */ 0, /* encoding= */ encoding,
/* maxAudioTrackPlaybackSpeed= */ 0); /* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(123456789); assertThat(bufferSize)
} .isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.maxPcmBufferDurationUs)));
} }
@Test @Test
public void public void getBufferSizeInBytes_lowPlaybackSpeed_isScaledByPlaybackSpeed() {
getBufferSizeInBytes_passthroughAC3_isPassthroughBufferSizeTimesMultiplicationFactor() {
int bufferSize = int bufferSize =
DEFAULT.getBufferSizeInBytes( DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ 0, /* minBufferSizeInBytes= */ 0,
/* encoding= */ C.ENCODING_AC3, /* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PASSTHROUGH, /* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ 1, /* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ 0, /* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1); /* maxAudioTrackPlaybackSpeed= */ 1 / 5F);
assertThat(bufferSize) assertThat(bufferSize)
.isEqualTo( .isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs) / 5));
durationUsToAc3MaxBytes(DEFAULT.passthroughBufferDurationUs)
* DEFAULT.ac3BufferMultiplicationFactor);
} }
private static int durationUsToAc3MaxBytes(long durationUs) { @Test
return (int) public void getBufferSizeInBytes_highPlaybackSpeed_isScaledByPlaybackSpeed() {
(durationUs * getMaximumEncodedRateBytesPerSecond(C.ENCODING_AC3) / C.MICROS_PER_SECOND); int bufferSize =
DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ 0,
/* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 8F);
int expected = roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs) * 8);
assertThat(bufferSize).isEqualTo(expected);
} }
} }
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