[Red5commits] [1260] changed handling of "NetStream?.send" events to support recording

jbauch luke at codegent.com
Wed Aug 2 18:20:08 EDT 2006


changed handling of "NetStream?.send" events to support recording


Timestamp: 08/03/06 08:12:31 (less than one hour ago) 
Change: 1260 
Author: jbauch

Files (see diff or trac for details): 
java/server/trunk/src/org/red5/server/api/stream/IStreamService.java
java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java
java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java
java/server/trunk/src/org/red5/server/stream/StreamService.java
java/server/trunk/src/org/red5/server/stream/consumer/ConnectionConsumer.java


Trac: http://mirror1.cvsdude.com/trac/osflash/red5/changeset/1260

Index: /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java (revision 1223)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java (revision 1260)
@@ -390,7 +390,4 @@
 				IStreamService streamService = (IStreamService) getScopeService(conn.getScope(), IStreamService.STREAM_SERVICE, StreamService.class);
 				invokeCall(conn, call, streamService);
-			} else if (source.getStreamId() != 0) {
-				IStreamService streamService = (IStreamService) getScopeService(conn.getScope(), IStreamService.STREAM_SERVICE, StreamService.class);
-				streamService.send(call);
 			} else {
 				invokeCall(conn, call);
Index: /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java (revision 1240)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java (revision 1260)
@@ -457,6 +457,16 @@
 	}
 	
-	private boolean isStreamMetadataAction(String action) {
-		return (action.equals("onMetaData") || action.equals("onCuePoint"));
+	/**
+	 * Checks if the passed action is a reserved stream method.
+	 * 
+	 * @param action
+	 * @return
+	 */
+	private boolean isStreamCommand(String action) {
+		return (ACTION_CREATE_STREAM.equals(action) || ACTION_DELETE_STREAM.equals(action) ||
+				ACTION_PUBLISH.equals(action) || ACTION_PLAY.equals(action) ||
+				ACTION_SEEK.equals(action) || ACTION_PAUSE.equals(action) ||
+				ACTION_CLOSE_STREAM.equals(action) || ACTION_RECEIVE_VIDEO.equals(action) ||
+				ACTION_RECEIVE_AUDIO.equals(action));
 	}
 	
@@ -469,6 +479,6 @@
 		
 		if (!(notify instanceof Invoke) && rtmp != null && rtmp.getMode() == RTMP.MODE_SERVER &&
-			header != null && header.getStreamId() != 0 && isStreamMetadataAction(action)) {
-			// Don't decode stream metadata
+			header != null && header.getStreamId() != 0 && !isStreamCommand(action)) {
+			// Don't decode "NetStream.send" requests
 			in.position(start);
 			notify.setData(in.asReadOnlyBuffer());
Index: /java/server/trunk/src/org/red5/server/stream/consumer/ConnectionConsumer.java
===================================================================
--- /java/server/trunk/src/org/red5/server/stream/consumer/ConnectionConsumer.java (revision 1241)
+++ /java/server/trunk/src/org/red5/server/stream/consumer/ConnectionConsumer.java (revision 1260)
@@ -84,5 +84,5 @@
 				notify.setHeader(msg.getHeader());
 				notify.setTimestamp(msg.getTimestamp());
-				video.write(notify);
+				data.write(notify);
 				break;
 			case Constants.TYPE_VIDEO_DATA:
@@ -149,12 +149,4 @@
 		if ("pendingCount".equals(oobCtrlMsg.getServiceName())) {
 			oobCtrlMsg.setResult(conn.getPendingMessages());
-		} else if ("streamSend".equals(oobCtrlMsg.getServiceName())) {
-			IServiceCall call = null;
-			if (oobCtrlMsg.getServiceParamMap() != null)
-				call = (IServiceCall) oobCtrlMsg.getServiceParamMap().get("call");
-			
-			if (call != null)
-				// Call method on the stream
-				conn.notify(call, data.getId());
 		} else if ("pendingVideoCount".equals(oobCtrlMsg.getServiceName())) {
 			IClientStream stream = conn.getStreamByChannelId(video.getId());
Index: /java/server/trunk/src/org/red5/server/stream/StreamService.java
===================================================================
--- /java/server/trunk/src/org/red5/server/stream/StreamService.java (revision 1212)
+++ /java/server/trunk/src/org/red5/server/stream/StreamService.java (revision 1260)
@@ -19,7 +19,4 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
  */
-
-import java.util.HashMap;
-import java.util.Map;
 
 import org.red5.server.BaseConnection;
@@ -29,5 +26,4 @@
 import org.red5.server.api.IScope;
 import org.red5.server.api.Red5;
-import org.red5.server.api.service.IServiceCall;
 import org.red5.server.api.stream.IBroadcastStream;
 import org.red5.server.api.stream.IClientBroadcastStream;
@@ -39,5 +35,4 @@
 import org.red5.server.api.stream.ISubscriberStream;
 import org.red5.server.api.stream.support.SimplePlayItem;
-import org.red5.server.messaging.OOBControlMessage;
 import org.red5.server.net.rtmp.RTMPHandler;
 
@@ -273,25 +268,4 @@
 	}
 
-	public void send(IServiceCall call) {
-		IConnection conn = Red5.getConnectionLocal();
-		if (!(conn instanceof IStreamCapableConnection)) return;
-		IStreamCapableConnection streamConn = (IStreamCapableConnection) conn;
-		int streamId = getCurrentStreamId();
-		IClientStream stream = streamConn.getStreamById(streamId);
-		if (!(stream instanceof IBroadcastStream)) return;
-		IBroadcastStream bs = (IBroadcastStream) stream;
-		if (bs.getPublishedName() == null) return;
-		IBroadcastScope bsScope = getBroadcastScope(conn.getScope(), bs.getPublishedName());
-		if (bsScope != null) {
-			OOBControlMessage msg = new OOBControlMessage();
-			msg.setServiceName("streamSend");
-			msg.setTarget("ConnectionConsumer");
-			Map<String, Object> params = new HashMap<String, Object>();
-			params.put("call", call);
-			msg.setServiceParamMap(params);
-			bsScope.sendOOBControlMessage(bs.getProvider(), msg);
-		}
-	}
-	
 	private int getCurrentStreamId() {
 		// TODO: this must come from the current connection!
Index: /java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java
===================================================================
--- /java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java (revision 1241)
+++ /java/server/trunk/src/org/red5/server/stream/ClientBroadcastStream.java (revision 1260)
@@ -53,4 +53,5 @@
 import org.red5.server.net.rtmp.event.AudioData;
 import org.red5.server.net.rtmp.event.IRTMPEvent;
+import org.red5.server.net.rtmp.event.Notify;
 import org.red5.server.net.rtmp.event.VideoData;
 import org.red5.server.net.rtmp.status.Status;
@@ -78,4 +79,6 @@
 	/** Stores absolute time for audio stream. */
 	private long videoTime = -1;
+	/** Stores absolute time for data stream. */
+	private long dataTime = -1;
 	private int audioAdd = 0;
 	
@@ -187,5 +190,5 @@
 	
 	public void dispatchEvent(IEvent event) {
-		if (!(event instanceof IRTMPEvent) && (event.getType() != IEvent.Type.STREAM_CONTROL) && (event.getType() != IEvent.Type.STREAM_DATA))
+		if (!(event instanceof IRTMPEvent) && (event.getType() != IEvent.Type.STREAM_CONTROL) && (event.getType() != IEvent.Type.STREAM_DATA) && !(event instanceof Notify))
 			return;
 		
@@ -247,4 +250,11 @@
 				videoTime = rtmpEvent.getTimestamp();
 			thisTime = videoTime;
+		} else if (rtmpEvent instanceof Notify) {
+			lastTime = dataTime;
+			if (rtmpEvent.getHeader().isTimerRelative())
+				dataTime += rtmpEvent.getTimestamp();
+			else
+				dataTime = rtmpEvent.getTimestamp();
+			thisTime = dataTime;
 		}
 		
Index: /java/server/trunk/src/org/red5/server/api/stream/IStreamService.java
===================================================================
--- /java/server/trunk/src/org/red5/server/api/stream/IStreamService.java (revision 1195)
+++ /java/server/trunk/src/org/red5/server/api/stream/IStreamService.java (revision 1260)
@@ -1,5 +1,3 @@
 package org.red5.server.api.stream;
-
-import org.red5.server.api.service.IServiceCall;
 
 /*
@@ -73,10 +71,3 @@
 	public void receiveAudio(boolean receive);
 	
-	/**
-	 * Send a call to all subscribers of a stream.
-	 * 
-	 * @param call
-	 */
-	public void send(IServiceCall call);
-	
 }


Note:
Diffs are chopped if more than 25k.
This is to get past the limit on the mailing list.



More information about the Red5commits mailing list