Fix DefaultAudioTrackBufferSizeProvider test
And move them in separate top level classes so that presubmit runs them. #minor-release PiperOrigin-RevId: 427482430
This commit is contained in:
parent
c3cb2f7cfb
commit
5107be6f7f
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* 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 androidx.media3.exoplayer.audio;
|
||||||
|
|
||||||
|
import static androidx.media3.common.C.MICROS_PER_SECOND;
|
||||||
|
import static androidx.media3.exoplayer.audio.DefaultAudioSink.OUTPUT_MODE_PASSTHROUGH;
|
||||||
|
import static androidx.media3.exoplayer.audio.DefaultAudioTrackBufferSizeProvider.getMaximumEncodedRateBytesPerSecond;
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.media3.common.C;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* 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 androidx.media3.exoplayer.audio;
|
||||||
|
|
||||||
|
import static androidx.media3.exoplayer.audio.DefaultAudioSink.OUTPUT_MODE_PASSTHROUGH;
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.media3.common.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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
/*
|
||||||
|
* 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 androidx.media3.exoplayer.audio;
|
||||||
|
|
||||||
|
import static androidx.media3.common.C.MICROS_PER_SECOND;
|
||||||
|
import static androidx.media3.exoplayer.audio.DefaultAudioSink.OUTPUT_MODE_PCM;
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static java.lang.Math.ceil;
|
||||||
|
|
||||||
|
import androidx.media3.common.C;
|
||||||
|
import androidx.media3.common.util.Util;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.ParameterizedRobolectricTestRunner;
|
||||||
|
|
||||||
|
/** Tests for {@link DefaultAudioTrackBufferSizeProvider} for PCM audio. */
|
||||||
|
@RunWith(ParameterizedRobolectricTestRunner.class)
|
||||||
|
public class DefaultAudioTrackBufferSizeProviderPcmTest {
|
||||||
|
|
||||||
|
private static final DefaultAudioTrackBufferSizeProvider DEFAULT =
|
||||||
|
new DefaultAudioTrackBufferSizeProvider.Builder().build();
|
||||||
|
|
||||||
|
@ParameterizedRobolectricTestRunner.Parameter(0)
|
||||||
|
public @C.PcmEncoding int encoding;
|
||||||
|
|
||||||
|
@ParameterizedRobolectricTestRunner.Parameter(1)
|
||||||
|
public int channelCount;
|
||||||
|
|
||||||
|
@ParameterizedRobolectricTestRunner.Parameter(2)
|
||||||
|
public int sampleRate;
|
||||||
|
|
||||||
|
@ParameterizedRobolectricTestRunner.Parameters(
|
||||||
|
name = "{index}: encoding={0}, channelCount={1}, sampleRate={2}")
|
||||||
|
public static List<Integer[]> data() {
|
||||||
|
return Sets.cartesianProduct(
|
||||||
|
ImmutableList.of(
|
||||||
|
/* encoding */ ImmutableSet.of(
|
||||||
|
C.ENCODING_PCM_8BIT,
|
||||||
|
C.ENCODING_PCM_16BIT,
|
||||||
|
C.ENCODING_PCM_16BIT_BIG_ENDIAN,
|
||||||
|
C.ENCODING_PCM_24BIT,
|
||||||
|
C.ENCODING_PCM_32BIT,
|
||||||
|
C.ENCODING_PCM_FLOAT),
|
||||||
|
/* channelCount */ ImmutableSet.of(1, 2, 3, 4, 6, 8),
|
||||||
|
/* sampleRate*/ ImmutableSet.of(
|
||||||
|
8000, 11025, 16000, 22050, 44100, 48000, 88200, 96000)))
|
||||||
|
.stream()
|
||||||
|
.map(s -> s.toArray(new Integer[0]))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getPcmFrameSize() {
|
||||||
|
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) {
|
||||||
|
return (int) ((long) durationUs * getPcmFrameSize() * sampleRate / MICROS_PER_SECOND);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBufferSizeInBytes_veryBigMinBufferSize_isMinBufferSize() {
|
||||||
|
int bufferSize =
|
||||||
|
DEFAULT.getBufferSizeInBytes(
|
||||||
|
/* minBufferSizeInBytes= */ 1234567890,
|
||||||
|
/* encoding= */ encoding,
|
||||||
|
/* outputMode= */ OUTPUT_MODE_PCM,
|
||||||
|
/* pcmFrameSize= */ getPcmFrameSize(),
|
||||||
|
/* sampleRate= */ sampleRate,
|
||||||
|
/* maxAudioTrackPlaybackSpeed= */ 1);
|
||||||
|
|
||||||
|
assertThat(bufferSize).isEqualTo(roundUpToFrame(1234567890));
|
||||||
|
}
|
||||||
|
|
||||||
|
@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(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@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(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBufferSizeInBytes_lowMinBufferSize_multipliesAudioTrackMinBuffer() {
|
||||||
|
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(roundUpToFrame(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
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);
|
||||||
|
|
||||||
|
assertThat(bufferSize)
|
||||||
|
.isEqualTo(roundUpToFrame(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBufferSizeInBytes_tooHighMinBufferSize_isMaxBufferDuration() {
|
||||||
|
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);
|
||||||
|
|
||||||
|
assertThat(bufferSize)
|
||||||
|
.isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.maxPcmBufferDurationUs)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBufferSizeInBytes_lowPlaybackSpeed_isScaledByPlaybackSpeed() {
|
||||||
|
int bufferSize =
|
||||||
|
DEFAULT.getBufferSizeInBytes(
|
||||||
|
/* minBufferSizeInBytes= */ 0,
|
||||||
|
/* encoding= */ encoding,
|
||||||
|
/* outputMode= */ OUTPUT_MODE_PCM,
|
||||||
|
/* pcmFrameSize= */ getPcmFrameSize(),
|
||||||
|
/* sampleRate= */ sampleRate,
|
||||||
|
/* maxAudioTrackPlaybackSpeed= */ 1 / 5F);
|
||||||
|
|
||||||
|
assertThat(bufferSize)
|
||||||
|
.isEqualTo(roundUpToFrame(durationUsToBytes(DEFAULT.minPcmBufferDurationUs) / 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getBufferSizeInBytes_highPlaybackSpeed_isScaledByPlaybackSpeed() {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -1,268 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 androidx.media3.exoplayer.audio;
|
|
||||||
|
|
||||||
import static androidx.media3.exoplayer.audio.DefaultAudioSink.OUTPUT_MODE_PASSTHROUGH;
|
|
||||||
import static androidx.media3.exoplayer.audio.DefaultAudioSink.OUTPUT_MODE_PCM;
|
|
||||||
import static androidx.media3.exoplayer.audio.DefaultAudioTrackBufferSizeProvider.getMaximumEncodedRateBytesPerSecond;
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
|
|
||||||
import androidx.media3.common.C;
|
|
||||||
import androidx.media3.common.util.Util;
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.junit.runners.JUnit4;
|
|
||||||
import org.junit.runners.Parameterized;
|
|
||||||
|
|
||||||
/** Tests for {@link DefaultAudioTrackBufferSizeProvider}. */
|
|
||||||
@RunWith(JUnit4.class)
|
|
||||||
public class DefaultAudioTrackBufferSizeProviderTest {
|
|
||||||
|
|
||||||
private static final DefaultAudioTrackBufferSizeProvider DEFAULT =
|
|
||||||
new DefaultAudioTrackBufferSizeProvider.Builder().build();
|
|
||||||
|
|
||||||
/** Tests for {@link DefaultAudioTrackBufferSizeProvider} for PCM audio. */
|
|
||||||
@RunWith(Parameterized.class)
|
|
||||||
public static class PcmTest {
|
|
||||||
|
|
||||||
@Parameterized.Parameter(0)
|
|
||||||
public @C.PcmEncoding int encoding;
|
|
||||||
|
|
||||||
@Parameterized.Parameter(1)
|
|
||||||
public int channelCount;
|
|
||||||
|
|
||||||
@Parameterized.Parameter(2)
|
|
||||||
public int sampleRate;
|
|
||||||
|
|
||||||
@Parameterized.Parameters(name = "{index}: encoding={0}, channelCount={1}, sampleRate={2}")
|
|
||||||
public static List<Integer[]> data() {
|
|
||||||
return Sets.cartesianProduct(
|
|
||||||
ImmutableList.of(
|
|
||||||
/* encoding */ ImmutableSet.of(
|
|
||||||
C.ENCODING_PCM_8BIT,
|
|
||||||
C.ENCODING_PCM_16BIT,
|
|
||||||
C.ENCODING_PCM_16BIT_BIG_ENDIAN,
|
|
||||||
C.ENCODING_PCM_24BIT,
|
|
||||||
C.ENCODING_PCM_32BIT,
|
|
||||||
C.ENCODING_PCM_FLOAT),
|
|
||||||
/* channelCount */ ImmutableSet.of(1, 2, 3, 4, 6, 8),
|
|
||||||
/* sampleRate*/ ImmutableSet.of(
|
|
||||||
8000, 11025, 16000, 22050, 44100, 48000, 88200, 96000)))
|
|
||||||
.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));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getBufferSizeInBytes_lowMinBufferSize_multipliesAudioTrackMinBuffer() {
|
|
||||||
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(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
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);
|
|
||||||
|
|
||||||
assertThat(bufferSize)
|
|
||||||
.isEqualTo(minBufferSizeInBytes * DEFAULT.pcmBufferMultiplicationFactor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getBufferSizeInBytes_tooHighMinBufferSize_isMaxBufferDuration() {
|
|
||||||
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);
|
|
||||||
|
|
||||||
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.maxPcmBufferDurationUs));
|
|
||||||
assertThat(bufferSize % getPcmFrameSize()).isEqualTo(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getBufferSizeInBytes_lowPlaybackSpeed_isScaledByPlaybackSpeed() {
|
|
||||||
int bufferSize =
|
|
||||||
DEFAULT.getBufferSizeInBytes(
|
|
||||||
/* minBufferSizeInBytes= */ 0,
|
|
||||||
/* encoding= */ encoding,
|
|
||||||
/* outputMode= */ OUTPUT_MODE_PCM,
|
|
||||||
/* pcmFrameSize= */ getPcmFrameSize(),
|
|
||||||
/* sampleRate= */ sampleRate,
|
|
||||||
/* maxAudioTrackPlaybackSpeed= */ 1 / 5F);
|
|
||||||
|
|
||||||
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs / 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void getBufferSizeInBytes_highPlaybackSpeed_isScaledByPlaybackSpeed() {
|
|
||||||
int bufferSize =
|
|
||||||
DEFAULT.getBufferSizeInBytes(
|
|
||||||
/* minBufferSizeInBytes= */ 0,
|
|
||||||
/* encoding= */ encoding,
|
|
||||||
/* outputMode= */ OUTPUT_MODE_PCM,
|
|
||||||
/* pcmFrameSize= */ getPcmFrameSize(),
|
|
||||||
/* sampleRate= */ sampleRate,
|
|
||||||
/* maxAudioTrackPlaybackSpeed= */ 8F);
|
|
||||||
|
|
||||||
assertThat(bufferSize).isEqualTo(durationUsToBytes(DEFAULT.minPcmBufferDurationUs * 8));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user