diff --git a/libraries/common/src/main/java/androidx/media3/common/C.java b/libraries/common/src/main/java/androidx/media3/common/C.java
index 968253e4b3..ac44ebb603 100644
--- a/libraries/common/src/main/java/androidx/media3/common/C.java
+++ b/libraries/common/src/main/java/androidx/media3/common/C.java
@@ -196,7 +196,7 @@ public final class C {
* #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link #ENCODING_PCM_32BIT},
* {@link #ENCODING_PCM_FLOAT}, {@link #ENCODING_MP3}, {@link #ENCODING_AC3}, {@link
* #ENCODING_E_AC3}, {@link #ENCODING_E_AC3_JOC}, {@link #ENCODING_AC4}, {@link #ENCODING_DTS},
- * {@link #ENCODING_DTS_HD} or {@link #ENCODING_DOLBY_TRUEHD}.
+ * {@link #ENCODING_DTS_HD}, {@link #ENCODING_DOLBY_TRUEHD} or {@link #ENCODING_OPUS}.
*/
@UnstableApi
@Documented
@@ -224,7 +224,8 @@ public final class C {
ENCODING_AC4,
ENCODING_DTS,
ENCODING_DTS_HD,
- ENCODING_DOLBY_TRUEHD
+ ENCODING_DOLBY_TRUEHD,
+ ENCODING_OPUS,
})
public @interface Encoding {}
@@ -325,6 +326,10 @@ public final class C {
* @see AudioFormat#ENCODING_DOLBY_TRUEHD
*/
@UnstableApi public static final int ENCODING_DOLBY_TRUEHD = AudioFormat.ENCODING_DOLBY_TRUEHD;
+ /**
+ * @see AudioFormat#ENCODING_OPUS
+ */
+ @UnstableApi public static final int ENCODING_OPUS = AudioFormat.ENCODING_OPUS;
/** Represents the behavior affecting whether spatialization will be used. */
@Documented
diff --git a/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java b/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java
index 859773b2a6..1bcab6a3ee 100644
--- a/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java
+++ b/libraries/common/src/main/java/androidx/media3/common/MimeTypes.java
@@ -587,6 +587,8 @@ public final class MimeTypes {
return C.ENCODING_DTS_HD;
case MimeTypes.AUDIO_TRUEHD:
return C.ENCODING_DOLBY_TRUEHD;
+ case MimeTypes.AUDIO_OPUS:
+ return C.ENCODING_OPUS;
default:
return C.ENCODING_INVALID;
}
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
index 605f5f0d44..4adcffdaf8 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java
@@ -60,6 +60,7 @@ import androidx.media3.extractor.Ac3Util;
import androidx.media3.extractor.Ac4Util;
import androidx.media3.extractor.DtsUtil;
import androidx.media3.extractor.MpegAudioUtil;
+import androidx.media3.extractor.OpusUtil;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.InlineMe;
import com.google.errorprone.annotations.InlineMeValidationDisabled;
@@ -1787,6 +1788,8 @@ public final class DefaultAudioSink implements AudioSink {
? 0
: (Ac3Util.parseTrueHdSyncframeAudioSampleCount(buffer, syncframeOffset)
* Ac3Util.TRUEHD_RECHUNK_SAMPLE_COUNT);
+ case C.ENCODING_OPUS:
+ return OpusUtil.parsePacketAudioSampleCount(buffer);
case C.ENCODING_PCM_16BIT:
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
case C.ENCODING_PCM_24BIT:
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java
index 62c72a5722..317f06d05c 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java
@@ -32,6 +32,7 @@ import androidx.media3.extractor.Ac3Util;
import androidx.media3.extractor.Ac4Util;
import androidx.media3.extractor.DtsUtil;
import androidx.media3.extractor.MpegAudioUtil;
+import androidx.media3.extractor.OpusUtil;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
/** Provide the buffer size to use when creating an {@link AudioTrack}. */
@@ -255,6 +256,8 @@ public class DefaultAudioTrackBufferSizeProvider
return DtsUtil.DTS_HD_MAX_RATE_BYTES_PER_SECOND;
case C.ENCODING_DOLBY_TRUEHD:
return Ac3Util.TRUEHD_MAX_RATE_BYTES_PER_SECOND;
+ case C.ENCODING_OPUS:
+ return OpusUtil.MAX_BYTES_PER_SECOND;
case C.ENCODING_PCM_16BIT:
case C.ENCODING_PCM_16BIT_BIG_ENDIAN:
case C.ENCODING_PCM_24BIT:
diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/OpusUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/OpusUtil.java
index 81a1adedd1..a1ecff461e 100644
--- a/libraries/extractor/src/main/java/androidx/media3/extractor/OpusUtil.java
+++ b/libraries/extractor/src/main/java/androidx/media3/extractor/OpusUtil.java
@@ -29,6 +29,9 @@ public class OpusUtil {
/** Opus streams are always 48000 Hz. */
public static final int SAMPLE_RATE = 48_000;
+ /** Maximum achievable Opus bitrate. */
+ public static final int MAX_BYTES_PER_SECOND = 510 * 1000 / 8; // See RFC 6716. Section 2.1.1
+
private static final int DEFAULT_SEEK_PRE_ROLL_SAMPLES = 3840;
private static final int FULL_CODEC_INITIALIZATION_DATA_BUFFER_COUNT = 3;
@@ -63,6 +66,62 @@ public class OpusUtil {
return initializationData;
}
+ /**
+ * Returns the number of audio samples in the given audio packet.
+ *
+ *
The buffer's position is not modified.
+ *
+ * @param buffer The audio packet.
+ * @return Returns the number of audio samples in the packet.
+ */
+ public static int parsePacketAudioSampleCount(ByteBuffer buffer) {
+ long packetDurationUs =
+ getPacketDurationUs(buffer.get(0), buffer.limit() > 1 ? buffer.get(1) : 0);
+ return (int) (packetDurationUs * SAMPLE_RATE / C.MICROS_PER_SECOND);
+ }
+
+ /**
+ * Returns the duration of the given audio packet.
+ *
+ * @param buffer The audio packet.
+ * @return Returns the duration of the given audio packet, in microseconds.
+ */
+ public static long getPacketDurationUs(byte[] buffer) {
+ return getPacketDurationUs(buffer[0], buffer.length > 1 ? buffer[1] : 0);
+ }
+
+ private static long getPacketDurationUs(byte packetByte0, byte packetByte1) {
+ // See RFC6716, Sections 3.1 and 3.2.
+ int toc = packetByte0 & 0xFF;
+ int frames;
+ switch (toc & 0x3) {
+ case 0:
+ frames = 1;
+ break;
+ case 1:
+ case 2:
+ frames = 2;
+ break;
+ default:
+ frames = packetByte1 & 0x3F;
+ break;
+ }
+
+ int config = toc >> 3;
+ int length = config & 0x3;
+ int frameDurationUs;
+ if (config >= 16) {
+ frameDurationUs = 2500 << length;
+ } else if (config >= 12) {
+ frameDurationUs = 10000 << (length & 0x1);
+ } else if (length == 3) {
+ frameDurationUs = 60000;
+ } else {
+ frameDurationUs = 10000 << length;
+ }
+ return (long) frames * frameDurationUs;
+ }
+
private static int getPreSkipSamples(byte[] header) {
return ((header[11] & 0xFF) << 8) | (header[10] & 0xFF);
}
diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OpusReader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OpusReader.java
index 95996f6a80..00e12a7b56 100644
--- a/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OpusReader.java
+++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OpusReader.java
@@ -54,7 +54,7 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
@Override
protected long preparePayload(ParsableByteArray packet) {
- return convertTimeToGranule(getPacketDurationUs(packet.getData()));
+ return convertTimeToGranule(OpusUtil.getPacketDurationUs(packet.getData()));
}
@Override
@@ -121,42 +121,6 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
}
}
- /**
- * Returns the duration of the given audio packet.
- *
- * @param packet Contains audio data.
- * @return Returns the duration of the given audio packet.
- */
- private long getPacketDurationUs(byte[] packet) {
- int toc = packet[0] & 0xFF;
- int frames;
- switch (toc & 0x3) {
- case 0:
- frames = 1;
- break;
- case 1:
- case 2:
- frames = 2;
- break;
- default:
- frames = packet[1] & 0x3F;
- break;
- }
-
- int config = toc >> 3;
- int length = config & 0x3;
- if (config >= 16) {
- length = 2500 << length;
- } else if (config >= 12) {
- length = 10000 << (length & 0x1);
- } else if (length == 3) {
- length = 60000;
- } else {
- length = 10000 << length;
- }
- return (long) frames * length;
- }
-
/**
* Returns true if the given {@link ParsableByteArray} starts with {@code expectedPrefix}. Does
* not change the {@link ParsableByteArray#getPosition() position} of {@code packet}.
diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/OpusUtilTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/OpusUtilTest.java
index 1bc6b3431c..48c74327c2 100644
--- a/libraries/extractor/src/test/java/androidx/media3/extractor/OpusUtilTest.java
+++ b/libraries/extractor/src/test/java/androidx/media3/extractor/OpusUtilTest.java
@@ -15,6 +15,7 @@
*/
package androidx.media3.extractor;
+import static androidx.media3.common.util.Util.getBytesFromHexString;
import static com.google.common.truth.Truth.assertThat;
import androidx.media3.common.C;
@@ -41,8 +42,9 @@ public final class OpusUtilTest {
buildNativeOrderByteArray(sampleCountToNanoseconds(DEFAULT_SEEK_PRE_ROLL_SAMPLES));
@Test
- public void buildInitializationData() {
+ public void buildInitializationData_returnsExpectedHeaderWithPreSkipAndPreRoll() {
List initializationData = OpusUtil.buildInitializationData(HEADER);
+
assertThat(initializationData).hasSize(3);
assertThat(initializationData.get(0)).isEqualTo(HEADER);
assertThat(initializationData.get(1)).isEqualTo(HEADER_PRE_SKIP_BYTES);
@@ -50,11 +52,576 @@ public final class OpusUtilTest {
}
@Test
- public void getChannelCount() {
+ public void getChannelCount_returnsChannelCount() {
int channelCount = OpusUtil.getChannelCount(HEADER);
+
assertThat(channelCount).isEqualTo(2);
}
+ @Test
+ public void getPacketDurationUs_code0_returnsExpectedDuration() {
+ long config0DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("04"));
+ long config1DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("0C"));
+ long config2DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("14"));
+ long config3DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("1C"));
+ long config4DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("24"));
+ long config5DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("2C"));
+ long config6DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("34"));
+ long config7DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("3C"));
+ long config8DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("44"));
+ long config9DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("4C"));
+ long config10DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("54"));
+ long config11DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("5C"));
+ long config12DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("64"));
+ long config13DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("6C"));
+ long config14DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("74"));
+ long config15DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("7C"));
+ long config16DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("84"));
+ long config17DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("8C"));
+ long config18DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("94"));
+ long config19DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("9C"));
+ long config20DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("A4"));
+ long config21DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("AC"));
+ long config22DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("B4"));
+ long config23DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("BC"));
+ long config24DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("C4"));
+ long config25DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("CC"));
+ long config26DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("D4"));
+ long config27DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("DC"));
+ long config28DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("E4"));
+ long config29DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("EC"));
+ long config30DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("F4"));
+ long config31DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("FC"));
+
+ assertThat(config0DurationUs).isEqualTo(10_000);
+ assertThat(config1DurationUs).isEqualTo(20_000);
+ assertThat(config2DurationUs).isEqualTo(40_000);
+ assertThat(config3DurationUs).isEqualTo(60_000);
+ assertThat(config4DurationUs).isEqualTo(10_000);
+ assertThat(config5DurationUs).isEqualTo(20_000);
+ assertThat(config6DurationUs).isEqualTo(40_000);
+ assertThat(config7DurationUs).isEqualTo(60_000);
+ assertThat(config8DurationUs).isEqualTo(10_000);
+ assertThat(config9DurationUs).isEqualTo(20_000);
+ assertThat(config10DurationUs).isEqualTo(40_000);
+ assertThat(config11DurationUs).isEqualTo(60_000);
+ assertThat(config12DurationUs).isEqualTo(10_000);
+ assertThat(config13DurationUs).isEqualTo(20_000);
+ assertThat(config14DurationUs).isEqualTo(10_000);
+ assertThat(config15DurationUs).isEqualTo(20_000);
+ assertThat(config16DurationUs).isEqualTo(2_500);
+ assertThat(config17DurationUs).isEqualTo(5_000);
+ assertThat(config18DurationUs).isEqualTo(10_000);
+ assertThat(config19DurationUs).isEqualTo(20_000);
+ assertThat(config20DurationUs).isEqualTo(2_500);
+ assertThat(config21DurationUs).isEqualTo(5_000);
+ assertThat(config22DurationUs).isEqualTo(10_000);
+ assertThat(config23DurationUs).isEqualTo(20_000);
+ assertThat(config24DurationUs).isEqualTo(2_500);
+ assertThat(config25DurationUs).isEqualTo(5_000);
+ assertThat(config26DurationUs).isEqualTo(10_000);
+ assertThat(config27DurationUs).isEqualTo(20_000);
+ assertThat(config28DurationUs).isEqualTo(2_500);
+ assertThat(config29DurationUs).isEqualTo(5_000);
+ assertThat(config30DurationUs).isEqualTo(10_000);
+ assertThat(config31DurationUs).isEqualTo(20_000);
+ }
+
+ @Test
+ public void getPacketDurationUs_code1_returnsExpectedDuration() {
+ long config0DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("05"));
+ long config1DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("0D"));
+ long config2DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("15"));
+ long config3DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("1D"));
+ long config4DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("25"));
+ long config5DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("2D"));
+ long config6DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("35"));
+ long config7DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("3D"));
+ long config8DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("45"));
+ long config9DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("4D"));
+ long config10DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("55"));
+ long config11DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("5D"));
+ long config12DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("65"));
+ long config13DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("6D"));
+ long config14DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("75"));
+ long config15DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("7D"));
+ long config16DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("85"));
+ long config17DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("8D"));
+ long config18DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("95"));
+ long config19DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("9D"));
+ long config20DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("A5"));
+ long config21DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("AD"));
+ long config22DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("B5"));
+ long config23DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("BD"));
+ long config24DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("C5"));
+ long config25DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("CD"));
+ long config26DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("D5"));
+ long config27DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("DD"));
+ long config28DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("E5"));
+ long config29DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("ED"));
+ long config30DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("F5"));
+ long config31DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("FD"));
+
+ assertThat(config0DurationUs).isEqualTo(20_000);
+ assertThat(config1DurationUs).isEqualTo(40_000);
+ assertThat(config2DurationUs).isEqualTo(80_000);
+ assertThat(config3DurationUs).isEqualTo(120_000);
+ assertThat(config4DurationUs).isEqualTo(20_000);
+ assertThat(config5DurationUs).isEqualTo(40_000);
+ assertThat(config6DurationUs).isEqualTo(80_000);
+ assertThat(config7DurationUs).isEqualTo(120_000);
+ assertThat(config8DurationUs).isEqualTo(20_000);
+ assertThat(config9DurationUs).isEqualTo(40_000);
+ assertThat(config10DurationUs).isEqualTo(80_000);
+ assertThat(config11DurationUs).isEqualTo(120_000);
+ assertThat(config12DurationUs).isEqualTo(20_000);
+ assertThat(config13DurationUs).isEqualTo(40_000);
+ assertThat(config14DurationUs).isEqualTo(20_000);
+ assertThat(config15DurationUs).isEqualTo(40_000);
+ assertThat(config16DurationUs).isEqualTo(5_000);
+ assertThat(config17DurationUs).isEqualTo(10_000);
+ assertThat(config18DurationUs).isEqualTo(20_000);
+ assertThat(config19DurationUs).isEqualTo(40_000);
+ assertThat(config20DurationUs).isEqualTo(5_000);
+ assertThat(config21DurationUs).isEqualTo(10_000);
+ assertThat(config22DurationUs).isEqualTo(20_000);
+ assertThat(config23DurationUs).isEqualTo(40_000);
+ assertThat(config24DurationUs).isEqualTo(5_000);
+ assertThat(config25DurationUs).isEqualTo(10_000);
+ assertThat(config26DurationUs).isEqualTo(20_000);
+ assertThat(config27DurationUs).isEqualTo(40_000);
+ assertThat(config28DurationUs).isEqualTo(5_000);
+ assertThat(config29DurationUs).isEqualTo(10_000);
+ assertThat(config30DurationUs).isEqualTo(20_000);
+ assertThat(config31DurationUs).isEqualTo(40_000);
+ }
+
+ @Test
+ public void getPacketDurationUs_code2_returnsExpectedDuration() {
+ long config0DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("06"));
+ long config1DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("0E"));
+ long config2DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("16"));
+ long config3DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("1E"));
+ long config4DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("26"));
+ long config5DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("2E"));
+ long config6DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("36"));
+ long config7DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("3E"));
+ long config8DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("46"));
+ long config9DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("4E"));
+ long config10DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("56"));
+ long config11DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("5E"));
+ long config12DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("66"));
+ long config13DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("6E"));
+ long config14DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("76"));
+ long config15DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("7E"));
+ long config16DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("86"));
+ long config17DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("8E"));
+ long config18DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("96"));
+ long config19DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("9E"));
+ long config20DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("A6"));
+ long config21DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("AE"));
+ long config22DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("B6"));
+ long config23DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("BE"));
+ long config24DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("C6"));
+ long config25DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("CE"));
+ long config26DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("D6"));
+ long config27DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("DE"));
+ long config28DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("E6"));
+ long config29DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("EE"));
+ long config30DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("F6"));
+ long config31DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("FE"));
+
+ assertThat(config0DurationUs).isEqualTo(20_000);
+ assertThat(config1DurationUs).isEqualTo(40_000);
+ assertThat(config2DurationUs).isEqualTo(80_000);
+ assertThat(config3DurationUs).isEqualTo(120_000);
+ assertThat(config4DurationUs).isEqualTo(20_000);
+ assertThat(config5DurationUs).isEqualTo(40_000);
+ assertThat(config6DurationUs).isEqualTo(80_000);
+ assertThat(config7DurationUs).isEqualTo(120_000);
+ assertThat(config8DurationUs).isEqualTo(20_000);
+ assertThat(config9DurationUs).isEqualTo(40_000);
+ assertThat(config10DurationUs).isEqualTo(80_000);
+ assertThat(config11DurationUs).isEqualTo(120_000);
+ assertThat(config12DurationUs).isEqualTo(20_000);
+ assertThat(config13DurationUs).isEqualTo(40_000);
+ assertThat(config14DurationUs).isEqualTo(20_000);
+ assertThat(config15DurationUs).isEqualTo(40_000);
+ assertThat(config16DurationUs).isEqualTo(5_000);
+ assertThat(config17DurationUs).isEqualTo(10_000);
+ assertThat(config18DurationUs).isEqualTo(20_000);
+ assertThat(config19DurationUs).isEqualTo(40_000);
+ assertThat(config20DurationUs).isEqualTo(5_000);
+ assertThat(config21DurationUs).isEqualTo(10_000);
+ assertThat(config22DurationUs).isEqualTo(20_000);
+ assertThat(config23DurationUs).isEqualTo(40_000);
+ assertThat(config24DurationUs).isEqualTo(5_000);
+ assertThat(config25DurationUs).isEqualTo(10_000);
+ assertThat(config26DurationUs).isEqualTo(20_000);
+ assertThat(config27DurationUs).isEqualTo(40_000);
+ assertThat(config28DurationUs).isEqualTo(5_000);
+ assertThat(config29DurationUs).isEqualTo(10_000);
+ assertThat(config30DurationUs).isEqualTo(20_000);
+ assertThat(config31DurationUs).isEqualTo(40_000);
+ }
+
+ @Test
+ public void getPacketDurationUs_code3_returnsExpectedDuration() {
+ // max possible frame count to reach 120ms duration
+ long config0DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("078C"));
+ long config1DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("0F86"));
+ long config2DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("1783"));
+ long config3DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("1F82"));
+ // frame count of 2
+ long config4DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("2782"));
+ long config5DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("2F82"));
+ long config6DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("3782"));
+ long config7DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("3F82"));
+ long config8DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("4782"));
+ long config9DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("4F82"));
+ long config10DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("5782"));
+ long config11DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("5F82"));
+ // max possible frame count to reach 120ms duration
+ long config12DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("678C"));
+ long config13DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("6F86"));
+ // frame count of 2
+ long config14DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("7782"));
+ long config15DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("7F82"));
+ // max possible frame count to reach 120ms duration
+ long config16DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("87B0"));
+ long config17DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("8F98"));
+ long config18DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("978C"));
+ long config19DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("9F86"));
+ // frame count of 2
+ long config20DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("A782"));
+ long config21DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("AF82"));
+ long config22DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("B782"));
+ long config23DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("BF82"));
+ long config24DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("C782"));
+ long config25DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("CF82"));
+ long config26DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("D782"));
+ long config27DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("DF82"));
+ long config28DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("E782"));
+ long config29DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("EF82"));
+ long config30DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("F782"));
+ long config31DurationUs = OpusUtil.getPacketDurationUs(getBytesFromHexString("FF82"));
+
+ assertThat(config0DurationUs).isEqualTo(120_000);
+ assertThat(config1DurationUs).isEqualTo(120_000);
+ assertThat(config2DurationUs).isEqualTo(120_000);
+ assertThat(config3DurationUs).isEqualTo(120_000);
+ assertThat(config4DurationUs).isEqualTo(20_000);
+ assertThat(config5DurationUs).isEqualTo(40_000);
+ assertThat(config6DurationUs).isEqualTo(80_000);
+ assertThat(config7DurationUs).isEqualTo(120_000);
+ assertThat(config8DurationUs).isEqualTo(20_000);
+ assertThat(config9DurationUs).isEqualTo(40_000);
+ assertThat(config10DurationUs).isEqualTo(80_000);
+ assertThat(config11DurationUs).isEqualTo(120_000);
+ assertThat(config12DurationUs).isEqualTo(120_000);
+ assertThat(config13DurationUs).isEqualTo(120_000);
+ assertThat(config14DurationUs).isEqualTo(20_000);
+ assertThat(config15DurationUs).isEqualTo(40_000);
+ assertThat(config16DurationUs).isEqualTo(120_000);
+ assertThat(config17DurationUs).isEqualTo(120_000);
+ assertThat(config18DurationUs).isEqualTo(120_000);
+ assertThat(config19DurationUs).isEqualTo(120_000);
+ assertThat(config20DurationUs).isEqualTo(5_000);
+ assertThat(config21DurationUs).isEqualTo(10_000);
+ assertThat(config22DurationUs).isEqualTo(20_000);
+ assertThat(config23DurationUs).isEqualTo(40_000);
+ assertThat(config24DurationUs).isEqualTo(5_000);
+ assertThat(config25DurationUs).isEqualTo(10_000);
+ assertThat(config26DurationUs).isEqualTo(20_000);
+ assertThat(config27DurationUs).isEqualTo(40_000);
+ assertThat(config28DurationUs).isEqualTo(5_000);
+ assertThat(config29DurationUs).isEqualTo(10_000);
+ assertThat(config30DurationUs).isEqualTo(20_000);
+ assertThat(config31DurationUs).isEqualTo(40_000);
+ }
+
+ @Test
+ public void getPacketAudioSampleCount_code0_returnsExpectedDuration() {
+ int config0SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("04"));
+ int config1SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("0C"));
+ int config2SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("14"));
+ int config3SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("1C"));
+ int config4SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("24"));
+ int config5SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("2C"));
+ int config6SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("34"));
+ int config7SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("3C"));
+ int config8SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("44"));
+ int config9SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("4C"));
+ int config10SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("54"));
+ int config11SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("5C"));
+ int config12SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("64"));
+ int config13SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("6C"));
+ int config14SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("74"));
+ int config15SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("7C"));
+ int config16SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("84"));
+ int config17SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("8C"));
+ int config18SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("94"));
+ int config19SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("9C"));
+ int config20SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("A4"));
+ int config21SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("AC"));
+ int config22SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("B4"));
+ int config23SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("BC"));
+ int config24SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("C4"));
+ int config25SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("CC"));
+ int config26SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("D4"));
+ int config27SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("DC"));
+ int config28SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("E4"));
+ int config29SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("EC"));
+ int config30SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("F4"));
+ int config31SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("FC"));
+
+ assertThat(config0SampleCount).isEqualTo(480);
+ assertThat(config1SampleCount).isEqualTo(960);
+ assertThat(config2SampleCount).isEqualTo(1920);
+ assertThat(config3SampleCount).isEqualTo(2880);
+ assertThat(config4SampleCount).isEqualTo(480);
+ assertThat(config5SampleCount).isEqualTo(960);
+ assertThat(config6SampleCount).isEqualTo(1920);
+ assertThat(config7SampleCount).isEqualTo(2880);
+ assertThat(config8SampleCount).isEqualTo(480);
+ assertThat(config9SampleCount).isEqualTo(960);
+ assertThat(config10SampleCount).isEqualTo(1920);
+ assertThat(config11SampleCount).isEqualTo(2880);
+ assertThat(config12SampleCount).isEqualTo(480);
+ assertThat(config13SampleCount).isEqualTo(960);
+ assertThat(config14SampleCount).isEqualTo(480);
+ assertThat(config15SampleCount).isEqualTo(960);
+ assertThat(config16SampleCount).isEqualTo(120);
+ assertThat(config17SampleCount).isEqualTo(240);
+ assertThat(config18SampleCount).isEqualTo(480);
+ assertThat(config19SampleCount).isEqualTo(960);
+ assertThat(config20SampleCount).isEqualTo(120);
+ assertThat(config21SampleCount).isEqualTo(240);
+ assertThat(config22SampleCount).isEqualTo(480);
+ assertThat(config23SampleCount).isEqualTo(960);
+ assertThat(config24SampleCount).isEqualTo(120);
+ assertThat(config25SampleCount).isEqualTo(240);
+ assertThat(config26SampleCount).isEqualTo(480);
+ assertThat(config27SampleCount).isEqualTo(960);
+ assertThat(config28SampleCount).isEqualTo(120);
+ assertThat(config29SampleCount).isEqualTo(240);
+ assertThat(config30SampleCount).isEqualTo(480);
+ assertThat(config31SampleCount).isEqualTo(960);
+ }
+
+ @Test
+ public void getPacketAudioSampleCount_code1_returnsExpectedDuration() {
+ int config0SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("05"));
+ int config1SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("0D"));
+ int config2SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("15"));
+ int config3SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("1D"));
+ int config4SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("25"));
+ int config5SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("2D"));
+ int config6SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("35"));
+ int config7SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("3D"));
+ int config8SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("45"));
+ int config9SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("4D"));
+ int config10SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("55"));
+ int config11SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("5D"));
+ int config12SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("65"));
+ int config13SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("6D"));
+ int config14SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("75"));
+ int config15SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("7D"));
+ int config16SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("85"));
+ int config17SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("8D"));
+ int config18SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("95"));
+ int config19SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("9D"));
+ int config20SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("A5"));
+ int config21SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("AD"));
+ int config22SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("B5"));
+ int config23SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("BD"));
+ int config24SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("C5"));
+ int config25SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("CD"));
+ int config26SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("D5"));
+ int config27SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("DD"));
+ int config28SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("E5"));
+ int config29SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("ED"));
+ int config30SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("F5"));
+ int config31SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("FD"));
+
+ assertThat(config0SampleCount).isEqualTo(960);
+ assertThat(config1SampleCount).isEqualTo(1920);
+ assertThat(config2SampleCount).isEqualTo(3840);
+ assertThat(config3SampleCount).isEqualTo(5760);
+ assertThat(config4SampleCount).isEqualTo(960);
+ assertThat(config5SampleCount).isEqualTo(1920);
+ assertThat(config6SampleCount).isEqualTo(3840);
+ assertThat(config7SampleCount).isEqualTo(5760);
+ assertThat(config8SampleCount).isEqualTo(960);
+ assertThat(config9SampleCount).isEqualTo(1920);
+ assertThat(config10SampleCount).isEqualTo(3840);
+ assertThat(config11SampleCount).isEqualTo(5760);
+ assertThat(config12SampleCount).isEqualTo(960);
+ assertThat(config13SampleCount).isEqualTo(1920);
+ assertThat(config14SampleCount).isEqualTo(960);
+ assertThat(config15SampleCount).isEqualTo(1920);
+ assertThat(config16SampleCount).isEqualTo(240);
+ assertThat(config17SampleCount).isEqualTo(480);
+ assertThat(config18SampleCount).isEqualTo(960);
+ assertThat(config19SampleCount).isEqualTo(1920);
+ assertThat(config20SampleCount).isEqualTo(240);
+ assertThat(config21SampleCount).isEqualTo(480);
+ assertThat(config22SampleCount).isEqualTo(960);
+ assertThat(config23SampleCount).isEqualTo(1920);
+ assertThat(config24SampleCount).isEqualTo(240);
+ assertThat(config25SampleCount).isEqualTo(480);
+ assertThat(config26SampleCount).isEqualTo(960);
+ assertThat(config27SampleCount).isEqualTo(1920);
+ assertThat(config28SampleCount).isEqualTo(240);
+ assertThat(config29SampleCount).isEqualTo(480);
+ assertThat(config30SampleCount).isEqualTo(960);
+ assertThat(config31SampleCount).isEqualTo(1920);
+ }
+
+ @Test
+ public void getPacketAudioSampleCount_code2_returnsExpectedDuration() {
+ int config0SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("06"));
+ int config1SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("0E"));
+ int config2SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("16"));
+ int config3SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("1E"));
+ int config4SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("26"));
+ int config5SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("2E"));
+ int config6SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("36"));
+ int config7SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("3E"));
+ int config8SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("46"));
+ int config9SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("4E"));
+ int config10SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("56"));
+ int config11SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("5E"));
+ int config12SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("66"));
+ int config13SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("6E"));
+ int config14SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("76"));
+ int config15SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("7E"));
+ int config16SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("86"));
+ int config17SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("8E"));
+ int config18SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("96"));
+ int config19SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("9E"));
+ int config20SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("A6"));
+ int config21SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("AE"));
+ int config22SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("B6"));
+ int config23SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("BE"));
+ int config24SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("C6"));
+ int config25SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("CE"));
+ int config26SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("D6"));
+ int config27SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("DE"));
+ int config28SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("E6"));
+ int config29SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("EE"));
+ int config30SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("F6"));
+ int config31SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("FE"));
+
+ assertThat(config0SampleCount).isEqualTo(960);
+ assertThat(config1SampleCount).isEqualTo(1920);
+ assertThat(config2SampleCount).isEqualTo(3840);
+ assertThat(config3SampleCount).isEqualTo(5760);
+ assertThat(config4SampleCount).isEqualTo(960);
+ assertThat(config5SampleCount).isEqualTo(1920);
+ assertThat(config6SampleCount).isEqualTo(3840);
+ assertThat(config7SampleCount).isEqualTo(5760);
+ assertThat(config8SampleCount).isEqualTo(960);
+ assertThat(config9SampleCount).isEqualTo(1920);
+ assertThat(config10SampleCount).isEqualTo(3840);
+ assertThat(config11SampleCount).isEqualTo(5760);
+ assertThat(config12SampleCount).isEqualTo(960);
+ assertThat(config13SampleCount).isEqualTo(1920);
+ assertThat(config14SampleCount).isEqualTo(960);
+ assertThat(config15SampleCount).isEqualTo(1920);
+ assertThat(config16SampleCount).isEqualTo(240);
+ assertThat(config17SampleCount).isEqualTo(480);
+ assertThat(config18SampleCount).isEqualTo(960);
+ assertThat(config19SampleCount).isEqualTo(1920);
+ assertThat(config20SampleCount).isEqualTo(240);
+ assertThat(config21SampleCount).isEqualTo(480);
+ assertThat(config22SampleCount).isEqualTo(960);
+ assertThat(config23SampleCount).isEqualTo(1920);
+ assertThat(config24SampleCount).isEqualTo(240);
+ assertThat(config25SampleCount).isEqualTo(480);
+ assertThat(config26SampleCount).isEqualTo(960);
+ assertThat(config27SampleCount).isEqualTo(1920);
+ assertThat(config28SampleCount).isEqualTo(240);
+ assertThat(config29SampleCount).isEqualTo(480);
+ assertThat(config30SampleCount).isEqualTo(960);
+ assertThat(config31SampleCount).isEqualTo(1920);
+ }
+
+ @Test
+ public void getPacketAudioSampleCount_code3_returnsExpectedDuration() {
+ // max possible frame count to reach 120ms duration
+ int config0SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("078C"));
+ int config1SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("0F86"));
+ int config2SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("1783"));
+ int config3SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("1F82"));
+ // frame count of 2
+ int config4SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("2782"));
+ int config5SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("2F82"));
+ int config6SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("3782"));
+ int config7SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("3F82"));
+ int config8SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("4782"));
+ int config9SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("4F82"));
+ int config10SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("5782"));
+ int config11SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("5F82"));
+ // max possible frame count to reach 120ms duration
+ int config12SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("678C"));
+ int config13SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("6F86"));
+ // frame count of 2
+ int config14SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("7782"));
+ int config15SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("7F82"));
+ // max possible frame count to reach 120ms duration
+ int config16SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("87B0"));
+ int config17SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("8F98"));
+ int config18SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("978C"));
+ int config19SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("9F86"));
+ // frame count of 2
+ int config20SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("A782"));
+ int config21SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("AF82"));
+ int config22SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("B782"));
+ int config23SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("BF82"));
+ int config24SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("C782"));
+ int config25SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("CF82"));
+ int config26SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("D782"));
+ int config27SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("DF82"));
+ int config28SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("E782"));
+ int config29SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("EF82"));
+ int config30SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("F782"));
+ int config31SampleCount = OpusUtil.parsePacketAudioSampleCount(getByteBuffer("FF82"));
+
+ assertThat(config0SampleCount).isEqualTo(5760);
+ assertThat(config1SampleCount).isEqualTo(5760);
+ assertThat(config2SampleCount).isEqualTo(5760);
+ assertThat(config3SampleCount).isEqualTo(5760);
+ assertThat(config4SampleCount).isEqualTo(960);
+ assertThat(config5SampleCount).isEqualTo(1920);
+ assertThat(config6SampleCount).isEqualTo(3840);
+ assertThat(config7SampleCount).isEqualTo(5760);
+ assertThat(config8SampleCount).isEqualTo(960);
+ assertThat(config9SampleCount).isEqualTo(1920);
+ assertThat(config10SampleCount).isEqualTo(3840);
+ assertThat(config11SampleCount).isEqualTo(5760);
+ assertThat(config12SampleCount).isEqualTo(5760);
+ assertThat(config13SampleCount).isEqualTo(5760);
+ assertThat(config14SampleCount).isEqualTo(960);
+ assertThat(config15SampleCount).isEqualTo(1920);
+ assertThat(config16SampleCount).isEqualTo(5760);
+ assertThat(config17SampleCount).isEqualTo(5760);
+ assertThat(config18SampleCount).isEqualTo(5760);
+ assertThat(config19SampleCount).isEqualTo(5760);
+ assertThat(config20SampleCount).isEqualTo(240);
+ assertThat(config21SampleCount).isEqualTo(480);
+ assertThat(config22SampleCount).isEqualTo(960);
+ assertThat(config23SampleCount).isEqualTo(1920);
+ assertThat(config24SampleCount).isEqualTo(240);
+ assertThat(config25SampleCount).isEqualTo(480);
+ assertThat(config26SampleCount).isEqualTo(960);
+ assertThat(config27SampleCount).isEqualTo(1920);
+ assertThat(config28SampleCount).isEqualTo(240);
+ assertThat(config29SampleCount).isEqualTo(480);
+ assertThat(config30SampleCount).isEqualTo(960);
+ assertThat(config31SampleCount).isEqualTo(1920);
+ }
+
private static long sampleCountToNanoseconds(long sampleCount) {
return (sampleCount * C.NANOS_PER_SECOND) / OpusUtil.SAMPLE_RATE;
}
@@ -62,4 +629,8 @@ public final class OpusUtilTest {
private static byte[] buildNativeOrderByteArray(long value) {
return ByteBuffer.allocate(8).order(ByteOrder.nativeOrder()).putLong(value).array();
}
+
+ private static ByteBuffer getByteBuffer(String hexString) {
+ return ByteBuffer.wrap(getBytesFromHexString(hexString));
+ }
}