[Red5devs] [red5 commit] r3065 - in java/server/branches/paulg_mp4/src/org/red5: io/mp4/impl server/net/rtmp/codec server/...

codesite-noreply at google.com codesite-noreply at google.com
Thu Sep 18 10:08:31 PDT 2008


Author: mondain
Date: Thu Sep 18 10:07:56 2008
New Revision: 3065

Modified:
    java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java
     
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
     
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
     
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java
     
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java
     
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java
     
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java
    java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java
     
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java
     
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java
     
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java
     
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java

Log:
Added more debug logging and two new RTMP headers that may be needed for  
h.264 content

Modified:  
java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java
==============================================================================
--- java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java	 
(original)
+++ java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java	 
Thu Sep 18 10:07:56 2008
@@ -857,12 +857,17 @@
      		(byte) 0xce, (byte) 0x3c, (byte) 0x80});
      		
      		//fake avcc
-    		//(byte) 0x01, (byte) 0x4D, (byte) 0x40, (byte) 0x1F, (byte) 0xFF,  
(byte) 0xE1, (byte) 0x00,
-    		//(byte) 0x14, (byte) 0x27, (byte) 0x4D, (byte) 0x40, (byte) 0x1F,  
(byte) 0xA9, (byte) 0x18,
-    		//(byte) 0x0A, (byte) 0x00, (byte) 0x8B, (byte) 0x60, (byte) 0x0D,  
(byte) 0x41, (byte) 0x80,
-    		//(byte) 0x41, (byte) 0x8C, (byte) 0x2B, (byte) 0x5E, (byte) 0xF7,  
(byte) 0xC0, (byte) 0x40,
-    		//(byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0xCE,  
(byte) 0x09, (byte) 0xC8
-
+    		/*
+    		byte[] fakeAvcc = new byte[]{
+    		(byte) 0x01, (byte) 0x4D, (byte) 0x40, (byte) 0x1F, (byte) 0xFF,  
(byte) 0xE1, (byte) 0x00,
+    		(byte) 0x14, (byte) 0x27, (byte) 0x4D, (byte) 0x40, (byte) 0x1F,  
(byte) 0xA9, (byte) 0x18,
+    		(byte) 0x0A, (byte) 0x00, (byte) 0x8B, (byte) 0x60, (byte) 0x0D,  
(byte) 0x41, (byte) 0x80,
+    		(byte) 0x41, (byte) 0x8C, (byte) 0x2B, (byte) 0x5E, (byte) 0xF7,  
(byte) 0xC0, (byte) 0x40,
+    		(byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0xCE,  
(byte) 0x09, (byte) 0xC8
+    		};
+    		log.debug("Fake: {}", new String(fakeAvcc));
+			*/
+    		
      		body.flip();
      		tag.setBody(body);

@@ -1069,7 +1074,7 @@
  		Collections.sort(frames);
  		
  		log.debug("Frames count (expect 16042 for backcountry): {}",  
frames.size());
-		log.debug("Frames: {}", frames);
+		//log.debug("Frames: {}", frames);
  		
  		keyframeMeta = new KeyFrameMeta();
  		keyframeMeta.duration = duration;

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java	 
Thu Sep 18 10:07:56 2008
@@ -910,11 +910,13 @@

  	/** {@inheritDoc} */
  	public AudioData decodeAudioData(ByteBuffer in) {
+		log.debug("decodeAudioData");
  		return new AudioData(in.asReadOnlyBuffer());
  	}

  	/** {@inheritDoc} */
  	public VideoData decodeVideoData(ByteBuffer in) {
+		log.debug("decodeVideoData");
  		return new VideoData(in.asReadOnlyBuffer());
  	}


Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java	 
Thu Sep 18 10:07:56 2008
@@ -256,7 +256,18 @@
  				RTMPUtils.writeMediumInt(buf, header.getTimer());
  				break;
  			case HEADER_CONTINUE:
+				break;				
+			case HEADER_H264_INIT:
+				RTMPUtils.writeMediumInt(buf, header.getTimer());
+				RTMPUtils.writeMediumInt(buf, header.getSize());
+				buf.put(header.getDataType());
+				RTMPUtils.writeReverseInt(buf, header.getStreamId());
  				break;
+			case HEADER_H264_DATA:
+				RTMPUtils.writeMediumInt(buf, header.getTimer());
+				RTMPUtils.writeMediumInt(buf, header.getSize());
+				buf.put(header.getDataType());
+				break;				
  			default:
  		}
  	}

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java	 
Thu Sep 18 10:07:56 2008
@@ -108,6 +108,14 @@
  		this.value3 = value3;
  		this.value4 = value4;
  	}
+	
+	public Ping(Ping in) {
+		super(Type.SYSTEM);
+		this.value1 = in.getValue1();
+		this.value2 = in.getValue2();
+		this.value3 = in.getValue3();
+		this.value4 = in.getValue4();
+	}

  	/** {@inheritDoc} */
      @Override

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java	 
Thu Sep 18 10:07:56 2008
@@ -126,6 +126,18 @@
      public static final byte HEADER_CONTINUE = 0x03;

      /**
+     * New H264 header marker. This will be sent for the "first"
+     * sets of data, the audio / video "extra" data and the first
+     * samples.
+     */
+    public static final byte HEADER_H264_INIT = 0x05;
+
+    /**
+     * There's more audio / video
+     */
+    public static final byte HEADER_H264_DATA = 0x45;
+
+    /**
       * Size of initial handshake between client and server
       */
      public static final int HANDSHAKE_SIZE = 1536;

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java	 
Thu Sep 18 10:07:56 2008
@@ -178,7 +178,7 @@
  	public String toString() {
  		StringBuffer sb = new StringBuffer();
  		sb.append("ChannelId: ").append(channelId).append(", ");
-		sb.append("Timer: ").append(timer).append(" (" +  
(timerRelative ? "relative" : "absolute") + ')').append(", ");
+		sb.append("Timer: ").append(timer).append("  
(").append(timerRelative ? "relative" : "absolute").append("), ");
  		sb.append("Size: ").append(size).append(", ");
  		sb.append("DataType: ").append(dataType).append(", ");
  		sb.append("StreamId: ").append(streamId);

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java	 
Thu Sep 18 10:07:56 2008
@@ -70,7 +70,7 @@
       * @return  RTMP event
       */
      public IRTMPEvent dequeue() {
-
+    	log.debug("dequeue");
  		if (!reader.hasMoreTags()) {
  			return null;
  		}

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java	 
Thu Sep 18 10:07:56 2008
@@ -692,17 +692,15 @@
  		// check client buffer length when we've already sent some messages
  		if (lastMessage != null) {
  			// Duration the stream is playing
+			log.debug("okayToSendMessage: now {} playback start {}", now,  
playbackStart);
  			final long delta = now - playbackStart;
  			// Buffer size as requested by the client
  			final long buffer = playlistSubscriberStream.getClientBufferDuration();

  			// Expected amount of data present in client buffer
  			final long buffered = lastMessage.getTimestamp() - delta;
-			log
-					.debug(
-							"okayToSendMessage: timestamp {} delta {} buffered {} buffer {}",
-							new Object[] { lastMessage.getTimestamp(), delta,
-									buffered, buffer });
+			log.debug("okayToSendMessage: timestamp {} delta {} buffered {} buffer  
{}",
+					new Object[] { lastMessage.getTimestamp(), delta, buffered, buffer });
  			if (buffer > 0 && buffered > buffer) {
  				// Client is likely to have enough data in the buffer
  				return false;
@@ -1010,7 +1008,7 @@
  	 * Send playlist switch status notification
  	 */
  	private void sendSwitchStatus() {
-		// TODO: find correct duration to sent
+		// TODO: find correct duration to send
  		int duration = 1;
  		sendOnPlayStatus(StatusCodes.NS_PLAY_SWITCH, duration, bytesSent);
  	}
@@ -1253,6 +1251,7 @@
  							.getAttribute(IBroadcastScope.STREAM_ATTRIBUTE);
  					if (stream != null && stream.getCodecInfo() != null) {
  						videoCodec = stream.getCodecInfo().getVideoCodec();
+						log.debug("Video codec: {}", videoCodec);
  					}
  				}

@@ -1280,7 +1279,7 @@
  					}

  					//Long[] writeDelta = getWriteDelta();
-					if (pendingVideos > 1 /*|| writeDelta[0] > writeDelta[1]*/) {
+					if (pendingVideos > 1) {
  						// We drop because the client has insufficient bandwidth.
  						long now = System.currentTimeMillis();
  						if (bufferCheckInterval > 0
@@ -1369,24 +1368,6 @@
  		return playlistSubscriberStream.getConnection().getPendingMessages();
  	}

-	/**
-	 * Get informations about bytes send and number of bytes the client  
reports
-	 * to have received.
-	 *
-	 * @return          Written bytes and number of bytes the client received
-	 */
-//	private Long[] getWriteDelta() {
-//		OOBControlMessage pendingRequest = new OOBControlMessage();
-//		pendingRequest.setTarget("ConnectionConsumer");
-//		pendingRequest.setServiceName("writeDelta");
-//		msgOut.sendOOBControlMessage(this, pendingRequest);
-//		if (pendingRequest.getResult() != null) {
-//			return (Long[]) pendingRequest.getResult();
-//		} else {
-//			return new Long[] { Long.valueOf(0), Long.valueOf(0) };
-//		}
-//	}	
-	
  	public boolean isPullMode() {
  		return pullMode;
  	}

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java	 
Thu Sep 18 10:07:56 2008
@@ -199,16 +199,15 @@
      			IConsumerService consumerService = (IConsumerService)  
ctx.getBean(IConsumerService.KEY);
      			IProviderService providerService = (IProviderService)  
ctx.getBean(IProviderService.BEAN_NAME);
      		
-    			engine = new PlayEngine.Builder(this, schedulingService,  
consumerService, providerService).build();
+    			//engine = new PlayEngine.Builder(this, schedulingService,  
consumerService, providerService).build();
+    			createEngine(schedulingService, consumerService, providerService);
      		} else {
      			log.info("Scope was null on start");
      		}		
  		}
-		// Create bw control service from Spring bean factory
-		// and register myself
-		// XXX Bandwidth control service should not be bound to
-		// a specific scope because it's designed to control
-		// the bandwidth system-wide.
+		// Create bw control service from Spring bean factory and register myself
+		// XXX Bandwidth control service should not be bound to a specific scope
+		// because it's designed to control the bandwidth system-wide.
  		if (bwController == null) {
  			bwController = (IBWControlService)  
getScope().getContext().getBean(IBWControlService.KEY);
  		}

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java	 
Thu Sep 18 10:07:56 2008
@@ -53,7 +53,7 @@
      /**
       * RTMP event handler
       * @param event      RTMP event
-     * @return           Timeframe since last notification (or auido or  
video packet sending)
+     * @return           Timeframe since last notification (or audio or  
video packet sending)
       */
      public int add(IRTMPEvent event) {
  		relative = true;

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java	 
Thu Sep 18 10:07:56 2008
@@ -105,6 +105,7 @@

  	/** {@inheritDoc} */
      public void pushMessage(IPipe pipe, IMessage message) {
+    	log.debug("pushMessage");
  		if (message instanceof ResetMessage) {
  			streamTracker.reset();
  		} else if (message instanceof StatusMessage) {
@@ -153,9 +154,7 @@
  					audio.write(audioData);
  					break;
  				case Constants.TYPE_PING:
-					Ping ping = new Ping(((Ping) msg).getValue1(), ((Ping) msg)
-							.getValue2(), ((Ping) msg).getValue3(),
-							((Ping) msg).getValue4());
+					Ping ping = new Ping(((Ping) msg));
  					header.setTimerRelative(false);
  					header.setTimer(0);
  					ping.setHeader(header);

Modified:  
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java
==============================================================================
---  
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java	 
(original)
+++  
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java	 
Thu Sep 18 10:07:56 2008
@@ -117,6 +117,7 @@

  	/** {@inheritDoc} */
      public synchronized IMessage pullMessage(IPipe pipe) throws  
IOException {
+    	log.debug("pullMessage");
  		if (this.pipe != pipe) {
  			return null;
  		}



More information about the Red5devs mailing list