diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/RtpStreamReceiver.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/RtpStreamReceiver.java index 5776c00d9eba6028d07e951c8eeeb3eaa608d345..7a1e9a9ac6e918f982fb00531e33a0685cc8e179 100755 --- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/RtpStreamReceiver.java +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/RtpStreamReceiver.java @@ -86,15 +86,15 @@ public class RtpStreamReceiver { try { rtpSocket.receive(rtpPacket); packetReceivedCounter++; - if (rtpPacket.getSeqNum() > lastSequenceNumber) { - lastSequenceNumber = rtpPacket.getSeqNum(); -// System.out.println(" RX RTP ts=" + rtpPacket.getTimestamp() + " length=" + rtpPacket.getPayload().length); - AudioByteData audioData = new AudioByteData(rtpPacket.getPayload()); - if (listener != null) listener.onAudioDataReceived(audioData); - else log.debug("No listener for incoming audio packet"); + if (shouldHandlePacket(rtpPacket)) { + processRtpPacket(rtpPacket); } else { -// System.out.println("SequenceNumber < lastSequence (" + rtpPacket.getSeqNum() + " < " + lastSequenceNumber + ")"); - } + if (isFirstPacket()) { + processRtpPacket(rtpPacket); + } else { + log.info("Corrupt packet seqNum[rtpSeqNum=" + rtpPacket.getSeqNum() + ",lastSeqNum=" + lastSequenceNumber +"][rtpTS=" + rtpPacket.getTimestamp() + ",lastTS=" + lastPacketTimestamp + "]"); + } + } } catch (IOException e) { // We get this when the socket closes when the call hangs up. receivePackets = false; @@ -104,4 +104,32 @@ public class RtpStreamReceiver { log.debug("Packet Received = " + packetReceivedCounter + "." ); if (listener != null) listener.onStoppedReceiving(); } + + private boolean isFirstPacket() { + return lastSequenceNumber == 0 && lastPacketTimestamp == 0; + } + + private boolean shouldHandlePacket(RtpPacket rtpPacket) { + /** Take seq number only into account and not timestamps. Seems like the timestamp sometimes change whenever the audio changes source. + * For example, in FreeSWITCH, the audio prompt will have it's own "start" timestamp and then + * another "start" timestamp will be generated for the voice. (ralam, sept 7, 2010). + * && packetIsNotCorrupt(rtpPacket)) { + **/ + /* + * Assume if the sequence number jumps by more that 100, that the sequence number is corrupt. + */ + return rtpPacket.getSeqNum() > lastSequenceNumber && rtpPacket.getSeqNum() - lastSequenceNumber < 100; + + //rtpPacket.getTimestamp() > lastPacketTimestamp && rtpPacket.getTimestamp() - lastPacketTimestamp < 1000; + } + + private void processRtpPacket(RtpPacket rtpPacket) { + lastSequenceNumber = rtpPacket.getSeqNum(); + lastPacketTimestamp = rtpPacket.getTimestamp(); +// log.info("Process packet seqNum[rtpSeqNum=" + rtpPacket.getSeqNum() + ",lastSeqNum=" + lastSequenceNumber +"][rtpTS=" + rtpPacket.getTimestamp() + ",lastTS=" + lastPacketTimestamp + "]"); +// System.out.println(" RX RTP ts=" + rtpPacket.getTimestamp() + " length=" + rtpPacket.getPayload().length); + AudioByteData audioData = new AudioByteData(rtpPacket.getPayload()); + if (listener != null) listener.onAudioDataReceived(audioData); + else log.debug("No listener for incoming audio packet"); + } } diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/SipToFlashAudioStream.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/SipToFlashAudioStream.java index cc6b0dd4af6753e5d44c7c74ad6aa8f28ee67838..25d618f4b80fb51fcb390ce9cb957cd1b1b0256d 100755 --- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/SipToFlashAudioStream.java +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/SipToFlashAudioStream.java @@ -165,7 +165,7 @@ public class SipToFlashAudioStream implements TranscodedAudioDataListener, RtpSt mBuffer.setAutoExpand(true); mBuffer.clear(); - mBuffer.put(fakeMetadata); + mBuffer.put(fakeMetadata); mBuffer.flip(); Notify notifyData = new Notify(mBuffer);