You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openmeetings.apache.org by co...@google.com on 2013/02/18 09:07:02 UTC

[red5phone] r85 committed - red5sip: added jitter buffer to RTP->RTMP channel

Revision: 85
Author:   timur.tleukenov@gmail.com
Date:     Mon Feb 18 00:06:43 2013
Log:      red5sip: added jitter buffer to RTP->RTMP channel
http://code.google.com/p/red5phone/source/detail?r=85

Modified:
  /branches/red5sip/red5sip.iml
  /branches/red5sip/src/java/org/red5/sip/app/RTPStreamReceiver.java

=======================================
--- /branches/red5sip/red5sip.iml	Wed Feb  6 09:31:44 2013
+++ /branches/red5sip/red5sip.iml	Mon Feb 18 00:06:43 2013
@@ -513,6 +513,7 @@
      </orderEntry>
      <orderEntry type="library" name="lib" level="project" />
      <orderEntry type="library" name="Unnamed" level="project" />
+    <orderEntry type="library" name="libresample4j" level="project" />
    </component>
  </module>

=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/RTPStreamReceiver.java	Sun  
Feb 17 20:38:26 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/RTPStreamReceiver.java	Mon  
Feb 18 00:06:43 2013
@@ -1,5 +1,6 @@
  package org.red5.sip.app;

+import java.io.IOException;
  import java.net.DatagramSocket;

  import local.net.RtpPacket;
@@ -105,23 +106,71 @@
              return;
          }

-        byte[] codedBuffer 		= new byte[  
sipCodec.getIncomingEncodedFrameSize() ];
+//        byte[] codedBuffer 		= new byte[  
sipCodec.getIncomingEncodedFrameSize() ];
          byte[] internalBuffer 	= new  
byte[sipCodec.getIncomingEncodedFrameSize() + RTP_HEADER_SIZE ];

          RtpPacket rtpPacket = new RtpPacket( internalBuffer, 0 );

          running = true;

-        try {
+        final int BUFFER_LENGTH = 100;
+        final BytesBuffer buffer = new BytesBuffer(  
sipCodec.getIncomingEncodedFrameSize(), BUFFER_LENGTH );

-            rtp_socket.getDatagramSocket().setSoTimeout( SO_TIMEOUT );
+        Thread sendThread = new Thread(new Runnable() {
+            public void run() {
+                boolean ready = false;
+                int avail = 0;
+                while(running) {
+                    byte[] codedBuffer = new byte[  
sipCodec.getIncomingEncodedFrameSize() ];
+                    synchronized (buffer) {
+                        avail = buffer.available();
+                        if(!ready) {
+                            if(avail > 30) {
+                                ready = true;
+                            }
+                        } else {
+                            if(avail == 0 ) {
+                                ready = false;
+                            }
+                        }
+                        if(ready) {
+                            buffer.take(codedBuffer, 0);
+                        }
+                    }
+                    if(ready) {
+                        timeStamp += sipCodec.getIncomingPacketization();
+                        try {
+                            rtmpUser.pushAudio(codedBuffer, timeStamp,  
130);
+                            try {

-            float[] decodingBuffer = new float[  
sipCodec.getIncomingDecodedFrameSize() ];
+                                long pause =  
sipCodec.getOutgoingPacketization();
+                                if(avail > BUFFER_LENGTH / 2) {
+                                    pause -= 5;
+                                }
+                                if(avail > BUFFER_LENGTH / 5) {
+                                    pause -= 1;
+                                }
+                                log.trace("Sleep pause: " + pause);
+                                //System.out.println("pushAudio, ts: " +  
timeStamp + ", pause: " + pause);
+                                Thread.sleep( pause, 800000 );
+                                 
//Thread.sleep(sipCodec.getIncomingPacketization() - 1);
+                            } catch (InterruptedException e) {
+
+                            }
+                        } catch (IOException e) {
+                            log.error("rtmpUser.pushAudio", e);
+                        }
+                    }
+                    Thread.yield();
+                }
+            }
+        });
+
+        sendThread.start();
+
+        try {

-            println( "run",
-                    "internalBuffer.length = " + internalBuffer.length
-                    + ", codedBuffer.length = " + codedBuffer.length
-                    + ", decodingBuffer.length = " + decodingBuffer.length  
+ "." );
+            rtp_socket.getDatagramSocket().setSoTimeout( SO_TIMEOUT );

              while ( running ) {

@@ -137,10 +186,13 @@

                          if(payloadType < 20)
                          {
-							System.arraycopy(packetBuffer, offset, codedBuffer, 0,  
sipCodec.getIncomingEncodedFrameSize());
-                            //timeStamp = (System.currentTimeMillis() -  
start);
-                            timeStamp +=  
sipCodec.getIncomingPacketization();
-							rtmpUser.pushAudio(codedBuffer, timeStamp, 130);
+							//System.arraycopy(packetBuffer, offset, codedBuffer, 0,  
sipCodec.getIncomingEncodedFrameSize());
+                            synchronized (buffer) {
+                                System.out.println(String.format("RTP:  
ssrc[%d], cscr count %d", rtpPacket.getSscr(), rtpPacket.getCscrCount()));
+                                buffer.push(packetBuffer, offset,  
sipCodec.getIncomingEncodedFrameSize());
+                            }
+//                            timeStamp +=  
sipCodec.getIncomingPacketization();
+//							rtmpUser.pushAudio(codedBuffer, timeStamp, 130);
                          }
                      }
                  }