Revision: 102
Author:   solomax...@gmail.com
Date:     Tue Mar  5 21:44:18 2013
Log:      Video: video stream switching is added;
        logs cleanup
http://code.google.com/p/red5phone/source/detail?r=102

Modified:
 /branches/red5sip/src/java/org/red5/sip/app/PlayNetStream.java
 /branches/red5sip/src/java/org/red5/sip/app/RTMPRoomClient.java
 /branches/red5sip/src/java/org/red5/sip/app/SIPVideoConverter.java

=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/PlayNetStream.java Tue Mar 5 01:52:05 2013 +++ /branches/red5sip/src/java/org/red5/sip/app/PlayNetStream.java Tue Mar 5 21:44:18 2013
@@ -7,6 +7,7 @@
 import org.red5.server.net.rtmp.event.IRTMPEvent;
 import org.red5.server.net.rtmp.event.SerializeUtils;
 import org.red5.server.net.rtmp.event.VideoData;
+import org.red5.server.net.rtmp.event.VideoData.FrameType;
 import org.red5.server.stream.AbstractClientStream;
 import org.red5.server.stream.IStreamData;
 import org.slf4j.Logger;
@@ -24,10 +25,17 @@
        private IMediaSender videoSender;

        private IMediaStream videoStream;
+
+       private RTMPRoomClient client;
+
+       private int currentStreamID = -1;
+
+       private boolean keyframeReceived = false;

-       public PlayNetStream(IMediaSender audioSender, IMediaSender 
videoSender) {
+ public PlayNetStream(IMediaSender audioSender, IMediaSender videoSender, RTMPRoomClient client) {
                this.audioSender = audioSender;
                this.videoSender = videoSender;
+               this.client = client;
        }

        public void close() {
@@ -56,8 +64,6 @@
                        videoSender.deleteStream(getStreamId());
                }
        }
-
-       private long sipStream = -1;

        public void dispatchEvent(IEvent event) {

@@ -79,9 +85,25 @@
                }

                if (rtmpEvent instanceof VideoData) {
-                       if (sipStream == -1)
-                               sipStream = rtmpEvent.getHeader().getStreamId();
-                       if (rtmpEvent.getHeader().getStreamId() != sipStream) 
return;
+                       int newStreamId = client.getActiveVideoStreamID();
+                       if (rtmpEvent.getHeader().getStreamId() != newStreamId) 
{
+                               return;
+                       }
+
+                       if (currentStreamID != newStreamId) {
+                               logger.debug("switching video to a new stream: 
" + newStreamId);
+                               currentStreamID = newStreamId;
+                               keyframeReceived = false;
+                       }
+
+                       if (((VideoData) rtmpEvent).getFrameType() == 
FrameType.KEYFRAME) {
+                               keyframeReceived = true;
+                       }
+
+                       if (!keyframeReceived) {
+                               logger.debug("Keyframe is not received. Packet is 
ignored.");
+                               return;
+                       }

                        int videoTs = rtmpEvent.getTimestamp();
IoBuffer videoData = ((VideoData) rtmpEvent).getData().asReadOnlyBuffer();
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/RTMPRoomClient.java Tue Mar 5 01:52:05 2013 +++ /branches/red5sip/src/java/org/red5/sip/app/RTMPRoomClient.java Tue Mar 5 21:44:18 2013
@@ -82,6 +82,7 @@
        final private int roomId;
        final private String context;
        final private String host;
+       private int activeVideoStreamID = -1;

        public RTMPRoomClient(String host, String context, int roomId) {
                super();
@@ -154,6 +155,10 @@
        protected void listBroadcastIds() {
                invoke("listRoomBroadcast", this);
        }
+
+       public int getActiveVideoStreamID() {
+               return activeVideoStreamID;
+       }

        private void createPlayStream(long broadCastId) {

@@ -177,12 +182,15 @@
                        if (conn != null && streamIdInt != null
&& (publishStreamId == null || streamIdInt.intValue() != publishStreamId)) {
                                clientStreamMap.put(broadCastId, streamIdInt);
-                               PlayNetStream stream = new 
PlayNetStream(audioSender, videoSender);
+ PlayNetStream stream = new PlayNetStream(audioSender, videoSender, RTMPRoomClient.this);
                                stream.setConnection(conn);
                                stream.setStreamId(streamIdInt.intValue());
                                conn.addClientStream(stream);
                                play(streamIdInt, "" + broadCastId, -2000, 
-1000);
                                stream.start();
+                               if (activeVideoStreamID == -1) {
+                                       activeVideoStreamID = streamIdInt;
+                               }
                        }
                }
        }
@@ -345,6 +353,13 @@
                        conn.getStreamById(streamId).stop();
                        conn.removeClientStream(streamId);
                        conn.deleteStreamById(streamId);
+                       if (streamId == activeVideoStreamID) {
+                               if (clientStreamMap.size() == 0) {
+                                       activeVideoStreamID = -1;
+                               } else {
+                                       activeVideoStreamID = 
clientStreamMap.values().iterator().next();
+                               }
+                       }
                }
        }

=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/SIPVideoConverter.java Tue Mar 5 01:52:05 2013 +++ /branches/red5sip/src/java/org/red5/sip/app/SIPVideoConverter.java Tue Mar 5 21:44:18 2013
@@ -69,12 +69,9 @@
                if (data[0] == 0x17 && data[1] == 0) {
                        byte[] pdata = Arrays.copyOfRange(data, 2, data.length);
                        int cfgVer = pdata[3];
-                       log.debug("cfgVer=" + cfgVer);
                        if (cfgVer == 1) {
                                int lenSize = pdata[7] & 0x03 + 1;
                                int numSPS = pdata[8] & 0x1f;
-                               log.debug("lenSize=" + lenSize);
-                               log.debug("numSPS=" + numSPS);
                                pdata = Arrays.copyOfRange(pdata, 9, 
pdata.length);
                                byte[] sps = null;
                                for (int i = 0; i < numSPS; i++) {
@@ -86,7 +83,6 @@
                                        pdata = Arrays.copyOfRange(pdata, 
lenSPS, pdata.length);
                                }
                                int numPPS = pdata[0];
-                               log.debug("numPPS=" + numSPS);
                                pdata = Arrays.copyOfRange(pdata, 1, 
pdata.length);
                                byte[] pps = null;
                                for (int i = 0; i < numPPS; i++) {
@@ -123,7 +119,6 @@
                        if (spsSent && ppsSent) {
                                List<ByteArrayBuilder> nals = new 
ArrayList<ByteArrayBuilder>();
                                byte[] pdata = Arrays.copyOfRange(data, 5, 
data.length);
-                               log.debug("pdata.length=" + pdata.length);
                                while (pdata.length > 0) {
                                        int nalSize = 0;
                                        switch (lenSize) {
@@ -142,18 +137,15 @@
                                        default:
                                                throw new RuntimeException("Invalid 
length size: " + lenSize);
                                        }
-                                       log.debug("nalSize=" + nalSize);
ByteArrayBuilder nalData = new ByteArrayBuilder(Arrays.copyOfRange(pdata, lenSize, lenSize + nalSize));
                                        nals.add(nalData);
                                        pdata = Arrays.copyOfRange(pdata, 
lenSize + nalSize, pdata.length);
                                }
-                               log.debug("nals.size()=" + nals.size());
                                if (nals.size() > 0) {
                                        byte[] remaining = nals.get(nals.size() 
- 1).buildArray();
                                        int nalType = remaining[0] & 0x1f;
                                        int nri = remaining[0] & 0x60;
                                        int maxSize = 1446;
-                                       log.debug("nalType=" + nalType);
                                        if (nalType == 5 || nalType == 1) {
                                                long ts1 = ts * 90;
                                                if (remaining.length < maxSize) 
{
@@ -186,7 +178,6 @@
                                }
                        }
                }
-               log.debug("result.size()=" + result.size());
                return result;
        }

Reply via email to