mirror of
https://github.com/androidx/media.git
synced 2025-05-07 23:50:44 +08:00
Improve checks around AudioGraphInput configuring with requested format
Also adds extra AudioGraphInputTest cases. PiperOrigin-RevId: 603690041
This commit is contained in:
parent
1bd04cb5d9
commit
029071a342
@ -410,8 +410,12 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
AudioProcessingPipeline audioProcessingPipeline =
|
||||
new AudioProcessingPipeline(audioProcessors.build());
|
||||
AudioFormat outputAudioFormat = audioProcessingPipeline.configure(inputAudioFormat);
|
||||
if (!requiredOutputAudioFormat.equals(AudioFormat.NOT_SET)
|
||||
&& !outputAudioFormat.equals(requiredOutputAudioFormat)) {
|
||||
if ((requiredOutputAudioFormat.sampleRate != Format.NO_VALUE
|
||||
&& requiredOutputAudioFormat.sampleRate != outputAudioFormat.sampleRate)
|
||||
|| (requiredOutputAudioFormat.channelCount != Format.NO_VALUE
|
||||
&& requiredOutputAudioFormat.channelCount != outputAudioFormat.channelCount)
|
||||
|| (requiredOutputAudioFormat.encoding != Format.NO_VALUE
|
||||
&& requiredOutputAudioFormat.encoding != outputAudioFormat.encoding)) {
|
||||
throw new UnhandledAudioFormatException(
|
||||
"Audio can not be modified to match downstream format", inputAudioFormat);
|
||||
}
|
||||
|
@ -20,9 +20,12 @@ import static androidx.media3.common.util.Util.getPcmFormat;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import androidx.media3.common.C;
|
||||
import androidx.media3.common.Format;
|
||||
import androidx.media3.common.MediaItem;
|
||||
import androidx.media3.common.audio.AudioProcessor.AudioFormat;
|
||||
import androidx.media3.common.util.Util;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import java.nio.ByteBuffer;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@ -31,19 +34,22 @@ import org.junit.runner.RunWith;
|
||||
public class AudioGraphInputTest {
|
||||
private static final EditedMediaItem FAKE_ITEM =
|
||||
new EditedMediaItem.Builder(MediaItem.EMPTY).build();
|
||||
|
||||
private static final AudioFormat MONO_44100 =
|
||||
new AudioFormat(/* sampleRate= */ 44_100, /* channelCount= */ 1, C.ENCODING_PCM_16BIT);
|
||||
private static final AudioFormat MONO_48000 =
|
||||
new AudioFormat(/* sampleRate= */ 48_000, /* channelCount= */ 1, C.ENCODING_PCM_16BIT);
|
||||
private static final AudioFormat STEREO_44100 =
|
||||
new AudioFormat(/* sampleRate= */ 44_100, /* channelCount= */ 2, C.ENCODING_PCM_16BIT);
|
||||
private static final AudioFormat STEREO_48000 =
|
||||
new AudioFormat(/* sampleRate= */ 48_000, /* channelCount= */ 2, C.ENCODING_PCM_16BIT);
|
||||
|
||||
@Test
|
||||
public void getOutputAudioFormat_withUnsetRequestedFormat_matchesInputFormat() throws Exception {
|
||||
AudioGraphInput audioGraphInput =
|
||||
new AudioGraphInput(
|
||||
/* requestedOutputAudioFormat= */ AudioFormat.NOT_SET,
|
||||
FAKE_ITEM,
|
||||
getPcmFormat(MONO_48000));
|
||||
/* editedMediaItem= */ FAKE_ITEM,
|
||||
/* inputFormat= */ getPcmFormat(MONO_48000));
|
||||
|
||||
assertThat(audioGraphInput.getOutputAudioFormat()).isEqualTo(MONO_48000);
|
||||
}
|
||||
@ -52,8 +58,77 @@ public class AudioGraphInputTest {
|
||||
public void getOutputAudioFormat_withRequestedFormat_matchesRequestedFormat() throws Exception {
|
||||
AudioGraphInput audioGraphInput =
|
||||
new AudioGraphInput(
|
||||
/* requestedOutputAudioFormat= */ STEREO_44100, FAKE_ITEM, getPcmFormat(MONO_48000));
|
||||
/* requestedOutputAudioFormat= */ STEREO_44100,
|
||||
/* editedMediaItem= */ FAKE_ITEM,
|
||||
/* inputFormat= */ getPcmFormat(MONO_48000));
|
||||
|
||||
assertThat(audioGraphInput.getOutputAudioFormat()).isEqualTo(STEREO_44100);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getOutputAudioFormat_withRequestedSampleRate_combinesWithConfiguredFormat()
|
||||
throws Exception {
|
||||
AudioFormat requestedAudioFormat =
|
||||
new AudioFormat(
|
||||
/* sampleRate= */ MONO_48000.sampleRate,
|
||||
/* channelCount= */ Format.NO_VALUE,
|
||||
/* encoding= */ Format.NO_VALUE);
|
||||
|
||||
AudioGraphInput audioGraphInput =
|
||||
new AudioGraphInput(
|
||||
/* requestedOutputAudioFormat= */ requestedAudioFormat,
|
||||
/* editedMediaItem= */ FAKE_ITEM,
|
||||
/* inputFormat= */ getPcmFormat(MONO_44100));
|
||||
|
||||
assertThat(audioGraphInput.getOutputAudioFormat()).isEqualTo(MONO_48000);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getOutputAudioFormat_withRequestedChannelCount_combinesWithConfiguredFormat()
|
||||
throws Exception {
|
||||
AudioFormat requestedAudioFormat =
|
||||
new AudioFormat(
|
||||
/* sampleRate= */ Format.NO_VALUE,
|
||||
/* channelCount= */ STEREO_48000.channelCount,
|
||||
/* encoding= */ Format.NO_VALUE);
|
||||
|
||||
AudioGraphInput audioGraphInput =
|
||||
new AudioGraphInput(
|
||||
/* requestedOutputAudioFormat= */ requestedAudioFormat,
|
||||
/* editedMediaItem= */ FAKE_ITEM,
|
||||
/* inputFormat= */ getPcmFormat(MONO_44100));
|
||||
|
||||
assertThat(audioGraphInput.getOutputAudioFormat()).isEqualTo(STEREO_44100);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getOutput_withSilentMediaItemChange_outputsCorrectAmountOfSilentBytes()
|
||||
throws Exception {
|
||||
AudioGraphInput audioGraphInput =
|
||||
new AudioGraphInput(
|
||||
/* requestedOutputAudioFormat= */ AudioFormat.NOT_SET,
|
||||
/* editedMediaItem= */ FAKE_ITEM,
|
||||
/* inputFormat= */ getPcmFormat(STEREO_44100));
|
||||
|
||||
audioGraphInput.onMediaItemChanged(
|
||||
/* editedMediaItem= */ FAKE_ITEM,
|
||||
/* durationUs= */ 1_000_000,
|
||||
/* decodedFormat= */ null,
|
||||
/* isLast= */ true);
|
||||
int bytesOutput = drainAudioGraphInput(audioGraphInput);
|
||||
|
||||
long expectedSampleCount = Util.durationUsToSampleCount(1_000_000, STEREO_44100.sampleRate);
|
||||
assertThat(bytesOutput).isEqualTo(expectedSampleCount * STEREO_44100.bytesPerFrame);
|
||||
}
|
||||
|
||||
/** Drains the graph and returns the number of bytes output. */
|
||||
private static int drainAudioGraphInput(AudioGraphInput audioGraphInput) throws Exception {
|
||||
int bytesOutput = 0;
|
||||
ByteBuffer output;
|
||||
while ((output = audioGraphInput.getOutput()).hasRemaining() || !audioGraphInput.isEnded()) {
|
||||
bytesOutput += output.remaining();
|
||||
output.position(output.limit());
|
||||
}
|
||||
return bytesOutput;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user