Merge pull request #752 from ritzalam/update-to-red5-2015-08-10-snapshot

Update to red5 2015 08 10 snapshot
This commit is contained in:
Richard Alam 2015-08-10 17:33:32 -04:00
commit 9451876c72
11 changed files with 97 additions and 59 deletions

View File

@ -3,25 +3,30 @@
<classpathentry kind="src" path="src/main/java"/> <classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="src" path="src/test/java"/> <classpathentry kind="src" path="src/test/java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="lib/com.springsource.slf4j.api-1.6.1.jar"/> <classpathentry kind="lib" path="lib/aopalliance-1.0.jar"/>
<classpathentry kind="lib" path="lib/com.springsource.slf4j.bridge-1.6.1.jar"/>
<classpathentry kind="lib" path="lib/commons-pool-1.5.6.jar"/> <classpathentry kind="lib" path="lib/commons-pool-1.5.6.jar"/>
<classpathentry kind="lib" path="lib/easymock-2.4.jar"/> <classpathentry kind="lib" path="lib/easymock-2.4.jar"/>
<classpathentry kind="lib" path="lib/jcl-over-slf4j-1.6.1.jar"/> <classpathentry kind="lib" path="lib/gson-1.7.1.jar"/>
<classpathentry kind="lib" path="lib/jcip-annotations-1.0.jar"/>
<classpathentry kind="lib" path="lib/jcl-over-slf4j-1.7.9.jar"/>
<classpathentry kind="lib" path="lib/jedis-2.0.0.jar"/> <classpathentry kind="lib" path="lib/jedis-2.0.0.jar"/>
<classpathentry kind="lib" path="lib/jul-to-slf4j-1.6.1.jar"/> <classpathentry kind="lib" path="lib/jul-to-slf4j-1.7.9.jar"/>
<classpathentry kind="lib" path="lib/log4j-over-slf4j-1.6.1.jar"/> <classpathentry kind="lib" path="lib/log4j-over-slf4j-1.7.9.jar"/>
<classpathentry kind="lib" path="lib/logback-classic-0.9.28.jar"/> <classpathentry kind="lib" path="lib/logback-classic-1.1.2.jar"/>
<classpathentry kind="lib" path="lib/logback-core-0.9.28.jar"/> <classpathentry kind="lib" path="lib/logback-core-1.1.2.jar"/>
<classpathentry kind="lib" path="lib/mina-core-2.0.4.jar"/> <classpathentry kind="lib" path="lib/mina-core-2.0.8.jar"/>
<classpathentry kind="lib" path="lib/mina-integration-beans-2.0.4.jar"/> <classpathentry kind="lib" path="lib/mina-integration-beans-2.0.8.jar"/>
<classpathentry kind="lib" path="lib/mina-integration-jmx-2.0.4.jar"/> <classpathentry kind="lib" path="lib/mina-integration-jmx-2.0.8.jar"/>
<classpathentry kind="lib" path="lib/red5-io-1.0.5-RELEASE.jar"/>
<classpathentry kind="lib" path="lib/red5-server-1.0.5-RELEASE.jar"/>
<classpathentry kind="lib" path="lib/red5-server-common-1.0.5-RELEASE.jar"/>
<classpathentry kind="lib" path="lib/servlet-api-2.5.jar"/> <classpathentry kind="lib" path="lib/servlet-api-2.5.jar"/>
<classpathentry kind="lib" path="lib/spring-beans-3.0.6.RELEASE.jar"/> <classpathentry kind="lib" path="lib/slf4j-api-1.7.9.jar"/>
<classpathentry kind="lib" path="lib/spring-context-3.0.6.RELEASE.jar"/> <classpathentry kind="lib" path="lib/spring-aop-4.0.8.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-core-3.0.6.RELEASE.jar"/> <classpathentry kind="lib" path="lib/spring-beans-4.0.7.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-web-3.0.6.RELEASE.jar"/> <classpathentry kind="lib" path="lib/spring-context-4.0.7.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/testng-5.8.jar"/> <classpathentry kind="lib" path="lib/spring-core-4.0.7.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/red5-1.0r4406.jar"/> <classpathentry kind="lib" path="lib/spring-web-4.0.8.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/bbb-common-message-0.0.5.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@ -63,9 +63,9 @@ dependencies {
providedCompile 'org.springframework:spring-core:4.0.7.RELEASE@jar' providedCompile 'org.springframework:spring-core:4.0.7.RELEASE@jar'
// Red5 // Red5
providedCompile 'org/red5:red5-server:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server:1.0.6-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server-common:1.0.6-SNAPSHOT@jar'
providedCompile 'org.red5:red5-io:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-io:1.0.6-SNAPSHOT@jar'
// Logging // Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar' providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'

View File

@ -62,9 +62,9 @@ dependencies {
providedCompile 'org.springframework:spring-context:4.0.8.RELEASE@jar' providedCompile 'org.springframework:spring-context:4.0.8.RELEASE@jar'
providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar' providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
providedCompile 'org/red5:red5-server:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server:1.0.6-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server-common:1.0.6-SNAPSHOT@jar'
providedCompile 'org.red5:red5-io:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-io:1.0.6-SNAPSHOT@jar'
// Logging // Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar' providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'

View File

@ -77,8 +77,8 @@ dependencies {
providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar' providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
// Red5 // Red5
providedCompile 'org/red5:red5-server:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server:1.0.6-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server-common:1.0.6-SNAPSHOT@jar'
// Logging // Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar' providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<actionScriptProperties analytics="false" mainApplicationPath="BigBlueButton.mxml" projectUUID="f330b47a-ef44-431d-8c83-1768892be326" version="10"> <actionScriptProperties analytics="false" mainApplicationPath="BigBlueButton.mxml" projectUUID="f330b47a-ef44-431d-8c83-1768892be326" version="11">
<compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true"> <compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" useFlashSDK="false" verifyDigests="true" warn="true">
<compilerSourcePath/> <compilerSourcePath/>
<libraryPath defaultLinkType="0"> <libraryPath defaultLinkType="0">
<libraryPathEntry kind="4" path=""> <libraryPathEntry kind="4" path="">
@ -17,6 +17,7 @@
<application path="BigBlueButton.mxml"/> <application path="BigBlueButton.mxml"/>
</applications> </applications>
<modules/> <modules/>
<workers/>
<buildCSSFiles/> <buildCSSFiles/>
<flashCatalyst validateFlashCatalystCompatibility="false"/> <flashCatalyst validateFlashCatalystCompatibility="false"/>
</actionScriptProperties> </actionScriptProperties>

View File

@ -208,7 +208,7 @@ package org.bigbluebutton.modules.videoconf.business
ns.videoStreamSettings = h264; ns.videoStreamSettings = h264;
} }
ns.publish(e.stream); ns.publish(e.stream, "live");
camerasPublishing[e.stream] = ns; camerasPublishing[e.stream] = ns;
} }

View File

@ -84,9 +84,9 @@ dependencies {
providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar' providedCompile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
// Red5 // Red5
providedCompile 'org/red5:red5-server:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server:1.0.6-SNAPSHOT@jar'
providedCompile 'org.red5:red5-server-common:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-server-common:1.0.6-SNAPSHOT@jar'
providedCompile 'org.red5:red5-io:1.0.5-RELEASE@jar' providedCompile 'org.red5:red5-io:1.0.6-SNAPSHOT@jar'
// Logging // Logging
providedCompile 'ch.qos.logback:logback-core:1.1.2@jar' providedCompile 'ch.qos.logback:logback-core:1.1.2@jar'

View File

@ -81,5 +81,17 @@ public class ScreenVideo implements IVideoStreamCodec {
log.debug("getting DecoderConfiguration"); log.debug("getting DecoderConfiguration");
return data; return data;
} }
@Override
public FrameData getInterframe(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int getNumInterframes() {
// TODO Auto-generated method stub
return 0;
}
} }

View File

@ -22,6 +22,7 @@ import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
import org.red5.logging.Red5LoggerFactory; import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.event.IEvent; import org.red5.server.api.event.IEvent;
import org.red5.server.api.scope.IScope; import org.red5.server.api.scope.IScope;
@ -38,12 +39,12 @@ import org.red5.server.messaging.PipeConnectionEvent;
import org.red5.server.net.rtmp.event.IRTMPEvent; import org.red5.server.net.rtmp.event.IRTMPEvent;
import org.red5.server.net.rtmp.event.Notify; import org.red5.server.net.rtmp.event.Notify;
import org.red5.server.net.rtmp.event.VideoData; import org.red5.server.net.rtmp.event.VideoData;
import org.red5.server.net.rtmp.message.Constants;
import org.red5.server.stream.message.RTMPMessage; import org.red5.server.stream.message.RTMPMessage;
import org.red5.codec.IVideoStreamCodec; import org.red5.codec.IVideoStreamCodec;
import org.red5.codec.IStreamCodecInfo; import org.red5.codec.IStreamCodecInfo;
import org.red5.codec.StreamCodecInfo; import org.red5.codec.StreamCodecInfo;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.red5.server.api.stream.IStreamPacket;; import org.red5.server.api.stream.IStreamPacket;;
public class ScreenVideoBroadcastStream implements IBroadcastStream, IProvider, IPipeConnectionListener { public class ScreenVideoBroadcastStream implements IBroadcastStream, IProvider, IPipeConnectionListener {
@ -189,7 +190,7 @@ public class ScreenVideoBroadcastStream implements IBroadcastStream, IProvider,
if (event instanceof IRTMPEvent) { if (event instanceof IRTMPEvent) {
IRTMPEvent rtmpEvent = (IRTMPEvent) event; IRTMPEvent rtmpEvent = (IRTMPEvent) event;
if (livePipe != null) { if (livePipe != null) {
RTMPMessage msg = RTMPMessage.build(rtmpEvent); RTMPMessage msg = RTMPMessage.build(rtmpEvent, Constants.SOURCE_TYPE_LIVE);
if (creationTime == null) if (creationTime == null)
creationTime = (long)rtmpEvent.getTimestamp(); creationTime = (long)rtmpEvent.getTimestamp();
@ -199,7 +200,7 @@ public class ScreenVideoBroadcastStream implements IBroadcastStream, IProvider,
streamCodecInfo.setHasVideo(true); streamCodecInfo.setHasVideo(true);
streamCodecInfo.setVideoCodec(videoStreamCodec); streamCodecInfo.setVideoCodec(videoStreamCodec);
videoStreamCodec.reset(); videoStreamCodec.reset();
videoStreamCodec.addData(((VideoData) rtmpEvent).getData()); videoStreamCodec.addData(((VideoData) rtmpEvent).getData());
livePipe.pushMessage(msg); livePipe.pushMessage(msg);
// Notify listeners about received packet // Notify listeners about received packet

View File

@ -44,10 +44,12 @@ class SessionSVC(sessionManager:SessionManagerSVC, room: String, screenDim: Dime
private var stop = true private var stop = true
private var mouseLoc:Point = new Point(100,100) private var mouseLoc:Point = new Point(100,100)
private var pendingGenKeyFrameRequest = false private var pendingGenKeyFrameRequest = false
private var timestamp = 0L;
private var lastUserKeyFrameRequest = 0L private var lastUserKeyFrameRequest = 0L
private var sentInitialKeyFrame = false; private var sentInitialKeyFrame = false;
private var lastKeyFrameSentOn = 0L
private var streamStartedOn = 0L
private var streamStarted = false
/* /*
* Schedule to generate a key frame after 30seconds of a request. * Schedule to generate a key frame after 30seconds of a request.
* This prevents us from generating unnecessary key frames when * This prevents us from generating unnecessary key frames when
@ -64,13 +66,23 @@ class SessionSVC(sessionManager:SessionManagerSVC, room: String, screenDim: Dime
} }
} }
def scheduleGenerateFrame() { def scheduleGenerateFrame() {
val mainActor = self val mainActor = self
actor { actor {
Thread.sleep(interframeInterval) Thread.sleep(interframeInterval)
mainActor ! "GenerateFrame" val now = System.currentTimeMillis()
} if ((now - lastKeyFrameSentOn) > 60000) {
} // Generate a key frame every 1 minute. The reason is that if
// packets are dropped for a user with slow connection, packets
// will continue to be dropped for that user until a key frame
// is sent. (ralam july 15, 2015)
mainActor ! "GenerateAKeyFrame"
} else {
mainActor ! "GenerateFrame"
}
}
}
def act() = { def act() = {
loop { loop {
@ -87,20 +99,20 @@ class SessionSVC(sessionManager:SessionManagerSVC, room: String, screenDim: Dime
} }
} }
case GenerateKeyFrame => { case GenerateKeyFrame => {
val now = System.currentTimeMillis() // do not generate a key frame every time a user joins as we
// Wait 30sec between keyframe request from the users. This prevents // generate key frames regularly now.
// creating many keyframes when users join the session close to one //scheduleGenerateKeyFrame(keyFrameInterval)
// another.
if (now - lastUserKeyFrameRequest > 30000) {
lastUserKeyFrameRequest = now
scheduleGenerateKeyFrame(keyFrameInterval)
}
} }
case "GenerateAKeyFrame" => { case "GenerateAKeyFrame" => {
pendingGenKeyFrameRequest = false pendingGenKeyFrameRequest = false
log.debug("Session: Generating Key Frame for room %s", room) log.debug("Session: Generating Key Frame for room %s", room)
generateFrame(true) generateFrame(true)
lastKeyFrameSentOn = System.currentTimeMillis()
if (!stop) {
scheduleGenerateFrame()
} else {
exit()
}
} }
case b: UpdateSessionBlock => updateBlock(b.position, b.blockData, b.keyframe, b.seqNum) case b: UpdateSessionBlock => updateBlock(b.position, b.blockData, b.keyframe, b.seqNum)
case m: Any => log.warning("Session: Unknown message [%s]", m) case m: Any => log.warning("Session: Unknown message [%s]", m)
@ -153,8 +165,15 @@ class SessionSVC(sessionManager:SessionManagerSVC, room: String, screenDim: Dime
sessionManager ! new RemoveSession(room) sessionManager ! new RemoveSession(room)
} else { } else {
if (blockManager != null) { if (blockManager != null) {
timestamp += 50;
stream ! new UpdateStream(room, blockManager.generateFrame(keyframe), timestamp) val now = System.currentTimeMillis()
if (!streamStarted) {
streamStarted = true
streamStartedOn = now
}
val ts = now - streamStartedOn
stream ! new UpdateStream(room, blockManager.generateFrame(keyframe), ts)
stream ! new UpdateStreamMouseLocation(room, mouseLoc) stream ! new UpdateStreamMouseLocation(room, mouseLoc)
} }
} }

View File

@ -82,9 +82,9 @@ dependencies {
compile 'org.springframework:spring-core:4.0.8.RELEASE@jar' compile 'org.springframework:spring-core:4.0.8.RELEASE@jar'
// Red5 // Red5
compile 'org/red5:red5-server:1.0.5-RELEASE@jar' compile 'org.red5:red5-server:1.0.6-SNAPSHOT@jar'
compile 'org.red5:red5-server-common:1.0.5-RELEASE@jar' compile 'org.red5:red5-server-common:1.0.6-SNAPSHOT@jar'
compile 'org.red5:red5-io:1.0.5-RELEASE@jar' compile 'org.red5:red5-io:1.0.6-SNAPSHOT@jar'
// Logging // Logging
compile 'ch.qos.logback:logback-core:1.1.2@jar' compile 'ch.qos.logback:logback-core:1.1.2@jar'