[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