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>