You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2014/02/04 19:53:19 UTC

svn commit: r1564416 - in /openmeetings/branches/3.0.x/src/screenshare: java/org/apache/openmeetings/screen/webstart/ java/org/apache/openmeetings/screen/webstart/gui/ resources/

Author: solomax
Date: Tue Feb  4 18:53:18 2014
New Revision: 1564416

URL: http://svn.apache.org/r1564416
Log:
[OPENMEETINGS-902] attempt to fix screensharing

Modified:
    openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CaptureScreen.java
    openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java
    openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/gui/ScreenSharerFrame.java
    openmeetings/branches/3.0.x/src/screenshare/resources/logback.xml

Modified: openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CaptureScreen.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CaptureScreen.java?rev=1564416&r1=1564415&r2=1564416&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CaptureScreen.java (original)
+++ openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CaptureScreen.java Tue Feb  4 18:53:18 2014
@@ -28,6 +28,7 @@ import static org.slf4j.LoggerFactory.ge
 import java.awt.Rectangle;
 import java.awt.Robot;
 import java.io.IOException;
+import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -46,13 +47,14 @@ final class CaptureScreen extends Thread
 	private volatile boolean active = true;
 	private IScreenEncoder se;
 	private IScreenShare client;
-	private IoBuffer buffer;
+	private ArrayBlockingQueue<VideoData> frames = new ArrayBlockingQueue<VideoData>(2);
 	private String host = null;
 	private String app = null;
 	private int port = -1;
 	private int streamId;
 	private boolean startPublish = false;
 	private boolean sendCursor = false;
+	private final ScheduledExecutorService sendScheduler = Executors.newScheduledThreadPool(1);
 	private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(20);
 	private final ScheduledExecutorService cursorScheduler = Executors.newScheduledThreadPool(1);
 
@@ -74,6 +76,11 @@ final class CaptureScreen extends Thread
 			//no-op
 		}
 		try {
+			sendScheduler.shutdownNow();
+		} catch (Exception e) {
+			//no-op
+		}
+		try {
 			cursorScheduler.shutdownNow();
 		} catch (Exception e) {
 			//no-op
@@ -107,10 +114,29 @@ final class CaptureScreen extends Thread
 						if (log.isTraceEnabled()) {
 							log.trace(String.format("Image was encoded in %s ms", System.currentTimeMillis() - start));
 						}
-						timestamp += timeBetweenFrames;
-						pushVideo(data, timestamp);
+						IoBuffer buf = IoBuffer.allocate(data.length);
+						buf.clear();
+						buf.put(data);
+						buf.flip();
+						frames.offer(new VideoData(buf));
 					} catch (IOException e) {
-						log.error("Error while encoding/sending: ", e);
+						log.error("Error while encoding: ", e);
+					}
+				}
+			}, 0, timeBetweenFrames * NANO_MULTIPLIER, TimeUnit.NANOSECONDS);
+			sendScheduler.scheduleWithFixedDelay(new Runnable() {
+				public void run() {
+					if (frames.size() > 1) {
+						frames.poll();
+					}
+					VideoData f = frames.peek();
+					if (f != null) {
+						try {
+							timestamp += timeBetweenFrames;
+							pushVideo(f, (int)timestamp);
+						} catch (IOException e) {
+							log.error("Error while sending: ", e);
+						}
 					}
 				}
 			}, 0, timeBetweenFrames * NANO_MULTIPLIER, TimeUnit.NANOSECONDS);
@@ -143,19 +169,9 @@ final class CaptureScreen extends Thread
 	}
 	*/
 	
-	private void pushVideo(byte[] video, int ts) throws IOException {
+	private void pushVideo(VideoData data, int ts) throws IOException {
 		if (startPublish) {
-			if (buffer == null || (buffer.capacity() < video.length && !buffer.isAutoExpand())) {
-				buffer = IoBuffer.allocate(video.length);
-				buffer.setAutoExpand(true);
-			}
-	
-			buffer.clear();
-			buffer.put(video);
-			buffer.flip();
-	
-			log.trace("Video frame sent :: " + ts);
-			RTMPMessage rtmpMsg = RTMPMessage.build(new VideoData(buffer), ts);
+			RTMPMessage rtmpMsg = RTMPMessage.build(data, ts);
 			client.publishStreamData(streamId, rtmpMsg);
 		}
 	}

Modified: openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java?rev=1564416&r1=1564415&r2=1564416&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java (original)
+++ openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/CoreScreenShare.java Tue Feb  4 18:53:18 2014
@@ -214,7 +214,6 @@ public class CoreScreenShare implements 
 
 			instance.invoke("setConnectionAsSharingClient", new Object[] { map }, this);
 		} catch (Exception err) {
-			log.error("setConnectionAsSharingClient Exception: ", err);
 			frame.setStatus("Error: " + err.getLocalizedMessage());
 			log.error("[setConnectionAsSharingClient]", err);
 		}

Modified: openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/gui/ScreenSharerFrame.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/gui/ScreenSharerFrame.java?rev=1564416&r1=1564415&r2=1564416&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/gui/ScreenSharerFrame.java (original)
+++ openmeetings/branches/3.0.x/src/screenshare/java/org/apache/openmeetings/screen/webstart/gui/ScreenSharerFrame.java Tue Feb  4 18:53:18 2014
@@ -466,7 +466,7 @@ public class ScreenSharerFrame extends J
 		        calcRescaleFactors();
 			}
 		}); 
-		comboFPS.setSelectedIndex(1);
+		comboFPS.setSelectedIndex(2);
 		comboFPS.setBounds(390, 170, 70, 24);
 		panelScreen.add(comboFPS);
 		

Modified: openmeetings/branches/3.0.x/src/screenshare/resources/logback.xml
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/screenshare/resources/logback.xml?rev=1564416&r1=1564415&r2=1564416&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/screenshare/resources/logback.xml (original)
+++ openmeetings/branches/3.0.x/src/screenshare/resources/logback.xml Tue Feb  4 18:53:18 2014
@@ -19,35 +19,33 @@
   
 -->
 
-<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-    xsi:noNamespaceSchemaLocation="logback.xsd">
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:noNamespaceSchemaLocation="logback.xsd">
 	<contextName>${current_openmeetings_context_name}</contextName>
-	
+
 	<jmxConfigurator contextName="${current_openmeetings_context_name}" />
 
-  <appender name="FLOG2" class="ch.qos.logback.core.FileAppender">
+	<appender name="FLOG2" class="ch.qos.logback.core.FileAppender">
 		<File>screensharing.log</File>
 		<Append>false</Append>
 		<Encoding>UTF-8</Encoding>
 		<BufferedIO>false</BufferedIO>
 		<ImmediateFlush>true</ImmediateFlush>
 		<layout class="ch.qos.logback.classic.PatternLayout">
-			<Pattern>
-				%5p %d{MM-dd HH:mm:ss.SSS } %F %r %L %c [%t] - %m%n
-			</Pattern>
+			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %L %c{10} [%t] - %m%n</pattern>
+		</layout>
+	</appender>
+	<appender name="CONSOLE2" class="ch.qos.logback.core.ConsoleAppender">
+		<layout class="ch.qos.logback.classic.PatternLayout">
+			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %L %c{10} [%t] - %m%n</pattern>
 		</layout>
-  </appender>
-  <appender name="CONSOLE2" class="ch.qos.logback.core.ConsoleAppender">
-    <layout class="ch.qos.logback.classic.PatternLayout">
-      <pattern>%5p %d{MM-dd HH:mm:ss.SSS } %F %r %L %c [%t] - %m%n</pattern>
-    </layout>
-  </appender>
-  <logger name="org.apache.openmeetings">
-    <level value="TRACE"/>
-  </logger>
-  <root>
-    <level value="TRACE"/>
-    <appender-ref ref="FLOG2"/>
-    <appender-ref ref="CONSOLE2"/>
-  </root>
+	</appender>
+	<logger name="org.apache.openmeetings">
+		<level value="DEBUG" />
+	</logger>
+	<root>
+		<level value="DEBUG" />
+		<appender-ref ref="FLOG2" />
+		<appender-ref ref="CONSOLE2" />
+	</root>
 </configuration>