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,30 +29,26 @@ import java.util.List; ...@@ -29,30 +29,26 @@ 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 static class PcmTest {
@Parameterized.Parameter(0)
public @C.PcmEncoding int encoding; public @C.PcmEncoding int encoding;
@Parameterized.Parameter(1) @ParameterizedRobolectricTestRunner.Parameter(1)
public int channelCount; public int channelCount;
@Parameterized.Parameter(2) @ParameterizedRobolectricTestRunner.Parameter(2)
public int sampleRate; public int sampleRate;
@Parameterized.Parameters(name = "{index}: encoding={0}, channelCount={1}, sampleRate={2}") @ParameterizedRobolectricTestRunner.Parameters(
name = "{index}: encoding={0}, channelCount={1}, sampleRate={2}")
public static List<Integer[]> data() { public static List<Integer[]> data() {
return Sets.cartesianProduct( return Sets.cartesianProduct(
ImmutableList.of( ImmutableList.of(
...@@ -75,22 +71,27 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -75,22 +71,27 @@ public class DefaultAudioTrackBufferSizeProviderTest {
return Util.getPcmFrameSize(encoding, channelCount); return Util.getPcmFrameSize(encoding, channelCount);
} }
private int roundUpToFrame(int buffer) {
int pcmFrameSize = getPcmFrameSize();
return (int) ceil((double) buffer / pcmFrameSize) * pcmFrameSize;
}
private int durationUsToBytes(int durationUs) { private int durationUsToBytes(int durationUs) {
return (int) (((long) durationUs * getPcmFrameSize() * sampleRate) / C.MICROS_PER_SECOND); return (int) ((long) durationUs * getPcmFrameSize() * sampleRate / MICROS_PER_SECOND);
} }
@Test @Test
public void getBufferSizeInBytes_veryBigMinBufferSize_isMinBufferSize() { public void getBufferSizeInBytes_veryBigMinBufferSize_isMinBufferSize() {
int bufferSize = int bufferSize =
DEFAULT.getBufferSizeInBytes( DEFAULT.getBufferSizeInBytes(
/* minBufferSizeInBytes= */ 123456789, /* minBufferSizeInBytes= */ 1234567890,
/* encoding= */ encoding, /* encoding= */ encoding,
/* outputMode= */ OUTPUT_MODE_PCM, /* outputMode= */ OUTPUT_MODE_PCM,
/* pcmFrameSize= */ getPcmFrameSize(), /* pcmFrameSize= */ getPcmFrameSize(),
/* sampleRate= */ sampleRate, /* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1); /* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(123456789); assertThat(bufferSize).isEqualTo(roundUpToFrame(1234567890));
} }
@Test @Test
...@@ -104,8 +105,8 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -104,8 +105,8 @@ public class DefaultAudioTrackBufferSizeProviderTest {
/* sampleRate= */ sampleRate, /* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1); /* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)); assertThat(bufferSize)
assertThat(bufferSize % getPcmFrameSize()).isEqualTo(0); .isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)));
} }
@Test @Test
...@@ -122,7 +123,8 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -122,7 +123,8 @@ public class DefaultAudioTrackBufferSizeProviderTest {
/* sampleRate= */ sampleRate, /* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1); /* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)); assertThat(bufferSize)
.isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)));
} }
@Test @Test
...@@ -140,7 +142,7 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -140,7 +142,7 @@ public class DefaultAudioTrackBufferSizeProviderTest {
/* maxAudioTrackPlaybackSpeed= */ 1); /* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize) assertThat(bufferSize)
.isEqualTo(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor); .isEqualTo(roundUpToFrame(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor));
} }
@Test @Test
...@@ -158,7 +160,7 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -158,7 +160,7 @@ public class DefaultAudioTrackBufferSizeProviderTest {
/* maxAudioTrackPlaybackSpeed= */ 1); /* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize) assertThat(bufferSize)
.isEqualTo(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor); .isEqualTo(roundUpToFrame(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor));
} }
@Test @Test
...@@ -175,8 +177,8 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -175,8 +177,8 @@ public class DefaultAudioTrackBufferSizeProviderTest {
/* sampleRate= */ sampleRate, /* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1); /* maxAudioTrackPlaybackSpeed= */ 1);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.maxPcmBufferDurationUs)); assertThat(bufferSize)
assertThat(bufferSize % getPcmFrameSize()).isEqualTo(0); .isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.maxPcmBufferDurationUs)));
} }
@Test @Test
...@@ -190,7 +192,8 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -190,7 +192,8 @@ public class DefaultAudioTrackBufferSizeProviderTest {
/* sampleRate= */ sampleRate, /* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 1 / 5F); /* maxAudioTrackPlaybackSpeed= */ 1 / 5F);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs / 5)); assertThat(bufferSize)
.isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs) / 5));
} }
@Test @Test
...@@ -204,65 +207,7 @@ public class DefaultAudioTrackBufferSizeProviderTest { ...@@ -204,65 +207,7 @@ public class DefaultAudioTrackBufferSizeProviderTest {
/* sampleRate= */ sampleRate, /* sampleRate= */ sampleRate,
/* maxAudioTrackPlaybackSpeed= */ 8F); /* maxAudioTrackPlaybackSpeed= */ 8F);
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs * 8)); int expected = roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs) * 8);
} assertThat(bufferSize).isEqualTo(expected);
}
/**
* Tests for {@link DefaultAudioTrackBufferSizeProvider} for encoded audio except {@link
* C#ENCODING_AC3}.
*/
@RunWith(Parameterized.class)
public static class EncodedTest {
@Parameterized.Parameter(0)
public @C.Encoding int encoding;
@Parameterized.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);
}
}
@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) / C.MICROS_PER_SECOND);
} }
} }
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