From f6113a50009aff9dcb28bc1df522901a7c15a101 Mon Sep 17 00:00:00 2001 From: Damian Minkov Date: Thu, 17 Dec 2009 16:58:51 +0000 Subject: [PATCH] Add padding when creating extension header and remove extensions after process the sound levels coming from the focus. --- .../neomedia/RTPConnectorInputStream.java | 1 - .../communicator/impl/neomedia/RawPacket.java | 20 +++++++++++++++++++ .../transform/csrc/CsrcTransformEngine.java | 12 ++++++++++- .../transform/srtp/SRTPCryptoContext.java | 20 +++++++++++-------- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/net/java/sip/communicator/impl/neomedia/RTPConnectorInputStream.java b/src/net/java/sip/communicator/impl/neomedia/RTPConnectorInputStream.java index 714a14421..f8f2f696b 100755 --- a/src/net/java/sip/communicator/impl/neomedia/RTPConnectorInputStream.java +++ b/src/net/java/sip/communicator/impl/neomedia/RTPConnectorInputStream.java @@ -10,7 +10,6 @@ import java.net.*; import javax.media.protocol.*; -import javax.media.rtp.*; /** * @author Bing SU (nova.su@gmail.com) diff --git a/src/net/java/sip/communicator/impl/neomedia/RawPacket.java b/src/net/java/sip/communicator/impl/neomedia/RawPacket.java index d1a787cb2..7ec773f99 100755 --- a/src/net/java/sip/communicator/impl/neomedia/RawPacket.java +++ b/src/net/java/sip/communicator/impl/neomedia/RawPacket.java @@ -587,6 +587,26 @@ public void addExtension(byte[] extBuff, int newExtensionLen) this.length = newBuffLen - offset; } + /** + * Removes the extension from the packet and its header. + */ + public void removeExtension() + { + if(!getExtensionBit()) + return; + + int payloadOffset = offset + getHeaderLength(); + + int extHeaderLen = getExtensionLength() + EXT_HEADER_SIZE; + + System.arraycopy(buffer, payloadOffset, + buffer, payloadOffset - extHeaderLen, getPayloadLength()); + + this.length -= extHeaderLen; + + setExtensionBit(false); + } + /** * Returns a bi-dimensional byte array containing a map binding CSRC IDs to * audio levels as reported by the remote party that sent this packet. diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java b/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java index 61838de26..11959d78c 100644 --- a/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java +++ b/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java @@ -120,6 +120,8 @@ public RawPacket reverseTransform(RawPacket pkt) csrcLevelDispatcher.addLevels(levels); } + + pkt.removeExtension(); } return pkt; } @@ -161,7 +163,6 @@ public synchronized RawPacket transform(RawPacket pkt) byte[] levelsExt = createLevelExtensionBuffer(csrcList); pkt.addExtension(levelsExt, extensionBuffLen); - } return pkt; @@ -208,6 +209,15 @@ private byte[] createLevelExtensionBuffer(long[] csrcList) { int buffLen = 1 + //CSRC one byte extension hdr csrcList.length; + + // calculate extension padding + int padLen = 4 - buffLen%4; + + if(padLen == 4) + padLen = 0; + + buffLen += padLen; + byte[] extensionBuff = getExtensionBuff(buffLen); extensionBuff[0] = diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPCryptoContext.java b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPCryptoContext.java index dc2f0fb0c..5e7b7cc58 100644 --- a/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPCryptoContext.java +++ b/src/net/java/sip/communicator/impl/neomedia/transform/srtp/SRTPCryptoContext.java @@ -347,26 +347,30 @@ public void setROC(int rocIn) { * * @param pkt the RTP packet that is going to be sent out */ - public void transformPacket(RawPacket pkt) { + public void transformPacket(RawPacket pkt) + { /* Encrypt the packet using Counter Mode encryption */ - if (policy.getEncType() == SRTPPolicy.AESCM_ENCRYPTION) { + if (policy.getEncType() == SRTPPolicy.AESCM_ENCRYPTION) + { processPacketAESCM(pkt); } - - /* Encrypt the packet using F8 Mode encryption */ - else if (policy.getEncType() == SRTPPolicy.AESF8_ENCRYPTION) { + else if (policy.getEncType() == SRTPPolicy.AESF8_ENCRYPTION) + { + /* Encrypt the packet using F8 Mode encryption */ processPacketAESF8(pkt); } /* Authenticate the packet */ - if (policy.getAuthType() == SRTPPolicy.HMACSHA1_AUTHENTICATION) { + if (policy.getAuthType() == SRTPPolicy.HMACSHA1_AUTHENTICATION) + { authenticatePacketHMCSHA1(pkt, roc); pkt.append(tagStore, policy.getAuthTagLength()); } /* Update the ROC if necessary */ int seqNo = pkt.getSequenceNumber(); - if (seqNo == 0xFFFF) { + if (seqNo == 0xFFFF) + { roc++; } } @@ -509,7 +513,7 @@ public void processPacketAESF8(RawPacket pkt) { */ private void authenticatePacketHMCSHA1(RawPacket pkt, int rocIn) { - hmacSha1.update(pkt.getBuffer(), 0, pkt.getLength()); + hmacSha1.update(pkt.getBuffer(), pkt.getOffset(), pkt.getLength()); // byte[] rb = new byte[4]; rbStore[0] = (byte) (rocIn >> 24); rbStore[1] = (byte) (rocIn >> 16);