From bc4beb06fdbd64c92abe81f88dfe293f305d2188 Mon Sep 17 00:00:00 2001 From: Boris Grozev <boris@jitsi.org> Date: Fri, 20 Jun 2014 10:14:45 +0200 Subject: [PATCH] Adds RED and ULPFEC to MediaStreamImpl. --- .../jitsi/impl/neomedia/MediaStreamImpl.java | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java index 91fc326f..739c3454 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java @@ -28,10 +28,12 @@ import org.jitsi.impl.neomedia.transform.*; import org.jitsi.impl.neomedia.transform.csrc.*; import org.jitsi.impl.neomedia.transform.dtmf.*; +import org.jitsi.impl.neomedia.transform.fec.*; import org.jitsi.impl.neomedia.transform.pt.*; import org.jitsi.impl.neomedia.transform.rtcp.*; import org.jitsi.impl.neomedia.transform.zrtp.*; import org.jitsi.service.neomedia.*; +import org.jitsi.service.neomedia.codec.*; import org.jitsi.service.neomedia.control.*; import org.jitsi.service.neomedia.device.*; import org.jitsi.service.neomedia.format.*; @@ -387,7 +389,7 @@ protected void configureRTPManagerBufferControl( */ private TransformEngineChain createTransformEngineChain() { - List<TransformEngine> engineChain = new ArrayList<TransformEngine>(5); + List<TransformEngine> engineChain = new ArrayList<TransformEngine>(8); // CSRCs and CSRC audio levels if (csrcEngine == null) @@ -411,6 +413,16 @@ private TransformEngineChain createTransformEngineChain() ptTransformEngine = new PayloadTypeTransformEngine(); engineChain.add(ptTransformEngine); + // FEC + FECTransformEngine fecTransformEngine = getFecTransformEngine(); + if (fecTransformEngine != null) + engineChain.add(fecTransformEngine); + + // RED + REDTransformEngine redTransformEngine = getRedTransformEngine(); + if (redTransformEngine != null) + engineChain.add(redTransformEngine); + // SRTP engineChain.add(srtpControl.getTransformEngine()); @@ -472,8 +484,33 @@ public void addDynamicRTPPayloadType( { dynamicRTPPayloadTypes.put(Byte.valueOf(rtpPayloadType), format); - if (rtpManager != null) + String encoding = format.getEncoding(); + + if (Constants.RED.equals(encoding)) + { + REDTransformEngine redTransformEngine = getRedTransformEngine(); + if (redTransformEngine != null) + { + redTransformEngine.setIncomingPT(rtpPayloadType); + // setting outgoingPT enables RED encapsulation for outgoing + // packets. + redTransformEngine.setOutgoingPT(rtpPayloadType); + } + } + else if (Constants.ULPFEC.equals(encoding)) + { + FECTransformEngine fecTransformEngine = getFecTransformEngine(); + if (fecTransformEngine != null) + { + fecTransformEngine.setIncomingPT(rtpPayloadType); + fecTransformEngine.setOutgoingPT(rtpPayloadType); + } + } + else if (rtpManager != null) { + // we do not add RED and FEC payload types to the RTP Manager, + // because RED and FEC packets will be handled before they get + // to the RTP Manager. rtpManager.addFormat( mediaFormatImpl.getFormat(), rtpPayloadType); @@ -3245,4 +3282,24 @@ public void setProperty(String propertyName, Object value) else properties.put(propertyName, value); } + + /** + * Creates the <tt>FECTransformEngine</tt> for this <tt>MediaStream</tt>. + * By default none is created, allows extenders to implement it. + * @return the <tt>FECTransformEngine</tt> created. + */ + protected FECTransformEngine getFecTransformEngine() + { + return null; + } + + /** + * Creates the <tt>REDTransformEngine</tt> for this <tt>MediaStream</tt>. + * By default none is created, allows extenders to implement it. + * @return the <tt>REDTransformEngine</tt> created. + */ + protected REDTransformEngine getRedTransformEngine() + { + return null; + } } -- GitLab