[Red5commits] [red5 commit] r3145 - in java/server/branches/osgi/common: META-INF src/org/red5/server/common src/org/red5/ser...

codesite-noreply at google.com codesite-noreply at google.com
Fri Oct 3 02:44:50 PDT 2008


Author: steven.gong
Date: Fri Oct  3 02:44:31 2008
New Revision: 3145

Modified:
    java/server/branches/osgi/common/META-INF/MANIFEST.MF
     
java/server/branches/osgi/common/src/org/red5/server/common/BufferExUtils.java
     
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/impl/BaseRTMPInput.java
     
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/packet/RTMPPacket.java

Log:
Some bug fix for RTMP decoder

Modified: java/server/branches/osgi/common/META-INF/MANIFEST.MF
==============================================================================
--- java/server/branches/osgi/common/META-INF/MANIFEST.MF	(original)
+++ java/server/branches/osgi/common/META-INF/MANIFEST.MF	Fri Oct  3  
02:44:31 2008
@@ -5,7 +5,9 @@
  Bundle-Version: 0.1.0
  Export-Package: org.red5.server.common,
   org.red5.server.common.amf,
+ org.red5.server.common.amf.impl,
   org.red5.server.common.rtmp,
+ org.red5.server.common.rtmp.impl,
   org.red5.server.common.rtmp.packet,
   org.red5.server.common.service
  Import-Package: org.apache.commons.beanutils,

Modified:  
java/server/branches/osgi/common/src/org/red5/server/common/BufferExUtils.java
==============================================================================
---  
java/server/branches/osgi/common/src/org/red5/server/common/BufferExUtils.java	 
(original)
+++  
java/server/branches/osgi/common/src/org/red5/server/common/BufferExUtils.java	 
Fri Oct  3 02:44:31 2008
@@ -81,7 +81,7 @@
  		int srcRemaining = src.remaining();
  		if (srcRemaining >= length) {
  			int originLimit = src.limit();
-			src.limit(src.position() + srcRemaining);
+			src.limit(src.position() + length);
  			dest.put(src);
  			src.limit(originLimit);
  		} else {

Modified:  
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/impl/BaseRTMPInput.java
==============================================================================
---  
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/impl/BaseRTMPInput.java	 
(original)
+++  
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/impl/BaseRTMPInput.java	 
Fri Oct  3 02:44:31 2008
@@ -22,7 +22,7 @@
   */
  public abstract class BaseRTMPInput
  implements RTMPInput, RTMPConstants {
-	private static final int INTERNAL_BUF_CAPACITY = 1024;
+	private static final int INTERNAL_BUF_CAPACITY = 2048;
  	protected ClassLoader defaultClassLoader;
  	protected RTMPCodecState codecState;
  	protected boolean isServerMode;
@@ -41,6 +41,7 @@
  		codecState = RTMPCodecState.HANDSHAKE_1;
  		this.isServerMode = isServerMode;
  		this.internalBuf = BufferEx.allocate(INTERNAL_BUF_CAPACITY);
+		this.internalBuf.setAutoExpand(true);
  	}

  	@Override
@@ -91,7 +92,7 @@
  				packets.add(packet);
  				packet = read(buf, classLoader);
  			}
-			return (RTMPPacket[]) packets.toArray();
+			return (RTMPPacket[]) packets.toArray(new RTMPPacket[]{});
  		} catch (RTMPCodecException e) {
  			buf.position(originPos);
  			throw e;
@@ -145,6 +146,7 @@
  			buf.get(handshakeBuf, internalBufLength,  
handshakeSize-internalBufLength);
  			handshake = new RTMPHandshake();
  			handshake.setHandshakeData(BufferEx.wrap(handshakeBuf));
+			handshake.setSize(handshakeSize);
  			codecState = nextState;
  			return handshake;
  		} else {
@@ -230,7 +232,7 @@
  				} else if ((channelByte0 & 0x3f) == 1) {
  					decodeState.channelIdSize = 3;
  				}
-				decodeState.headerType = (channelByte0 & 0x3) >> 6;
+				decodeState.headerType = (channelByte0 & 0x0c0) >> 6;
  				int headerSize = decodeState.channelIdSize +
  					SUB_HEADER_SIZE[decodeState.headerType];
  				decodeState.bytesNeeded = headerSize - 1;
@@ -256,12 +258,14 @@

  				RTMPHeader lastHeader = lastHeaderMap.get(decodeState.channelId);
  				RTMPPacketObject decodingPacket =  
decodingPacketMap.get(decodeState.channelId);
-				if (decodeState.headerType != HEADER_STANDARD && lastHeader == null) {
-					throw new RTMPCodecException("Last header not found parsing  
headerType " + decodeState.headerType);
-				}
  				if (decodeState.headerType != HEADER_CONTINUE && decodingPacket !=  
null) {
  					throw new RTMPCodecException("Got non-continue header type with  
existing decoding packet");
  				}
+				if (decodeState.headerType != HEADER_STANDARD &&
+						!(decodingPacket != null && decodeState.headerType ==  
HEADER_CONTINUE) &&
+						lastHeader == null) {
+					throw new RTMPCodecException("Last header not found parsing  
headerType " + decodeState.headerType);
+				}
  				if (decodingPacket == null) {
  					long timestamp;
  					int relativeTS = 0;
@@ -311,9 +315,8 @@
  					decodingPacket = new RTMPPacketObject(currentHeader);
  					decodingPacketMap.put(decodeState.channelId, decodingPacket);
  				}
-				decodeState.bytesNeeded =
-					(decodingPacket.header.getSize() - decodingPacket.body.position()) %
-					chunkSize;
+				int bodyBytesRemaining = decodingPacket.header.getSize() -  
decodingPacket.body.position();
+				decodeState.bytesNeeded = bodyBytesRemaining > chunkSize ? chunkSize :  
bodyBytesRemaining;
  				break;
  			case RTMPDecodeState.DECODE_STATE_NEED_BODY:
  				continueDecoding = false;

Modified:  
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/packet/RTMPPacket.java
==============================================================================
---  
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/packet/RTMPPacket.java	 
(original)
+++  
java/server/branches/osgi/common/src/org/red5/server/common/rtmp/packet/RTMPPacket.java	 
Fri Oct  3 02:44:31 2008
@@ -61,4 +61,10 @@
  	public void setStreamId(int streamId) {
  		this.streamId = streamId;
  	}
+	
+	public String toString() {
+		return String.format(
+				"Type: %1$d, Size: %2$d, Channel %3$d, Timestamp %4$d, StreamId %5$d",
+				type, size, channel, timestamp, streamId);
+	}
  }



More information about the Red5commits mailing list