Map VORBIS channel layout to Android layout

Both the extension OPUS decoder and the OMX/C2 MediaCodec
implementations for OPUS and VORBIS decode into the channel
layout defined by VORBIS. See
https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-140001.2.3

While this is technically correct for a stand-alone OPUS or VORBIS
decoder, it doesn't match the channel layout expected by Android.
See https://developer.android.com/reference/android/media/AudioFormat#channelMask

The fix is to apply the channel mapping after decoding if needed.
Also add e2e tests with audio dumps for the extension renderer,
including a new 5.1 channel test file.

Issue: google/ExoPlayer#8396

#minor-release

PiperOrigin-RevId: 588004832
This commit is contained in:
tonihei 2023-12-05 02:57:15 -08:00 committed by Copybara-Service
parent 913f6da083
commit b1541b096f
12 changed files with 1383 additions and 20 deletions

View File

@ -30,6 +30,9 @@
* Add experimental support for parsing subtitles during extraction. You
can enable this using
`MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()`.
* Fix issue that OPUS and VORBIS channel layouts are wrong for 3, 5, 6, 7
and 8 channels
([#8396](https://github.com/google/ExoPlayer/issues/8396)).
* Transformer:
* Add support for flattening H.265/HEVC SEF slow motion videos.
* Increase transmuxing speed, especially for 'remove video' edits.

View File

@ -33,6 +33,7 @@ dependencies {
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion
testImplementation project(modulePrefix + 'test-utils')
testImplementation 'org.robolectric:robolectric:' + robolectricVersion
androidTestImplementation project(modulePrefix + 'test-utils')
androidTestImplementation 'androidx.test:runner:' + androidxTestRunnerVersion
androidTestImplementation 'androidx.test.ext:junit:' + androidxTestJUnitVersion
}

View File

@ -15,7 +15,7 @@
*/
package androidx.media3.decoder.opus;
import static org.junit.Assert.fail;
import static com.google.common.truth.Truth.assertWithMessage;
import android.content.Context;
import android.net.Uri;
@ -28,9 +28,13 @@ import androidx.media3.datasource.DefaultDataSource;
import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.RenderersFactory;
import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.source.ProgressiveMediaSource;
import androidx.media3.extractor.mkv.MatroskaExtractor;
import androidx.media3.test.utils.CapturingAudioSink;
import androidx.media3.test.utils.DumpFileAsserts;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
@ -41,49 +45,69 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class OpusPlaybackTest {
private static final String BEAR_OPUS_URI = "asset:///media/mka/bear-opus.mka";
private static final String BEAR_OPUS_NEGATIVE_GAIN_URI =
"asset:///media/mka/bear-opus-negative-gain.mka";
private static final String BEAR_OPUS = "mka/bear-opus.mka";
private static final String BEAR_OPUS_NEGATIVE_GAIN = "mka/bear-opus-negative-gain.mka";
private static final String OPUS_5POINT1 = "mka/opus-5.1.mka";
@Before
public void setUp() {
if (!OpusLibrary.isAvailable()) {
fail("Opus library not available.");
}
assertWithMessage("Opus library not available").that(OpusLibrary.isAvailable()).isTrue();
assertWithMessage("Dump files were generated for x86_64")
.that(System.getProperty("os.arch"))
.isEqualTo("x86_64");
}
@Test
public void basicPlayback() throws Exception {
playUri(BEAR_OPUS_URI);
public void playBasicOpus() throws Exception {
playUri(BEAR_OPUS);
}
@Test
public void basicPlaybackNegativeGain() throws Exception {
playUri(BEAR_OPUS_NEGATIVE_GAIN_URI);
public void playWithNegativeGain() throws Exception {
playUri(BEAR_OPUS_NEGATIVE_GAIN);
}
private void playUri(String uri) throws Exception {
@Test
public void play5Point1() throws Exception {
playUri(OPUS_5POINT1);
}
private void playUri(String fileName) throws Exception {
CapturingAudioSink audioSink =
new CapturingAudioSink(
new DefaultAudioSink.Builder(ApplicationProvider.getApplicationContext()).build());
TestPlaybackRunnable testPlaybackRunnable =
new TestPlaybackRunnable(Uri.parse(uri), ApplicationProvider.getApplicationContext());
new TestPlaybackRunnable(
Uri.parse("asset:///media/" + fileName),
ApplicationProvider.getApplicationContext(),
audioSink);
Thread thread = new Thread(testPlaybackRunnable);
thread.start();
thread.join();
if (testPlaybackRunnable.playbackException != null) {
throw testPlaybackRunnable.playbackException;
}
DumpFileAsserts.assertOutput(
ApplicationProvider.getApplicationContext(),
audioSink,
"audiosinkdumps/" + fileName + ".audiosink.dump");
}
private static class TestPlaybackRunnable implements Player.Listener, Runnable {
private final Context context;
private final Uri uri;
private final AudioSink audioSink;
@Nullable private ExoPlayer player;
@Nullable private PlaybackException playbackException;
public TestPlaybackRunnable(Uri uri, Context context) {
public TestPlaybackRunnable(Uri uri, Context context, AudioSink audioSink) {
this.uri = uri;
this.context = context;
this.audioSink = audioSink;
}
@Override
@ -95,7 +119,9 @@ public class OpusPlaybackTest {
audioRendererEventListener,
textRendererOutput,
metadataRendererOutput) ->
new Renderer[] {new LibopusAudioRenderer(eventHandler, audioRendererEventListener)};
new Renderer[] {
new LibopusAudioRenderer(eventHandler, audioRendererEventListener, audioSink)
};
player = new ExoPlayer.Builder(context, renderersFactory).build();
player.addListener(this);
MediaSource mediaSource =

View File

@ -29,6 +29,7 @@ import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.AudioSink.SinkFormatSupport;
import androidx.media3.exoplayer.audio.DecoderAudioRenderer;
import androidx.media3.extractor.VorbisUtil;
/** Decodes and renders audio using the native Opus decoder. */
@UnstableApi
@ -140,6 +141,12 @@ public class LibopusAudioRenderer extends DecoderAudioRenderer<OpusDecoder> {
return Util.getPcmFormat(pcmEncoding, decoder.channelCount, OpusDecoder.SAMPLE_RATE);
}
@Nullable
@Override
protected int[] getChannelMapping(OpusDecoder decoder) {
return VorbisUtil.getVorbisToAndroidChannelLayoutMapping(decoder.channelCount);
}
/**
* Returns true if support for padding removal from the end of decoder output buffer should be
* enabled.

View File

@ -373,6 +373,18 @@ public abstract class DecoderAudioRenderer<
@ForOverride
protected abstract Format getOutputFormat(T decoder);
/**
* Returns the channel layout mapping that should be applied when sending this data to the output,
* or null to not change the channel layout.
*
* @param decoder The decoder.
*/
@ForOverride
@Nullable
protected int[] getChannelMapping(T decoder) {
return null;
}
/**
* Evaluates whether the existing decoder can be reused for a new {@link Format}.
*
@ -443,7 +455,7 @@ public abstract class DecoderAudioRenderer<
.setSelectionFlags(inputFormat.selectionFlags)
.setRoleFlags(inputFormat.roleFlags)
.build();
audioSink.configure(outputFormat, /* specifiedBufferSize= */ 0, /* outputChannels= */ null);
audioSink.configure(outputFormat, /* specifiedBufferSize= */ 0, getChannelMapping(decoder));
audioTrackNeedsConfigure = false;
}

View File

@ -63,6 +63,7 @@ import androidx.media3.exoplayer.mediacodec.MediaCodecRenderer;
import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
import androidx.media3.exoplayer.mediacodec.MediaCodecUtil;
import androidx.media3.exoplayer.mediacodec.MediaCodecUtil.DecoderQueryException;
import androidx.media3.extractor.VorbisUtil;
import com.google.common.collect.ImmutableList;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@ -108,6 +109,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
private int codecMaxInputSize;
private boolean codecNeedsDiscardChannelsWorkaround;
private boolean codecNeedsVorbisToAndroidChannelMappingWorkaround;
@Nullable private Format inputFormat;
/** Codec used for DRM decryption only in passthrough and offload. */
@ -435,6 +437,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
float codecOperatingRate) {
codecMaxInputSize = getCodecMaxInputSize(codecInfo, format, getStreamFormats());
codecNeedsDiscardChannelsWorkaround = codecNeedsDiscardChannelsWorkaround(codecInfo.name);
codecNeedsVorbisToAndroidChannelMappingWorkaround =
codecNeedsVorbisToAndroidChannelMappingWorkaround(codecInfo.name);
MediaFormat mediaFormat =
getMediaFormat(format, codecInfo.codecMimeType, codecMaxInputSize, codecOperatingRate);
// Store the input MIME type if we're only using the codec for decryption.
@ -567,6 +571,9 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
for (int i = 0; i < format.channelCount; i++) {
channelMap[i] = i;
}
} else if (codecNeedsVorbisToAndroidChannelMappingWorkaround) {
channelMap =
VorbisUtil.getVorbisToAndroidChannelLayoutMapping(audioSinkInputFormat.channelCount);
}
}
try {
@ -972,6 +979,19 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|| Util.DEVICE.startsWith("heroqlte"));
}
/**
* Returns whether the decoder is known to output PCM samples in VORBIS order, which does not
* match the channel layout required by AudioTrack.
*
* <p>See https://github.com/google/ExoPlayer/issues/8396#issuecomment-1833867901.
*/
private static boolean codecNeedsVorbisToAndroidChannelMappingWorkaround(String codecName) {
return codecName.equals("OMX.google.opus.decoder")
|| codecName.equals("c2.android.opus.decoder")
|| codecName.equals("OMX.google.vorbis.decoder")
|| codecName.equals("c2.android.vorbis.decoder");
}
private final class AudioSinkListener implements AudioSink.Listener {
@Override

View File

@ -142,6 +142,31 @@ public final class VorbisUtil {
private static final String TAG = "VorbisUtil";
/**
* Returns the mapping from VORBIS channel layout to the channel layout expected by Android, or
* null if the mapping is unchanged.
*
* <p>See https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-140001.2.3 and
* https://developer.android.com/reference/android/media/AudioFormat#channelMask.
*/
@Nullable
public static int[] getVorbisToAndroidChannelLayoutMapping(int channelCount) {
switch (channelCount) {
case 3:
return new int[] {0, 2, 1};
case 5:
return new int[] {0, 2, 1, 3, 4};
case 6:
return new int[] {0, 2, 1, 5, 3, 4};
case 7:
return new int[] {0, 2, 1, 6, 5, 3, 4};
case 8:
return new int[] {0, 2, 1, 7, 5, 6, 3, 4};
default:
return null;
}
}
/**
* Returns ilog(x), which is the index of the highest set bit in {@code x}.
*

View File

@ -0,0 +1,418 @@
AudioSink:
buffer count = 137
discontinuity:
config:
pcmEncoding = 2
channelCount = 2
sampleRate = 48000
buffer #0:
time = 1000000000000
data = 1534249025
buffer #1:
time = 1000000021000
data = -1160621457
buffer #2:
time = 1000000041000
data = 1524340283
buffer #3:
time = 1000000061000
data = 1163800337
buffer #4:
time = 1000000081000
data = -105012593
buffer #5:
time = 1000000101000
data = -2133201155
buffer #6:
time = 1000000121000
data = -1879319991
buffer #7:
time = 1000000141000
data = -1281296657
buffer #8:
time = 1000000161000
data = -2065886367
buffer #9:
time = 1000000181000
data = -216960911
buffer #10:
time = 1000000201000
data = 1555599959
buffer #11:
time = 1000000221000
data = 339234007
buffer #12:
time = 1000000241000
data = 1461360461
buffer #13:
time = 1000000261000
data = 802335433
buffer #14:
time = 1000000281000
data = -862054125
buffer #15:
time = 1000000301000
data = -935372767
buffer #16:
time = 1000000321000
data = -694406241
buffer #17:
time = 1000000341000
data = 893036393
buffer #18:
time = 1000000361000
data = 1936536415
buffer #19:
time = 1000000381000
data = 1344446245
buffer #20:
time = 1000000401000
data = -1313590607
buffer #21:
time = 1000000421000
data = -2072467231
buffer #22:
time = 1000000441000
data = -427939557
buffer #23:
time = 1000000461000
data = -2126178587
buffer #24:
time = 1000000481000
data = 523515531
buffer #25:
time = 1000000501000
data = -151874963
buffer #26:
time = 1000000521000
data = -1396642939
buffer #27:
time = 1000000541000
data = -1235361655
buffer #28:
time = 1000000561000
data = -158077129
buffer #29:
time = 1000000581000
data = -1682415467
buffer #30:
time = 1000000601000
data = -1176101729
buffer #31:
time = 1000000621000
data = -704032195
buffer #32:
time = 1000000641000
data = 465894015
buffer #33:
time = 1000000661000
data = -27288869
buffer #34:
time = 1000000681000
data = -1719466173
buffer #35:
time = 1000000701000
data = 1439624139
buffer #36:
time = 1000000721000
data = -862685959
buffer #37:
time = 1000000741000
data = -635768969
buffer #38:
time = 1000000761000
data = 1463029887
buffer #39:
time = 1000000781000
data = -1660855877
buffer #40:
time = 1000000801000
data = 1307112171
buffer #41:
time = 1000000821000
data = -1282716603
buffer #42:
time = 1000000841000
data = 352659209
buffer #43:
time = 1000000861000
data = 521820619
buffer #44:
time = 1000000881000
data = -1386568797
buffer #45:
time = 1000000901000
data = 627203727
buffer #46:
time = 1000000921000
data = -1289682109
buffer #47:
time = 1000000941000
data = -1079104491
buffer #48:
time = 1000000961000
data = 1860165669
buffer #49:
time = 1000000981000
data = -1869109675
buffer #50:
time = 1000001001000
data = 642741353
buffer #51:
time = 1000001021000
data = 321535061
buffer #52:
time = 1000001041000
data = -1387246105
buffer #53:
time = 1000001061000
data = 63597643
buffer #54:
time = 1000001081000
data = -2008268735
buffer #55:
time = 1000001101000
data = 1401930041
buffer #56:
time = 1000001121000
data = -1293882917
buffer #57:
time = 1000001141000
data = 1996131816
buffer #58:
time = 1000001161000
data = 625350541
buffer #59:
time = 1000001181000
data = 1963066731
buffer #60:
time = 1000001201000
data = -848788739
buffer #61:
time = 1000001221000
data = -2713635
buffer #62:
time = 1000001241000
data = -144652795
buffer #63:
time = 1000001261000
data = 1348675533
buffer #64:
time = 1000001281000
data = -1613237007
buffer #65:
time = 1000001301000
data = -576658469
buffer #66:
time = 1000001321000
data = 613589157
buffer #67:
time = 1000001341000
data = -81666115
buffer #68:
time = 1000001361000
data = 570568075
buffer #69:
time = 1000001381000
data = -977502779
buffer #70:
time = 1000001401000
data = -493504513
buffer #71:
time = 1000001421000
data = -1786740767
buffer #72:
time = 1000001441000
data = 1075704113
buffer #73:
time = 1000001461000
data = -507001669
buffer #74:
time = 1000001481000
data = 1865026165
buffer #75:
time = 1000001501000
data = -1482835121
buffer #76:
time = 1000001521000
data = -882264031
buffer #77:
time = 1000001541000
data = 1642205437
buffer #78:
time = 1000001561000
data = -1624391337
buffer #79:
time = 1000001581000
data = -1550504967
buffer #80:
time = 1000001601000
data = -557983941
buffer #81:
time = 1000001621000
data = 936743857
buffer #82:
time = 1000001641000
data = 1915767603
buffer #83:
time = 1000001661000
data = -957349897
buffer #84:
time = 1000001681000
data = -1523883729
buffer #85:
time = 1000001701000
data = -1907882389
buffer #86:
time = 1000001721000
data = 1710427017
buffer #87:
time = 1000001741000
data = 2041871971
buffer #88:
time = 1000001761000
data = -1935830573
buffer #89:
time = 1000001781000
data = -1484122457
buffer #90:
time = 1000001801000
data = -1721714237
buffer #91:
time = 1000001821000
data = -1862918205
buffer #92:
time = 1000001841000
data = -1299355491
buffer #93:
time = 1000001861000
data = 1493349553
buffer #94:
time = 1000001881000
data = -1606489393
buffer #95:
time = 1000001901000
data = 1513605233
buffer #96:
time = 1000001921000
data = 475299923
buffer #97:
time = 1000001941000
data = 827883163
buffer #98:
time = 1000001961000
data = -2054932563
buffer #99:
time = 1000001981000
data = -1285258495
buffer #100:
time = 1000002001000
data = -382554715
buffer #101:
time = 1000002021000
data = -1226363337
buffer #102:
time = 1000002041000
data = 1553128795
buffer #103:
time = 1000002061000
data = 595466823
buffer #104:
time = 1000002081000
data = 44383055
buffer #105:
time = 1000002101000
data = -1353640975
buffer #106:
time = 1000002121000
data = -499720723
buffer #107:
time = 1000002141000
data = 596762589
buffer #108:
time = 1000002161000
data = -737253557
buffer #109:
time = 1000002181000
data = 434152121
buffer #110:
time = 1000002201000
data = -377488175
buffer #111:
time = 1000002221000
data = -872643307
buffer #112:
time = 1000002241000
data = 392889643
buffer #113:
time = 1000002261000
data = 1559385479
buffer #114:
time = 1000002281000
data = -1016360257
buffer #115:
time = 1000002301000
data = 1137740967
buffer #116:
time = 1000002321000
data = 1807943865
buffer #117:
time = 1000002341000
data = 1589236519
buffer #118:
time = 1000002361000
data = -1689916739
buffer #119:
time = 1000002381000
data = -2074624057
buffer #120:
time = 1000002401000
data = 1010393293
buffer #121:
time = 1000002421000
data = 992155873
buffer #122:
time = 1000002441000
data = 789944685
buffer #123:
time = 1000002461000
data = -728251655
buffer #124:
time = 1000002481000
data = -1837900467
buffer #125:
time = 1000002501000
data = 2025029553
buffer #126:
time = 1000002521000
data = 1823368377
buffer #127:
time = 1000002541000
data = -2016719635
buffer #128:
time = 1000002561000
data = 1499897473
buffer #129:
time = 1000002581000
data = -795228127
buffer #130:
time = 1000002601000
data = 1268719372
buffer #131:
time = 1000002621000
data = -652325514
buffer #132:
time = 1000002641000
data = 1604795863
buffer #133:
time = 1000002661000
data = -269114601
buffer #134:
time = 1000002681000
data = -245362327
buffer #135:
time = 1000002701000
data = -1845456361
buffer #136:
time = 1000002721000
data = 1641596033

View File

@ -0,0 +1,418 @@
AudioSink:
buffer count = 137
discontinuity:
config:
pcmEncoding = 2
channelCount = 2
sampleRate = 48000
buffer #0:
time = 1000000000000
data = 461391165
buffer #1:
time = 1000000021000
data = -1494234631
buffer #2:
time = 1000000041000
data = -1348054745
buffer #3:
time = 1000000061000
data = -1758505301
buffer #4:
time = 1000000081000
data = 1366089079
buffer #5:
time = 1000000101000
data = -1953302292
buffer #6:
time = 1000000121000
data = 753127127
buffer #7:
time = 1000000141000
data = 1292510747
buffer #8:
time = 1000000161000
data = 1760183507
buffer #9:
time = 1000000181000
data = -612797173
buffer #10:
time = 1000000201000
data = 1191417243
buffer #11:
time = 1000000221000
data = 306938793
buffer #12:
time = 1000000241000
data = -1805059003
buffer #13:
time = 1000000261000
data = -1244408253
buffer #14:
time = 1000000281000
data = 1849714991
buffer #15:
time = 1000000301000
data = 1434909193
buffer #16:
time = 1000000321000
data = 1295410777
buffer #17:
time = 1000000341000
data = 798387017
buffer #18:
time = 1000000361000
data = -1842500139
buffer #19:
time = 1000000381000
data = -537558975
buffer #20:
time = 1000000401000
data = -865314001
buffer #21:
time = 1000000421000
data = -1228907283
buffer #22:
time = 1000000441000
data = 405402534
buffer #23:
time = 1000000461000
data = -48148804
buffer #24:
time = 1000000481000
data = 316203935
buffer #25:
time = 1000000501000
data = 1569875061
buffer #26:
time = 1000000521000
data = -577923263
buffer #27:
time = 1000000541000
data = 1253991191
buffer #28:
time = 1000000561000
data = -1919619915
buffer #29:
time = 1000000581000
data = -528210197
buffer #30:
time = 1000000601000
data = -593003471
buffer #31:
time = 1000000621000
data = -346269411
buffer #32:
time = 1000000641000
data = 1722538477
buffer #33:
time = 1000000661000
data = 65346303
buffer #34:
time = 1000000681000
data = 674665393
buffer #35:
time = 1000000701000
data = 484371033
buffer #36:
time = 1000000721000
data = 1939490371
buffer #37:
time = 1000000741000
data = -956998781
buffer #38:
time = 1000000761000
data = 505868187
buffer #39:
time = 1000000781000
data = -655354697
buffer #40:
time = 1000000801000
data = 969158001
buffer #41:
time = 1000000821000
data = 88027563
buffer #42:
time = 1000000841000
data = -27892467
buffer #43:
time = 1000000861000
data = 293575265
buffer #44:
time = 1000000881000
data = -448672637
buffer #45:
time = 1000000901000
data = -1334913343
buffer #46:
time = 1000000921000
data = 222694541
buffer #47:
time = 1000000941000
data = -684016193
buffer #48:
time = 1000000961000
data = 1117082881
buffer #49:
time = 1000000981000
data = -501258253
buffer #50:
time = 1000001001000
data = -758352901
buffer #51:
time = 1000001021000
data = -1029798287
buffer #52:
time = 1000001041000
data = 1034158153
buffer #53:
time = 1000001061000
data = -1738847863
buffer #54:
time = 1000001081000
data = 916932341
buffer #55:
time = 1000001101000
data = 2014170363
buffer #56:
time = 1000001121000
data = 1137704245
buffer #57:
time = 1000001141000
data = -1130311423
buffer #58:
time = 1000001161000
data = 839607413
buffer #59:
time = 1000001181000
data = -112583739
buffer #60:
time = 1000001201000
data = -1650310917
buffer #61:
time = 1000001221000
data = 1941827263
buffer #62:
time = 1000001241000
data = 319651573
buffer #63:
time = 1000001261000
data = 60654423
buffer #64:
time = 1000001281000
data = -537622393
buffer #65:
time = 1000001301000
data = -870383681
buffer #66:
time = 1000001321000
data = 133623087
buffer #67:
time = 1000001341000
data = 1834968703
buffer #68:
time = 1000001361000
data = 1246178931
buffer #69:
time = 1000001381000
data = -894780345
buffer #70:
time = 1000001401000
data = 728460994
buffer #71:
time = 1000001421000
data = -766920809
buffer #72:
time = 1000001441000
data = -1367786341
buffer #73:
time = 1000001461000
data = -1755652579
buffer #74:
time = 1000001481000
data = 260449489
buffer #75:
time = 1000001501000
data = -1473710797
buffer #76:
time = 1000001521000
data = -1190235977
buffer #77:
time = 1000001541000
data = 267038741
buffer #78:
time = 1000001561000
data = 1141421081
buffer #79:
time = 1000001581000
data = -1610907069
buffer #80:
time = 1000001601000
data = 618796265
buffer #81:
time = 1000001621000
data = -1215656683
buffer #82:
time = 1000001641000
data = -1114458459
buffer #83:
time = 1000001661000
data = -1636339315
buffer #84:
time = 1000001681000
data = 64202531
buffer #85:
time = 1000001701000
data = 962072159
buffer #86:
time = 1000001721000
data = 1465578491
buffer #87:
time = 1000001741000
data = 763913335
buffer #88:
time = 1000001761000
data = -1776945453
buffer #89:
time = 1000001781000
data = 1963578515
buffer #90:
time = 1000001801000
data = 1396849729
buffer #91:
time = 1000001821000
data = -1757880153
buffer #92:
time = 1000001841000
data = -1513072133
buffer #93:
time = 1000001861000
data = -825468317
buffer #94:
time = 1000001881000
data = -1119517569
buffer #95:
time = 1000001901000
data = -1682539351
buffer #96:
time = 1000001921000
data = -338936383
buffer #97:
time = 1000001941000
data = 640258829
buffer #98:
time = 1000001961000
data = 518391013
buffer #99:
time = 1000001981000
data = 1113464779
buffer #100:
time = 1000002001000
data = 1163161749
buffer #101:
time = 1000002021000
data = 1357608283
buffer #102:
time = 1000002041000
data = 266681923
buffer #103:
time = 1000002061000
data = -1129113563
buffer #104:
time = 1000002081000
data = 440062567
buffer #105:
time = 1000002101000
data = 1780617875
buffer #106:
time = 1000002121000
data = 1016591629
buffer #107:
time = 1000002141000
data = 693345049
buffer #108:
time = 1000002161000
data = -1351515719
buffer #109:
time = 1000002181000
data = -2005668853
buffer #110:
time = 1000002201000
data = -1391283515
buffer #111:
time = 1000002221000
data = 699543167
buffer #112:
time = 1000002241000
data = 968177873
buffer #113:
time = 1000002261000
data = 781911753
buffer #114:
time = 1000002281000
data = -1748840997
buffer #115:
time = 1000002301000
data = 691162133
buffer #116:
time = 1000002321000
data = 173373191
buffer #117:
time = 1000002341000
data = -1415383261
buffer #118:
time = 1000002361000
data = 435979225
buffer #119:
time = 1000002381000
data = -1887475753
buffer #120:
time = 1000002401000
data = -1656188097
buffer #121:
time = 1000002421000
data = -594044985
buffer #122:
time = 1000002441000
data = -227823323
buffer #123:
time = 1000002461000
data = 491582213
buffer #124:
time = 1000002481000
data = 1197541921
buffer #125:
time = 1000002501000
data = 1310154681
buffer #126:
time = 1000002521000
data = -720743991
buffer #127:
time = 1000002541000
data = 1519328143
buffer #128:
time = 1000002561000
data = 430216935
buffer #129:
time = 1000002581000
data = -174631187
buffer #130:
time = 1000002601000
data = -1359584639
buffer #131:
time = 1000002621000
data = 1891986822
buffer #132:
time = 1000002641000
data = -584811423
buffer #133:
time = 1000002661000
data = 387775129
buffer #134:
time = 1000002681000
data = -2025905685
buffer #135:
time = 1000002701000
data = -984159847
buffer #136:
time = 1000002721000
data = 1641596033

View File

@ -0,0 +1,422 @@
AudioSink:
buffer count = 138
discontinuity:
config:
pcmEncoding = 2
channelCount = 6
sampleRate = 48000
outputChannels = [0, 2, 1, 5, 3, 4]
buffer #0:
time = 1000000000000
data = 376017869
buffer #1:
time = 1000000021000
data = -1501081867
buffer #2:
time = 1000000041000
data = -1886525659
buffer #3:
time = 1000000061000
data = 1927220572
buffer #4:
time = 1000000081000
data = 1788008940
buffer #5:
time = 1000000101000
data = -15902575
buffer #6:
time = 1000000121000
data = -1301740855
buffer #7:
time = 1000000141000
data = 621832609
buffer #8:
time = 1000000161000
data = -1588303803
buffer #9:
time = 1000000181000
data = 423082548
buffer #10:
time = 1000000201000
data = 808505936
buffer #11:
time = 1000000221000
data = -1092493157
buffer #12:
time = 1000000241000
data = -725659694
buffer #13:
time = 1000000261000
data = -722218981
buffer #14:
time = 1000000281000
data = 280616064
buffer #15:
time = 1000000301000
data = 1182192471
buffer #16:
time = 1000000321000
data = 375143304
buffer #17:
time = 1000000341000
data = -474611788
buffer #18:
time = 1000000361000
data = 315949873
buffer #19:
time = 1000000381000
data = -1751860033
buffer #20:
time = 1000000401000
data = -2141575433
buffer #21:
time = 1000000421000
data = -1759699799
buffer #22:
time = 1000000441000
data = -1006359333
buffer #23:
time = 1000000461000
data = -243379314
buffer #24:
time = 1000000481000
data = -1627306664
buffer #25:
time = 1000000501000
data = -757395606
buffer #26:
time = 1000000521000
data = -903517963
buffer #27:
time = 1000000541000
data = 758333744
buffer #28:
time = 1000000561000
data = -353919780
buffer #29:
time = 1000000581000
data = 1573994512
buffer #30:
time = 1000000601000
data = 454984797
buffer #31:
time = 1000000621000
data = 121370022
buffer #32:
time = 1000000641000
data = -1549807559
buffer #33:
time = 1000000661000
data = -660414046
buffer #34:
time = 1000000681000
data = -2068819284
buffer #35:
time = 1000000701000
data = -1759557231
buffer #36:
time = 1000000721000
data = -216211463
buffer #37:
time = 1000000741000
data = -270655305
buffer #38:
time = 1000000761000
data = 1904218932
buffer #39:
time = 1000000781000
data = -457511627
buffer #40:
time = 1000000801000
data = -916250571
buffer #41:
time = 1000000821000
data = -1352402544
buffer #42:
time = 1000000841000
data = -1406715357
buffer #43:
time = 1000000861000
data = -160423302
buffer #44:
time = 1000000881000
data = -562315050
buffer #45:
time = 1000000901000
data = -1285137896
buffer #46:
time = 1000000921000
data = 967514144
buffer #47:
time = 1000000941000
data = -443593130
buffer #48:
time = 1000000961000
data = -2053337994
buffer #49:
time = 1000000981000
data = 1306897911
buffer #50:
time = 1000001001000
data = -629261608
buffer #51:
time = 1000001021000
data = -197988143
buffer #52:
time = 1000001041000
data = 1951060329
buffer #53:
time = 1000001061000
data = 1516494919
buffer #54:
time = 1000001081000
data = 1742589018
buffer #55:
time = 1000001101000
data = 1121562002
buffer #56:
time = 1000001121000
data = -1596344281
buffer #57:
time = 1000001141000
data = -969305045
buffer #58:
time = 1000001161000
data = 364275722
buffer #59:
time = 1000001181000
data = -233188688
buffer #60:
time = 1000001201000
data = -1021462703
buffer #61:
time = 1000001221000
data = 1064140860
buffer #62:
time = 1000001241000
data = -236898679
buffer #63:
time = 1000001261000
data = -359764648
buffer #64:
time = 1000001281000
data = -1723302464
buffer #65:
time = 1000001301000
data = 2076862288
buffer #66:
time = 1000001321000
data = 2015097443
buffer #67:
time = 1000001341000
data = -955703828
buffer #68:
time = 1000001361000
data = 1573244659
buffer #69:
time = 1000001381000
data = -1421036943
buffer #70:
time = 1000001401000
data = 1938324900
buffer #71:
time = 1000001421000
data = 1088878684
buffer #72:
time = 1000001441000
data = 1597579555
buffer #73:
time = 1000001461000
data = 1497574278
buffer #74:
time = 1000001481000
data = -1756604247
buffer #75:
time = 1000001501000
data = 368515147
buffer #76:
time = 1000001521000
data = 512395852
buffer #77:
time = 1000001541000
data = 564365812
buffer #78:
time = 1000001561000
data = 1873249477
buffer #79:
time = 1000001581000
data = -1781707030
buffer #80:
time = 1000001601000
data = 1012903106
buffer #81:
time = 1000001621000
data = -1092012755
buffer #82:
time = 1000001641000
data = 952876824
buffer #83:
time = 1000001661000
data = -1424480890
buffer #84:
time = 1000001681000
data = 1120937431
buffer #85:
time = 1000001701000
data = -1626344703
buffer #86:
time = 1000001721000
data = 1882664532
buffer #87:
time = 1000001741000
data = -1175892393
buffer #88:
time = 1000001761000
data = 2077583079
buffer #89:
time = 1000001781000
data = -581217660
buffer #90:
time = 1000001801000
data = 377904743
buffer #91:
time = 1000001821000
data = -1084595157
buffer #92:
time = 1000001841000
data = 1289312847
buffer #93:
time = 1000001861000
data = 318127398
buffer #94:
time = 1000001881000
data = -1054665983
buffer #95:
time = 1000001901000
data = 1311800220
buffer #96:
time = 1000001921000
data = 1083373864
buffer #97:
time = 1000001941000
data = -1575279712
buffer #98:
time = 1000001961000
data = 1903786940
buffer #99:
time = 1000001981000
data = 968132978
buffer #100:
time = 1000002001000
data = 1732190865
buffer #101:
time = 1000002021000
data = 1820905719
buffer #102:
time = 1000002041000
data = 377136640
buffer #103:
time = 1000002061000
data = -461752511
buffer #104:
time = 1000002081000
data = -1669510266
buffer #105:
time = 1000002101000
data = 399842824
buffer #106:
time = 1000002121000
data = 939150450
buffer #107:
time = 1000002141000
data = -739412407
buffer #108:
time = 1000002161000
data = -1094682025
buffer #109:
time = 1000002181000
data = 1243234514
buffer #110:
time = 1000002201000
data = -299900960
buffer #111:
time = 1000002221000
data = 1491665369
buffer #112:
time = 1000002241000
data = 195073085
buffer #113:
time = 1000002261000
data = -1719454940
buffer #114:
time = 1000002281000
data = -744492884
buffer #115:
time = 1000002301000
data = 821067246
buffer #116:
time = 1000002321000
data = -1434851338
buffer #117:
time = 1000002341000
data = 779094816
buffer #118:
time = 1000002361000
data = -330715311
buffer #119:
time = 1000002381000
data = 1225236580
buffer #120:
time = 1000002401000
data = 1592040991
buffer #121:
time = 1000002421000
data = -996563326
buffer #122:
time = 1000002441000
data = -494589605
buffer #123:
time = 1000002461000
data = -1330262588
buffer #124:
time = 1000002481000
data = -1486074683
buffer #125:
time = 1000002501000
data = 484577868
buffer #126:
time = 1000002521000
data = 273883133
buffer #127:
time = 1000002541000
data = -11420506
buffer #128:
time = 1000002561000
data = 1904154495
buffer #129:
time = 1000002581000
data = 516576999
buffer #130:
time = 1000002601000
data = 845202278
buffer #131:
time = 1000002621000
data = 178229514
buffer #132:
time = 1000002641000
data = 153624742
buffer #133:
time = 1000002661000
data = -26049833
buffer #134:
time = 1000002681000
data = -1951469655
buffer #135:
time = 1000002701000
data = 1564577937
buffer #136:
time = 1000002721000
data = -660822929
buffer #137:
time = 1000002741000
data = -1352825612

View File

@ -45,7 +45,10 @@ public final class CapturingAudioSink extends ForwardingAudioSink implements Dum
throws ConfigurationException {
interceptedData.add(
new DumpableConfiguration(
inputFormat.pcmEncoding, inputFormat.channelCount, inputFormat.sampleRate));
inputFormat.pcmEncoding,
inputFormat.channelCount,
inputFormat.sampleRate,
outputChannels));
super.configure(inputFormat, specifiedBufferSize, outputChannels);
}
@ -103,12 +106,17 @@ public final class CapturingAudioSink extends ForwardingAudioSink implements Dum
private final @C.PcmEncoding int inputPcmEncoding;
private final int inputChannelCount;
private final int inputSampleRate;
@Nullable private final int[] outputChannels;
public DumpableConfiguration(
@C.PcmEncoding int inputPcmEncoding, int inputChannelCount, int inputSampleRate) {
@C.PcmEncoding int inputPcmEncoding,
int inputChannelCount,
int inputSampleRate,
@Nullable int[] outputChannels) {
this.inputPcmEncoding = inputPcmEncoding;
this.inputChannelCount = inputChannelCount;
this.inputSampleRate = inputSampleRate;
this.outputChannels = outputChannels;
}
@Override
@ -117,8 +125,11 @@ public final class CapturingAudioSink extends ForwardingAudioSink implements Dum
.startBlock("config")
.add("pcmEncoding", inputPcmEncoding)
.add("channelCount", inputChannelCount)
.add("sampleRate", inputSampleRate)
.endBlock();
.add("sampleRate", inputSampleRate);
if (outputChannels != null) {
dumper.add("outputChannels", Arrays.toString(outputChannels));
}
dumper.endBlock();
}
}