From 44693592612aaed47cda1af74fb70527971f833d Mon Sep 17 00:00:00 2001 From: Matteo Campana Date: Mon, 11 Apr 2016 10:11:24 +0200 Subject: [PATCH] Implement dynamic change of Opus ptime parameter. --- src/org/jitsi/impl/neomedia/MediaUtils.java | 8 +++- .../neomedia/codec/audio/opus/JNIEncoder.java | 44 ++++++++++++++++++- .../service/neomedia/codec/Constants.java | 5 +++ 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/MediaUtils.java b/src/org/jitsi/impl/neomedia/MediaUtils.java index 5d0730123..f59a2a64a 100644 --- a/src/org/jitsi/impl/neomedia/MediaUtils.java +++ b/src/org/jitsi/impl/neomedia/MediaUtils.java @@ -207,6 +207,12 @@ public class MediaUtils if(opusDtx) opusFormatParams.put("usedtx", "1"); //opusFormatParams.put("minptime", "10"); + + Map opusAdvancedParams + = new HashMap(); + String packetizationTime = Constants.PTIME; + opusAdvancedParams.put(packetizationTime, "20"); + addMediaFormats( MediaFormat.RTP_PAYLOAD_TYPE_UNKNOWN, Constants.OPUS, @@ -214,7 +220,7 @@ public class MediaUtils Constants.OPUS_RTP, 2, opusFormatParams, - null, + opusAdvancedParams, 48000); // Adaptive Multi-Rate Wideband (AMR-WB) diff --git a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java index f7d90fe33..299e00aec 100644 --- a/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java +++ b/src/org/jitsi/impl/neomedia/codec/audio/opus/JNIEncoder.java @@ -40,7 +40,8 @@ public class JNIEncoder extends AbstractCodec2 implements FormatParametersAwareCodec, - PacketLossAwareEncoder + PacketLossAwareEncoder, + AdvancedAttributesAwareCodec { /** * The Logger used by the JNIEncoder class and its @@ -175,7 +176,7 @@ public class JNIEncoder * instance. The possible values are: 2.5, 5, 10, 20, 40 and 60. The default * value is 20. */ - private final int frameSizeInMillis = 20; + private int frameSizeInMillis = 20; /** * The size in samples per channel of an audio frame input by this instance. @@ -603,4 +604,43 @@ public Format setInputFormat(Format format) } return setInputFormat; } + + /** + * Sets the additional attributes to attributes + * + * @param attributes The additional attributes to set + */ + @Override + public void setAdvancedAttributes(Map attributes) + { + try + { + String s = attributes.get(Constants.PTIME); + + if ((s != null) && (s.length() != 0)) + { + int ptime = Integer.parseInt(s); + + //only supported values are allowed (3, 5, 10, 20, 40 and 60) + //https://tools.ietf.org/html/rfc7587 + if (ptime == 3 || ptime == 5 || ptime == 10 || + ptime == 20 || ptime == 40 || ptime == 60) + frameSizeInMillis = ptime; + + //recalculate frameSizeInSamplesPerChannel and frameSizeInBytes + AudioFormat inputFormat = (AudioFormat) getInputFormat(); + int sampleRate = (int) inputFormat.getSampleRate(); + frameSizeInSamplesPerChannel + = (sampleRate * frameSizeInMillis) / 1000; + frameSizeInBytes + = 2 /* sizeof(opus_int16) */ + * channels + * frameSizeInSamplesPerChannel; + } + } + catch (Exception e) + { + // Ignore + } + } } diff --git a/src/org/jitsi/service/neomedia/codec/Constants.java b/src/org/jitsi/service/neomedia/codec/Constants.java index b3837f0ff..f15ebdd3e 100644 --- a/src/org/jitsi/service/neomedia/codec/Constants.java +++ b/src/org/jitsi/service/neomedia/codec/Constants.java @@ -106,6 +106,11 @@ public class Constants */ public static final String ILBC_RTP = ILBC + _RTP; + /** + * The ptime constant. + */ + public static final String PTIME = "ptime"; + /** * The opus constant. */