[Red5commits] [2064] "receiveAudio" and "receiveVideo" work for VOD streams (Jira SN-22)fixed frozen

jbauch luke at codegent.com
Wed May 23 00:40:19 EDT 2007


"receiveAudio" and "receiveVideo" work for VOD streams (Jira SN-22)
fixed frozen video if audio is disabled in live streams (Jira SN-22)


Timestamp: 05/22/07 18:18:18 EST (5 hours ago) 
Change: 2064 
Author: jbauch

Files (see diff or trac for details): 
doc/trunk/changelog.txt
java/server/trunk/src/org/red5/server/stream/PlaylistSubscriberStream.java


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

Index: /java/server/trunk/src/org/red5/server/stream/PlaylistSubscriberStream.java
===================================================================
--- /java/server/trunk/src/org/red5/server/stream/PlaylistSubscriberStream.java (revision 2037)
+++ /java/server/trunk/src/org/red5/server/stream/PlaylistSubscriberStream.java (revision 2064)
@@ -506,12 +506,41 @@
 	}
 
+    /**
+	 * Seek to current position to restart playback with audio and/or video.
+     */
+    private void seekToCurrentPlayback() {
+    	if (engine.isPullMode) {
+			try {
+				// TODO: figure out if this is the correct position to seek to
+				final long delta = System.currentTimeMillis() - engine.playbackStart;
+				engine.seek((int) delta);
+			} catch (OperationNotSupportedException err) {
+				// Ignore error, should not happen for pullMode engines
+			}
+		}
+    }
+    
 	/** {@inheritDoc} */
     public void receiveVideo(boolean receive) {
+    	final boolean seek = (!receiveVideo && receive);
 		receiveVideo = receive;
+		if (seek) {
+			// Video has just been re-enabled
+			seekToCurrentPlayback();
+		}
 	}
 
 	/** {@inheritDoc} */
     public void receiveAudio(boolean receive) {
+    	if (receiveAudio && !receive) {
+    		// We need to send a black audio packet to reset the player
+    		engine.sendBlankAudio = true;
+    	}
+    	final boolean seek = (!receiveAudio && receive);
 		receiveAudio = receive;
+		if (seek) {
+			// Audio has just been re-enabled
+			seekToCurrentPlayback();
+		}
 	}
 
@@ -849,4 +878,8 @@
          */
         private long nextCheckBufferUnderrun;
+        /**
+         * Send blank audio packet next?
+         */
+        private boolean sendBlankAudio;
         
 		/**
@@ -1164,4 +1197,5 @@
 			notifyItemSeek(currentItem, seekPos);
 			boolean messageSent = false;
+			boolean startPullPushThread = false;
 			if ((state == State.PAUSED || state == State.STOPPED) && sendCheckVideoCM(msgIn)) {
 				// we send a single snapshot on pause.
@@ -1198,5 +1232,5 @@
 				}
 			} else {
-				ensurePullAndPushRunning();
+				startPullPushThread = true;
 			}
 			
@@ -1214,4 +1248,8 @@
 			}
 			
+			if (startPullPushThread) {
+				ensurePullAndPushRunning();
+			}
+			
 			if (state != State.STOPPED && currentItem.getLength() >= 0 && (position - streamOffset) >= currentItem.getLength()) {
 				// Seeked after end of stream
@@ -1364,5 +1402,4 @@
 					while (true) {
 						IMessage msg = msgIn.pullMessage();
-						ensurePullAndPushRunning();
 						if (msg == null) {
 							// No more packets to send
@@ -1373,4 +1410,27 @@
 								RTMPMessage rtmpMessage = (RTMPMessage) msg;
 								IRTMPEvent body = rtmpMessage.getBody();
+								if (!receiveAudio && body instanceof AudioData) {
+									// The user doesn't want to get audio packets
+									((IStreamData) body).getData().release();
+									if (sendBlankAudio) {
+										// Send reset audio packet
+										sendBlankAudio = false;
+										body = new AudioData();
+										// We need a zero timestamp
+										if (lastMessage != null) {
+											body.setTimestamp(lastMessage.getTimestamp()-timestampOffset);
+										} else {
+											body.setTimestamp(-timestampOffset);
+										}
+										rtmpMessage.setBody(body);
+									} else {
+										continue;
+									}
+								} else if (!receiveVideo && body instanceof VideoData) {
+									// The user doesn't want to get video packets
+									((IStreamData) body).getData().release();
+									continue;
+								}
+								
 								// Adjust timestamp when playing lists
 								body.setTimestamp(body.getTimestamp() + timestampOffset);
@@ -1382,4 +1442,5 @@
 									pendingMessage = rtmpMessage;
 								}
+								ensurePullAndPushRunning();
 								break;
 							}
@@ -1841,5 +1902,15 @@
 					}
 				} else if (body instanceof AudioData) {
-					if (!receiveAudio || !audioBucket.acquireToken(size, 0)) {
+					if (!receiveAudio && sendBlankAudio) {
+						// Send blank audio packet to reset player
+						sendBlankAudio = false;
+						body = new AudioData();
+						if (lastMessage != null) {
+							body.setTimestamp(lastMessage.getTimestamp());
+						} else {
+							body.setTimestamp(0);
+						}
+						rtmpMessage.setBody(body);
+					} else if (!receiveAudio || !audioBucket.acquireToken(size, 0)) {
 						return;
 					}
Index: /doc/trunk/changelog.txt
===================================================================
--- /doc/trunk/changelog.txt (revision 2040)
+++ /doc/trunk/changelog.txt (revision 2064)
@@ -19,4 +19,5 @@
 - Added Shutdown class for cleanly shutting down a Red5 instance
 - Added support for AMF3 in remoting server
+- "receiveAudio" and "receiveVideo" work for VOD streams (Jira SN-22)
 
 Bugfixes:
@@ -45,4 +46,5 @@
 - fixed potential NPEs in PlaylistSubscriberStream (Jira SN-40)
 - fixed various problems with deserializing AMF0 references in remoting
+- fixed frozen video if audio is disabled in live streams (Jira SN-22)
 
 


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