Make Opus codec-specific data match the platform.

Issue: #690
This commit is contained in:
Oliver Woodman 2015-08-19 16:34:59 +01:00
parent 02f1efd118
commit cde1c27e2b
3 changed files with 16 additions and 8 deletions

View File

@ -31,6 +31,7 @@ import com.google.android.exoplayer.util.MimeTypes;
import android.os.Handler; import android.os.Handler;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.List; import java.util.List;
/** /**
@ -165,12 +166,13 @@ public final class LibopusAudioTrackRenderer extends SampleSourceTrackRenderer
long codecDelayNs = -1; long codecDelayNs = -1;
long seekPreRollNs = -1; long seekPreRollNs = -1;
if (initializationData.size() == 3) { if (initializationData.size() == 3) {
if (initializationData.get(1).length != Long.SIZE if (initializationData.get(1).length != 8 || initializationData.get(2).length != 8) {
|| initializationData.get(2).length != Long.SIZE) {
throw new ExoPlaybackException("Invalid Codec Delay or Seek Preroll"); throw new ExoPlaybackException("Invalid Codec Delay or Seek Preroll");
} }
codecDelayNs = ByteBuffer.wrap(initializationData.get(1)).getLong(); codecDelayNs =
seekPreRollNs = ByteBuffer.wrap(initializationData.get(2)).getLong(); ByteBuffer.wrap(initializationData.get(1)).order(ByteOrder.LITTLE_ENDIAN).getLong();
seekPreRollNs =
ByteBuffer.wrap(initializationData.get(2)).order(ByteOrder.LITTLE_ENDIAN).getLong();
} }
try { try {
decoder = new OpusDecoderWrapper(initializationData.get(0), codecDelayNs, seekPreRollNs); decoder = new OpusDecoderWrapper(initializationData.get(0), codecDelayNs, seekPreRollNs);

View File

@ -34,6 +34,7 @@ import android.test.InstrumentationTestCase;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays; import java.util.Arrays;
import java.util.UUID; import java.util.UUID;
@ -731,8 +732,10 @@ public final class WebmExtractorTest extends InstrumentationTestCase {
assertEquals(3, format.initializationData.size()); assertEquals(3, format.initializationData.size());
android.test.MoreAsserts.assertEquals(TEST_OPUS_CODEC_PRIVATE, android.test.MoreAsserts.assertEquals(TEST_OPUS_CODEC_PRIVATE,
format.initializationData.get(0)); format.initializationData.get(0));
assertEquals(TEST_CODEC_DELAY, ByteBuffer.wrap(format.initializationData.get(1)).getLong()); assertEquals(TEST_CODEC_DELAY, ByteBuffer.wrap(format.initializationData.get(1))
assertEquals(TEST_SEEK_PRE_ROLL, ByteBuffer.wrap(format.initializationData.get(2)).getLong()); .order(ByteOrder.LITTLE_ENDIAN).getLong());
assertEquals(TEST_SEEK_PRE_ROLL, ByteBuffer.wrap(format.initializationData.get(2))
.order(ByteOrder.LITTLE_ENDIAN).getLong());
} else if (MimeTypes.AUDIO_VORBIS.equals(expectedMimeType)) { } else if (MimeTypes.AUDIO_VORBIS.equals(expectedMimeType)) {
assertEquals(2, format.initializationData.size()); assertEquals(2, format.initializationData.size());
assertEquals(TEST_VORBIS_INFO_SIZE, format.initializationData.get(0).length); assertEquals(TEST_VORBIS_INFO_SIZE, format.initializationData.get(0).length);

View File

@ -37,6 +37,7 @@ import android.util.Pair;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -1104,8 +1105,10 @@ public final class WebmExtractor implements Extractor {
maxInputSize = OPUS_MAX_INPUT_SIZE; maxInputSize = OPUS_MAX_INPUT_SIZE;
initializationData = new ArrayList<>(3); initializationData = new ArrayList<>(3);
initializationData.add(codecPrivate); initializationData.add(codecPrivate);
initializationData.add(ByteBuffer.allocate(Long.SIZE).putLong(codecDelayNs).array()); initializationData.add(
initializationData.add(ByteBuffer.allocate(Long.SIZE).putLong(seekPreRollNs).array()); ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(codecDelayNs).array());
initializationData.add(
ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(seekPreRollNs).array());
break; break;
case CODEC_ID_AAC: case CODEC_ID_AAC:
mimeType = MimeTypes.AUDIO_AAC; mimeType = MimeTypes.AUDIO_AAC;