[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