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 2017/09/29 06:17:02 UTC

openmeetings git commit: [OPENMEETINGS-1714] more issues are fixed

Repository: openmeetings
Updated Branches:
  refs/heads/master 7bc1800f9 -> 381838de8


[OPENMEETINGS-1714] more issues are fixed


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/381838de
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/381838de
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/381838de

Branch: refs/heads/master
Commit: 381838de81b518b6330ada11c0ba81b426a28e1f
Parents: 7bc1800
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Fri Sep 29 13:16:53 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Fri Sep 29 13:16:53 2017 +0700

----------------------------------------------------------------------
 .../db/dto/basic/ServiceResult.java             |   4 +-
 .../openmeetings/screenshare/CaptureScreen.java |  26 ++--
 .../apache/openmeetings/screenshare/Core.java   |  31 +++--
 .../screenshare/ScreenV1Encoder.java            |  30 ++---
 .../screenshare/gui/ScreenDimensions.java       | 120 +++++++++++++++----
 .../gui/ScreenHeightMouseListener.java          |   8 +-
 .../screenshare/gui/ScreenMouseListener.java    |   6 +-
 .../screenshare/gui/ScreenSharerFrame.java      | 100 +++++++++-------
 .../gui/ScreenWidthMouseListener.java           |   8 +-
 .../screenshare/gui/ScreenXMouseListener.java   |   6 +-
 .../screenshare/gui/ScreenYMouseListener.java   |   6 +-
 .../openmeetings/screenshare/job/EncodeJob.java |  19 +--
 .../openmeetings/screenshare/job/RemoteJob.java |  22 ++--
 .../util/OpenmeetingsVariables.java             |   5 +-
 .../openmeetings/web/app/Application.java       |   3 +-
 15 files changed, 242 insertions(+), 152 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java
index eb617d1..1bed23b 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/basic/ServiceResult.java
@@ -31,8 +31,8 @@ import org.apache.openmeetings.util.OmException;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class ServiceResult implements Serializable {
 	private static final long serialVersionUID = 1L;
-	public static ServiceResult UNKNOWN = new ServiceResult(OmException.UNKNOWN.getKey(), Type.ERROR);
-	public static ServiceResult NO_PERMISSION = new ServiceResult("error.notallowed", Type.ERROR);
+	public static final ServiceResult UNKNOWN = new ServiceResult(OmException.UNKNOWN.getKey(), Type.ERROR);
+	public static final ServiceResult NO_PERMISSION = new ServiceResult("error.notallowed", Type.ERROR);
 	private String message;
 	private String type;
 	@XmlType(namespace="org.apache.openmeetings.db.dto.basic.type")

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java
index 0ce3502..eb7fc8d 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/CaptureScreen.java
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.screenshare;
 
 import static org.apache.openmeetings.screenshare.Core.QUARTZ_GROUP_NAME;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.FPS;
 import static org.apache.openmeetings.screenshare.util.Util.getQurtzProps;
 import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -29,6 +28,7 @@ import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.openmeetings.screenshare.gui.ScreenDimensions;
 import org.apache.openmeetings.screenshare.job.CursorJob;
 import org.apache.openmeetings.screenshare.job.EncodeJob;
 import org.apache.openmeetings.screenshare.job.SendJob;
@@ -50,7 +50,7 @@ public class CaptureScreen extends Thread {
 	private static final Logger log = getLogger(CaptureScreen.class);
 	private final static String QUARTZ_CURSOR_TRIGGER_NAME = "CursorTrigger";
 	private final static String QUARTZ_CURSOR_JOB_NAME = "CursorJob";
-	private Core core;
+	private final Core core;
 	private int timestampDelta;
 	private volatile AtomicInteger timestamp = new AtomicInteger(0);
 	private volatile AtomicBoolean sendFrameGuard = new AtomicBoolean(false);
@@ -65,6 +65,8 @@ public class CaptureScreen extends Thread {
 	private Number streamId;
 	private boolean startPublish = false;
 	private Scheduler _scheduler;
+	private final JobDetail cursorJob;
+	private final Trigger cursorTrigger;
 
 	public CaptureScreen(Core coreScreenShare, IScreenShare client, String host, String app, int port) {
 		core = coreScreenShare;
@@ -72,6 +74,12 @@ public class CaptureScreen extends Thread {
 		this.host = host;
 		this.app = app;
 		this.port = port;
+		cursorJob = JobBuilder.newJob(CursorJob.class).withIdentity(QUARTZ_CURSOR_JOB_NAME, QUARTZ_GROUP_NAME).build();
+		cursorTrigger = TriggerBuilder.newTrigger()
+				.withIdentity(QUARTZ_CURSOR_TRIGGER_NAME, QUARTZ_GROUP_NAME)
+				.withSchedule(simpleSchedule().withIntervalInMilliseconds(1000 / Math.min(5, core.getDim().getFPS())).repeatForever())
+				.build();
+		cursorJob.getJobDataMap().put(CursorJob.CAPTURE_KEY, this);
 	}
 
 	private Scheduler getScheduler() {
@@ -107,8 +115,8 @@ public class CaptureScreen extends Thread {
 				Thread.sleep(60);
 			}
 
-			timestampDelta = 1000 / FPS;
-			se = new ScreenV1Encoder(3 * FPS); //send keyframe every 3 seconds
+			timestampDelta = 1000 / core.getDim().getFPS();
+			se = new ScreenV1Encoder(core.getDim()); //send keyframe every 3 seconds
 			startTime = System.currentTimeMillis();
 
 			JobDetail encodeJob = JobBuilder.newJob(EncodeJob.class).withIdentity("EncodeJob", QUARTZ_GROUP_NAME).build();
@@ -220,12 +228,6 @@ public class CaptureScreen extends Thread {
 		try {
 			Scheduler s = getScheduler();
 			if (sendCursor) {
-				JobDetail cursorJob = JobBuilder.newJob(CursorJob.class).withIdentity(QUARTZ_CURSOR_JOB_NAME, QUARTZ_GROUP_NAME).build();
-				Trigger cursorTrigger = TriggerBuilder.newTrigger()
-						.withIdentity(QUARTZ_CURSOR_TRIGGER_NAME, QUARTZ_GROUP_NAME)
-						.withSchedule(simpleSchedule().withIntervalInMilliseconds(1000 / Math.min(5, FPS)).repeatForever())
-						.build();
-				cursorJob.getJobDataMap().put(CursorJob.CAPTURE_KEY, this);
 				s.scheduleJob(cursorJob, cursorTrigger);
 			} else {
 				s.deleteJob(JobKey.jobKey(QUARTZ_CURSOR_JOB_NAME, QUARTZ_GROUP_NAME));
@@ -234,4 +236,8 @@ public class CaptureScreen extends Thread {
 			log.error("Unexpected Error schedule/unschedule cursor job", e);
 		}
 	}
+
+	public ScreenDimensions getDim() {
+		return core.getDim();
+	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
index 86e76a8..08af0d1 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/Core.java
@@ -19,12 +19,6 @@
 package org.apache.openmeetings.screenshare;
 
 import static java.lang.Boolean.TRUE;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerHeight;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerWidth;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerX;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerY;
 import static org.apache.openmeetings.screenshare.util.Util.getQurtzProps;
 import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -38,6 +32,7 @@ import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import org.apache.openmeetings.screenshare.gui.ScreenDimensions;
 import org.apache.openmeetings.screenshare.gui.ScreenSharerFrame;
 import org.apache.openmeetings.screenshare.job.RemoteJob;
 import org.quartz.JobBuilder;
@@ -65,7 +60,6 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 
 public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 	private static final Logger log = getLogger(Core.class);
-	public static float Ampl_factor = 1f;
 	final static String QUARTZ_GROUP_NAME = "ScreenShare";
 	final static String QUARTZ_REMOTE_JOB_NAME = "RemoteJob";
 	final static String QUARTZ_REMOTE_TRIGGER_NAME = "RemoteTrigger";
@@ -107,6 +101,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 	private SchedulerFactory schdlrFactory;
 	private Scheduler schdlr;
 	private LinkedBlockingQueue<Map<String, Object>> remoteEvents = new LinkedBlockingQueue<>();
+	private final ScreenDimensions dim;
 
 	private CaptureScreen getCapture() {
 		if (_capture == null) {
@@ -121,6 +116,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 	// ------------------------------------------------------------------------
 
 	public Core(String[] args) {
+		dim = new ScreenDimensions();
 		try {
 			System.setProperty("org.terracotta.quartz.skipUpdateCheck", "true");
 			for (String arg : args) {
@@ -222,11 +218,11 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 		try {
 			Point mouseP = MouseInfo.getPointerInfo().getLocation();
 
-			float scaleFactor = (1.0f * resizeX) / spinnerWidth;
+			float scaleFactor = (1.0f * dim.getResizeX()) / dim.getSpinnerWidth();
 
 			// Real size: Real mouse position = Resize : X
-			int x = (int)(Ampl_factor * (mouseP.getX() - spinnerX) * scaleFactor);
-			int y = (int)(Ampl_factor * (mouseP.getY() - spinnerY) * scaleFactor);
+			int x = (int)((mouseP.getX() - dim.getSpinnerX()) * scaleFactor);
+			int y = (int)((mouseP.getY() - dim.getSpinnerY()) * scaleFactor);
 
 			if (instance.getConnection() != null) {
 				if (Red5.getConnectionLocal() == null) {
@@ -256,8 +252,8 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 			}
 			Map<String, Object> map = new HashMap<>();
 
-			int scaledWidth = (int)(Ampl_factor * resizeX);
-			int scaledHeight = (int)(Ampl_factor * resizeY);
+			int scaledWidth = dim.getResizeX();
+			int scaledHeight = dim.getResizeY();
 
 			map.put("screenWidth", scaledWidth);
 			map.put("screenHeight", scaledHeight);
@@ -329,6 +325,11 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 		}
 	}
 
+	public void sharingStop() {
+		startSharing = false;
+		captureScreenStop("stopStreaming");
+	}
+
 	public void recordingStop() {
 		startRecording = false;
 		captureScreenStop("stopRecording");
@@ -540,7 +541,7 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 					log.debug("createPublishStream result stream id: {}; name: {}", getCapture().getStreamId(), broadcastId);
 					instance.publish(getCapture().getStreamId(), broadcastId, "live", this);
 
-					log.debug("setup capture thread spinnerWidth = {}; spinnerHeight = {};", spinnerWidth, spinnerHeight);
+					log.debug("setup capture thread spinnerWidth = {}; spinnerHeight = {};", dim.getSpinnerWidth(), dim.getSpinnerHeight());
 
 					if (!getCapture().isAlive()) {
 						getCapture().setSendCursor(startSharing);
@@ -603,4 +604,8 @@ public class Core implements IPendingServiceCallback, INetStreamEventHandler {
 	public LinkedBlockingQueue<Map<String, Object>> getRemoteEvents() {
 		return remoteEvents;
 	}
+
+	public ScreenDimensions getDim() {
+		return dim;
+	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java
index b5500bd..7fa9980 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/ScreenV1Encoder.java
@@ -18,8 +18,6 @@
  */
 package org.apache.openmeetings.screenshare;
 
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
 import static org.red5.io.IoConstants.FLAG_CODEC_SCREEN;
 import static org.red5.io.IoConstants.FLAG_FRAMETYPE_INTERFRAME;
 import static org.red5.io.IoConstants.FLAG_FRAMETYPE_KEYFRAME;
@@ -33,38 +31,30 @@ import java.io.OutputStream;
 import java.util.zip.Deflater;
 
 import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.openmeetings.screenshare.gui.ScreenDimensions;
 import org.red5.server.net.rtmp.event.VideoData;
 
 public class ScreenV1Encoder extends BaseScreenEncoder {
 	private int[][] last = null;
-	private static int KEY_FRAME_INDEX = 25;
 	private static int DEFAULT_BLOCK_SIZE = 32;
 	private static int DEFAULT_SCREEN_WIDTH = 1920;
 	private static int DEFAULT_SCREEN_HEIGHT = 1080;
 	private int keyFrameIndex;
 	private int frameCount = 0;
-	private int blockSize;
+	private int blockSize = DEFAULT_BLOCK_SIZE;
 	private ByteArrayOutputStream ba = new ByteArrayOutputStream(50 + 3 * DEFAULT_SCREEN_WIDTH * DEFAULT_SCREEN_HEIGHT);
 	private byte[] areaBuf = null;
 	private Deflater d = new Deflater(Deflater.DEFAULT_COMPRESSION);
 	private byte[] zipBuf = null;
 	private VideoData unalteredFrame = null;
+	private final ScreenDimensions dim;
 
-	public ScreenV1Encoder() {
-		this(KEY_FRAME_INDEX, DEFAULT_BLOCK_SIZE);
-	}
-
-	public ScreenV1Encoder(int keyFrameIndex) {
-		this(keyFrameIndex, DEFAULT_BLOCK_SIZE);
-	}
-
-	//will create square blocks
-	public ScreenV1Encoder(int keyFrameIndex, int blockSize) {
-		this.keyFrameIndex = keyFrameIndex;
+	public ScreenV1Encoder(ScreenDimensions dim) {
+		this.dim = dim;
+		this.keyFrameIndex = 3 * dim.getFPS();
 		if (blockSize < 16 || blockSize > 256 || blockSize % 16 != 0) {
 			throw new RuntimeException("Invalid block size passed: " + blockSize + " should be: 'from 16 to 256 in multiples of 16'");
 		}
-		this.blockSize = blockSize;
 
 		areaBuf = new byte[3 * blockSize * blockSize];
 		zipBuf = new byte[3 * blockSize * blockSize];
@@ -86,7 +76,7 @@ public class ScreenV1Encoder extends BaseScreenEncoder {
 		if (unalteredFrame == null) {
 			ByteArrayOutputStream ba = new ByteArrayOutputStream(200);
 
-			Rectangle _area = new Rectangle(resizeX, resizeY);
+			Rectangle _area = new Rectangle(dim.getResizeX(), dim.getResizeY());
 			//header
 			ba.write(getTag(FLAG_FRAMETYPE_INTERFRAME, FLAG_CODEC_SCREEN));
 			writeShort(ba, _area.width + ((blockSize / 16 - 1) << 12));
@@ -189,9 +179,9 @@ public class ScreenV1Encoder extends BaseScreenEncoder {
 		os.write( n       & 0xFF);
 	}
 
-	public static int[][] getImage(Rectangle screen, Robot robot) {
-		int[][] buffer = new int[resizeX][resizeY];
-		BufferedImage image = resize(robot.createScreenCapture(screen), new Rectangle(resizeX, resizeY));
+	public static int[][] getImage(ScreenDimensions dim, Rectangle screen, Robot robot) {
+		int[][] buffer = new int[dim.getResizeX()][dim.getResizeY()];
+		BufferedImage image = resize(robot.createScreenCapture(screen), new Rectangle(dim.getResizeX(), dim.getResizeY()));
 		for (int x = 0; x < image.getWidth(); ++x) {
 			for (int y = 0; y < image.getHeight(); ++y) {
 				buffer[x][y] = image.getRGB(x, y);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java
index c23e5ef..14c5235 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenDimensions.java
@@ -23,36 +23,41 @@ import java.awt.Toolkit;
 
 public class ScreenDimensions {
 	public static final int ROUND_VALUE = 16;
+
+	public enum ScreenQuality {
+		VeryHigh
+		, High
+		, Medium
+		, Low
+	}
 	/**
 	 * image recalcing value's from the virtual Screen drawer
 	 */
-	public static int width = 200;
-	public static int height = 0;
+	private int width = 200;
+	private int height = 0;
 
 	/**
 	 * Values calced by the original Screen
 	 */
-
-	public static double ratio = 0;
-
-	public static int widthMax = 0;
-	public static int heightMax = 0;
+	private double ratio;
+	private final int widthMax;
+	private final int heightMax;
 
 	/**
 	 * Values set by the virtualScreen
 	 */
-	public static int spinnerWidth = 0;
-	public static int spinnerHeight = 0;
-	public static int spinnerX = 0;
-	public static int spinnerY = 0;
+	private int spinnerWidth;
+	private int spinnerHeight;
+	private int spinnerX;
+	private int spinnerY;
 
-	public static ScreenQuality quality = ScreenQuality.Medium;
-	public static int FPS = 10;
+	private ScreenQuality quality = ScreenQuality.Medium;
+	private int FPS = 10;
 
-	public static int resizeX = 640;
-	public static int resizeY = 480;
+	private int resizeX;
+	private int resizeY;
 
-	static {
+	public ScreenDimensions() {
 		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 		ratio = screenSize.getHeight() / screenSize.getWidth();
 		widthMax = (int)screenSize.getWidth();
@@ -66,10 +71,83 @@ public class ScreenDimensions {
 		resizeY = 400;
 	}
 
-	public enum ScreenQuality {
-		VeryHigh
-		, High
-		, Medium
-		, Low
+	public int getResizeX() {
+		return resizeX;
+	}
+
+	public void setResizeX(int resizeX) {
+		this.resizeX = resizeX;
+	}
+
+	public int getResizeY() {
+		return resizeY;
+	}
+
+	public void setResizeY(int resizeY) {
+		this.resizeY = resizeY;
+	}
+
+	public int getSpinnerWidth() {
+		return spinnerWidth;
+	}
+
+	public void setSpinnerWidth(int spinnerWidth) {
+		this.spinnerWidth = spinnerWidth;
+	}
+
+	public int getSpinnerHeight() {
+		return spinnerHeight;
+	}
+
+	public void setSpinnerHeight(int spinnerHeight) {
+		this.spinnerHeight = spinnerHeight;
+	}
+
+	public int getSpinnerX() {
+		return spinnerX;
+	}
+
+	public void setSpinnerX(int spinnerX) {
+		this.spinnerX = spinnerX;
+	}
+
+	public int getSpinnerY() {
+		return spinnerY;
+	}
+
+	public void setSpinnerY(int spinnerY) {
+		this.spinnerY = spinnerY;
+	}
+
+	public int getWidth() {
+		return width;
+	}
+
+	public int getWidthMax() {
+		return widthMax;
+	}
+
+	public int getHeight() {
+		return height;
+	}
+
+	public int getHeightMax() {
+		return heightMax;
+	}
+
+	public ScreenQuality getQuality() {
+		return quality;
+	}
+
+	public void setQuality(ScreenQuality quality) {
+		this.quality = quality;
+	}
+
+	public int getFPS() {
+		return FPS;
+	}
+
+	public void setFPS(int fPS) {
+		FPS = fPS;
 	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java
index ca7a61b..ee03bc5 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenHeightMouseListener.java
@@ -25,7 +25,7 @@ import java.awt.event.MouseEvent;
 import javax.swing.event.MouseInputAdapter;
 
 public class ScreenHeightMouseListener extends MouseInputAdapter  {
-	private ScreenSharerFrame frame;
+	private final ScreenSharerFrame frame;
 	private double y = 0;
 
 	public ScreenHeightMouseListener(ScreenSharerFrame frame) {
@@ -60,10 +60,10 @@ public class ScreenHeightMouseListener extends MouseInputAdapter  {
 		}
 		double newY = e.getY();
 
-		int newHeight = ScreenDimensions.spinnerHeight - (int)(y - newY);
-		int newSpinnerY = ScreenDimensions.spinnerY + newHeight;
+		int newHeight = frame.getDim().getSpinnerHeight() - (int)(y - newY);
+		int newSpinnerY = frame.getDim().getSpinnerY() + newHeight;
 
-		if (newSpinnerY >= 0 && newSpinnerY <= ScreenDimensions.heightMax) {
+		if (newSpinnerY >= 0 && newSpinnerY <= frame.getDim().getHeightMax()) {
 			frame.setDoUpdateBounds(false);
 			frame.setSpinnerHeight(newHeight);
 			frame.setDoUpdateBounds(true);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java
index ced9963..ed561c3 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenMouseListener.java
@@ -25,7 +25,7 @@ import java.awt.event.MouseEvent;
 import javax.swing.event.MouseInputAdapter;
 
 public class ScreenMouseListener extends MouseInputAdapter {
-	private ScreenSharerFrame frame;
+	private final ScreenSharerFrame frame;
 	private int x = 0;
 	private int y = 0;
 
@@ -63,8 +63,8 @@ public class ScreenMouseListener extends MouseInputAdapter {
 		int newX = e.getX();
 		int newY = e.getY();
 
-		int newXPosition = ScreenDimensions.spinnerX - (this.x - newX);
-		int newYPosition = ScreenDimensions.spinnerY - (this.y - newY);
+		int newXPosition = frame.getDim().getSpinnerX() - (this.x - newX);
+		int newYPosition = frame.getDim().getSpinnerY() - (this.y - newY);
 		if (newXPosition >= 0) {
 			frame.setSpinnerX(newXPosition);
 		}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java
index 5f27998..c3d72ae 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenSharerFrame.java
@@ -19,8 +19,6 @@
 package org.apache.openmeetings.screenshare.gui;
 
 import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.ROUND_VALUE;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.awt.AWTException;
@@ -114,6 +112,7 @@ public class ScreenSharerFrame extends JFrame {
 	private String recordingTipLabel;
 	private String publishingTipLabel;
 	private JCheckBox audioNotify;
+	private final Core core;
 
 	private class PublishTextField extends JTextField {
 		private static final long serialVersionUID = 1L;
@@ -230,6 +229,7 @@ public class ScreenSharerFrame extends JFrame {
 	 * @throws IOException
 	 */
 	public ScreenSharerFrame(final Core core, String[] textLabels) throws AWTException {
+		this.core = core;
 		setTitle(getTextLabel(textLabels, 0)); //#id 730
 		setBackground(Color.WHITE);
 		setResizable(false);
@@ -274,7 +274,7 @@ public class ScreenSharerFrame extends JFrame {
 				if (sharingStarted) {
 					if (!sharingActionRequested) {
 						sharingActionRequested = true;
-						core.stopSharing();
+						core.sharingStop();
 					} else {
 						logger.warn("Sharing action is already requested");
 					}
@@ -351,8 +351,8 @@ public class ScreenSharerFrame extends JFrame {
 		panelScreen.setLayout(null);
 		panelScreen.setBackground(Color.WHITE);
 
-		int width = ScreenDimensions.width;
-		int height = ScreenDimensions.height;
+		int width = getDim().getWidth();
+		int height = getDim().getHeight();
 
 		//Sliders
 		upSlider.addListener(new ScreenYMouseListener(this));
@@ -387,7 +387,7 @@ public class ScreenSharerFrame extends JFrame {
 		vscreenWidthLabel.setBounds(250, 20, 150, 24);
 		panelScreen.add(vscreenWidthLabel);
 
-		spinnerWidth = new NumberSpinner(ScreenDimensions.spinnerWidth, 0, ScreenDimensions.widthMax, 1);
+		spinnerWidth = new NumberSpinner(getDim().getSpinnerWidth(), 0, getDim().getWidthMax(), 1);
 		spinnerWidth.setBounds(400, 20, 60, 24);
 		spinnerWidth.addChangeListener( new ChangeListener(){
 			@Override
@@ -403,7 +403,7 @@ public class ScreenSharerFrame extends JFrame {
 		labelHeight.setBounds(250, 50, 150, 24);
 		panelScreen.add(labelHeight);
 
-		spinnerHeight = new NumberSpinner(ScreenDimensions.spinnerHeight, 0, ScreenDimensions.heightMax, 1);
+		spinnerHeight = new NumberSpinner(getDim().getSpinnerHeight(), 0, getDim().getHeightMax(), 1);
 		spinnerHeight.setBounds(400, 50, 60, 24);
 		spinnerHeight.addChangeListener( new ChangeListener(){
 			@Override
@@ -419,9 +419,9 @@ public class ScreenSharerFrame extends JFrame {
 		labelX.setBounds(250, 80, 150, 24);
 		panelScreen.add(labelX);
 
-		spinnerX = new NumberSpinner(ScreenDimensions.spinnerX, 0, ScreenDimensions.widthMax, 1);
+		spinnerX = new NumberSpinner(getDim().getSpinnerX(), 0, getDim().getWidthMax(), 1);
 		spinnerX.setBounds(400, 80, 60, 24);
-		spinnerX.addChangeListener( new ChangeListener(){
+		spinnerX.addChangeListener(new ChangeListener(){
 			@Override
 			public void stateChanged(ChangeEvent arg0) {
 				calcNewValueXSpin();
@@ -435,9 +435,9 @@ public class ScreenSharerFrame extends JFrame {
 		labelY.setBounds(250, 110, 150, 24);
 		panelScreen.add(labelY);
 
-		spinnerY = new NumberSpinner(ScreenDimensions.spinnerY, 0, ScreenDimensions.heightMax, 1);
+		spinnerY = new NumberSpinner(getDim().getSpinnerY(), 0, getDim().getHeightMax(), 1);
 		spinnerY.setBounds(400, 110, 60, 24);
-		spinnerY.addChangeListener( new ChangeListener(){
+		spinnerY.addChangeListener(new ChangeListener(){
 			@Override
 			public void stateChanged(ChangeEvent arg0) {
 				calcNewValueYSpin();
@@ -461,7 +461,7 @@ public class ScreenSharerFrame extends JFrame {
 			@Override
 			@SuppressWarnings("unchecked")
 			public void actionPerformed(ActionEvent e) {
-				ScreenDimensions.quality = ((KeyValue<ScreenQuality>)comboQuality.getSelectedItem()).getValue();
+				getDim().setQuality(((KeyValue<ScreenQuality>)comboQuality.getSelectedItem()).getValue());
 				calcRescaleFactors();
 			}
 		});
@@ -479,7 +479,7 @@ public class ScreenSharerFrame extends JFrame {
 			@Override
 			@SuppressWarnings("unchecked")
 			public void actionPerformed(ActionEvent e) {
-				ScreenDimensions.FPS = ((KeyValue<Integer>)comboFPS.getSelectedItem()).getValue();
+				getDim().setFPS(((KeyValue<Integer>)comboFPS.getSelectedItem()).getValue());
 				calcRescaleFactors();
 			}
 		});
@@ -733,18 +733,19 @@ public class ScreenSharerFrame extends JFrame {
 	void calcNewValueXSpin() {
 		if (doUpdateBounds) {
 			int newX = spinnerX.getValue();
-			if (ScreenDimensions.spinnerWidth + newX > ScreenDimensions.widthMax) {
-				newX = ScreenDimensions.widthMax - ScreenDimensions.spinnerWidth;
+			int val = getDim().getWidthMax() - getDim().getSpinnerWidth();
+			if (newX > val) {
+				newX = val;
 				spinnerX.setValue(newX);
 				if (showWarning) {
 					setStatus(reduceWidthLabel);
 				}
 			} else {
-				ScreenDimensions.spinnerX = newX;
+				getDim().setSpinnerX(newX);
 				updateVScreenBounds();
 			}
 		} else {
-			ScreenDimensions.spinnerX = spinnerX.getValue();
+			getDim().setSpinnerX(spinnerX.getValue());
 		}
 
 		calcRescaleFactors();
@@ -753,18 +754,19 @@ public class ScreenSharerFrame extends JFrame {
 	void calcNewValueYSpin() {
 		if (doUpdateBounds) {
 			int newY = spinnerY.getValue();
-			if (ScreenDimensions.spinnerHeight + newY > ScreenDimensions.heightMax) {
-				newY = ScreenDimensions.heightMax - ScreenDimensions.spinnerHeight;
+			int val = getDim().getHeightMax() - getDim().getSpinnerHeight();
+			if (newY > val) {
+				newY = val;
 				spinnerY.setValue(newY);
 				if (showWarning) {
 					setStatus(reduceHeightLabel);
 				}
 			} else {
-				ScreenDimensions.spinnerY = newY;
+				getDim().setSpinnerY(newY);
 				updateVScreenBounds();
 			}
 		} else {
-			ScreenDimensions.spinnerY = spinnerY.getValue();
+			getDim().setSpinnerY(spinnerY.getValue());
 		}
 
 		calcRescaleFactors();
@@ -773,18 +775,19 @@ public class ScreenSharerFrame extends JFrame {
 	void calcNewValueWidthSpin() {
 		if (doUpdateBounds) {
 			int newWidth = spinnerWidth.getValue();
-			if (ScreenDimensions.spinnerX + newWidth > ScreenDimensions.widthMax) {
-				newWidth = ScreenDimensions.widthMax - ScreenDimensions.spinnerX;
+			int val = getDim().getWidthMax() - getDim().getSpinnerX();
+			if (newWidth > val) {
+				newWidth = val;
 				spinnerWidth.setValue(newWidth);
 				if (showWarning) {
 					setStatus(reduceXLabel);
 				}
 			} else {
-				ScreenDimensions.spinnerWidth = newWidth;
+				getDim().setSpinnerWidth(newWidth);
 				updateVScreenBounds();
 			}
 		} else {
-			ScreenDimensions.spinnerWidth = spinnerWidth.getValue();
+			getDim().setSpinnerWidth(spinnerWidth.getValue());
 		}
 
 		calcRescaleFactors();
@@ -793,18 +796,19 @@ public class ScreenSharerFrame extends JFrame {
 	void calcNewValueHeightSpin() {
 		if (doUpdateBounds) {
 			int newHeight = spinnerHeight.getValue();
-			if (ScreenDimensions.spinnerY + newHeight > ScreenDimensions.heightMax) {
-				newHeight = ScreenDimensions.heightMax - ScreenDimensions.spinnerY;
+			int val = getDim().getHeightMax() - getDim().getSpinnerY();
+			if (newHeight > val) {
+				newHeight = val;
 				spinnerHeight.setValue(newHeight);
 				if (showWarning) {
 					setStatus(reduceYLabel);
 				}
 			} else {
-				ScreenDimensions.spinnerHeight = newHeight;
+				getDim().setSpinnerHeight(newHeight);
 				updateVScreenBounds();
 			}
 		} else {
-			ScreenDimensions.spinnerHeight = spinnerHeight.getValue();
+			getDim().setSpinnerHeight(spinnerHeight.getValue());
 		}
 
 		calcRescaleFactors();
@@ -815,20 +819,20 @@ public class ScreenSharerFrame extends JFrame {
 	 */
 	void calcRescaleFactors() {
 		logger.trace("calcRescaleFactors -- ");
-		resizeX = spinnerWidth.getValue();
-		resizeY = spinnerHeight.getValue();
-		switch (ScreenDimensions.quality) {
+		int resizeX = spinnerWidth.getValue();
+		int resizeY = spinnerHeight.getValue();
+		switch (getDim().getQuality()) {
 			case Low:
-				resizeX = (int)(2.0 * ScreenDimensions.resizeX / 8);
-				resizeY = (int)(2.0 * ScreenDimensions.resizeY / 8);
+				resizeX = (int)(2.0 * resizeX / 8);
+				resizeY = (int)(2.0 * resizeY / 8);
 				break;
 			case Medium:
-				resizeX = (int)(4.0 * ScreenDimensions.resizeX / 8);
-				resizeY = (int)(4.0 * ScreenDimensions.resizeY / 8);
+				resizeX = (int)(4.0 * resizeX / 8);
+				resizeY = (int)(4.0 * resizeY / 8);
 				break;
 			case High:
-				resizeX = (int)(6.0 * ScreenDimensions.resizeX / 8);
-				resizeY = (int)(6.0 * ScreenDimensions.resizeY / 8);
+				resizeX = (int)(6.0 * resizeX / 8);
+				resizeY = (int)(6.0 * resizeY / 8);
 				break;
 			case VeryHigh:
 			default:
@@ -838,7 +842,9 @@ public class ScreenSharerFrame extends JFrame {
 		int dY = resizeY % ROUND_VALUE;
 		resizeX += dX == 0 ? 0 : ROUND_VALUE - dX;
 		resizeY += dY == 0 ? 0 : ROUND_VALUE - dY;
-		logger.trace("resize: X:" + resizeX + " Y: " + resizeY);
+		logger.trace("resize: X: {} Y: {}", resizeX, resizeY);
+		getDim().setResizeX(resizeX);
+		getDim().setResizeY(resizeY);
 		updateVScreenBounds();
 	}
 
@@ -848,7 +854,7 @@ public class ScreenSharerFrame extends JFrame {
 		upSlider.setBounds(x + vScreenX + (width / 2) - 8, y + vScreenY - 16, 16, 32);
 		downSlider.setBounds(x + vScreenX + (width / 2) - 8, y + vScreenY - 16 + height, 16, 32);
 
-		virtualScreen.setText(ScreenDimensions.spinnerWidth + ":" + ScreenDimensions.spinnerHeight);
+		virtualScreen.setText(String.format("%s:%s", getDim().getSpinnerWidth(), getDim().getSpinnerHeight()));
 		virtualScreen.setBounds(x + vScreenX, y + vScreenY, width, height);
 	}
 
@@ -858,13 +864,17 @@ public class ScreenSharerFrame extends JFrame {
 	 *
 	 */
 	void updateVScreenBounds() {
-		double ratio = ((double)ScreenDimensions.width) / ScreenDimensions.widthMax;
-		int newWidth = (int)(ScreenDimensions.spinnerWidth * ratio);
-		int newX = (int)(ScreenDimensions.spinnerX * ratio);
+		double ratio = ((double)getDim().getWidth()) / getDim().getWidthMax();
+		int newWidth = (int)(getDim().getSpinnerWidth() * ratio);
+		int newX = (int)(getDim().getSpinnerX() * ratio);
 
-		int newHeight = (int)(ScreenDimensions.spinnerHeight * ratio);
-		int newY = (int)(ScreenDimensions.spinnerY * ratio);
+		int newHeight = (int)(getDim().getSpinnerHeight() * ratio);
+		int newY = (int)(getDim().getSpinnerY() * ratio);
 
 		setVScreenBounds(newX, newY, newWidth, newHeight);
 	}
+
+	public ScreenDimensions getDim() {
+		return core.getDim();
+	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java
index 27862fa..404887c 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenWidthMouseListener.java
@@ -25,7 +25,7 @@ import java.awt.event.MouseEvent;
 import javax.swing.event.MouseInputAdapter;
 
 public class ScreenWidthMouseListener extends MouseInputAdapter {
-	private ScreenSharerFrame frame;
+	private final ScreenSharerFrame frame;
 	private double x = 0;
 
 	public ScreenWidthMouseListener(ScreenSharerFrame frame) {
@@ -60,10 +60,10 @@ public class ScreenWidthMouseListener extends MouseInputAdapter {
 		}
 		double newX = e.getX();
 
-		int newWidth = ScreenDimensions.spinnerWidth - (int)(x - newX);
-		int newSpinnerX = ScreenDimensions.spinnerX + newWidth;
+		int newWidth = frame.getDim().getSpinnerWidth() - (int)(x - newX);
+		int newSpinnerX = frame.getDim().getSpinnerX() + newWidth;
 
-		if (0 <= newSpinnerX && newSpinnerX <= ScreenDimensions.widthMax) {
+		if (0 <= newSpinnerX && newSpinnerX <= frame.getDim().getWidthMax()) {
 			frame.setDoUpdateBounds(false);
 			frame.setSpinnerWidth(newWidth);
 			frame.setDoUpdateBounds(true);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java
index 0e615f7..66106d2 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenXMouseListener.java
@@ -25,7 +25,7 @@ import java.awt.event.MouseEvent;
 import javax.swing.event.MouseInputAdapter;
 
 public class ScreenXMouseListener extends MouseInputAdapter {
-	private ScreenSharerFrame frame;
+	private final ScreenSharerFrame frame;
 	private double x = 0;
 
 	public ScreenXMouseListener(ScreenSharerFrame frame) {
@@ -60,8 +60,8 @@ public class ScreenXMouseListener extends MouseInputAdapter {
 		}
 		double newX = e.getX();
 		int delta = (int) (x - newX);
-		int newXPosition = ScreenDimensions.spinnerX - delta;
-		int newWidth = ScreenDimensions.spinnerWidth + delta;
+		int newXPosition = frame.getDim().getSpinnerX() - delta;
+		int newWidth = frame.getDim().getSpinnerWidth() + delta;
 
 		if (newXPosition >= 0 && newWidth >= 0) {
 			frame.setDoUpdateBounds(false);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java
index 75ead4d..d1faf4b 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/gui/ScreenYMouseListener.java
@@ -25,7 +25,7 @@ import java.awt.event.MouseEvent;
 import javax.swing.event.MouseInputAdapter;
 
 public class ScreenYMouseListener extends MouseInputAdapter {
-	private ScreenSharerFrame frame;
+	private final ScreenSharerFrame frame;
 	private double y = 0;
 
 	public ScreenYMouseListener(ScreenSharerFrame frame) {
@@ -61,8 +61,8 @@ public class ScreenYMouseListener extends MouseInputAdapter {
 		double newY = e.getY();
 
 		int delta = (int) (y - newY);
-		int newYPosition = ScreenDimensions.spinnerY - delta;
-		int newHeight = ScreenDimensions.spinnerHeight + delta;
+		int newYPosition = frame.getDim().getSpinnerY() - delta;
+		int newHeight = frame.getDim().getSpinnerHeight() + delta;
 
 		if (newYPosition >= 0 && newHeight >= 0) {
 			frame.setDoUpdateBounds(false);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java
index f211457..84c44ff 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/EncodeJob.java
@@ -18,10 +18,6 @@
  */
 package org.apache.openmeetings.screenshare.job;
 
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerHeight;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerWidth;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerX;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.awt.AWTException;
@@ -30,6 +26,7 @@ import java.awt.Robot;
 
 import org.apache.openmeetings.screenshare.CaptureScreen;
 import org.apache.openmeetings.screenshare.ScreenV1Encoder;
+import org.apache.openmeetings.screenshare.gui.ScreenDimensions;
 import org.quartz.DisallowConcurrentExecution;
 import org.quartz.Job;
 import org.quartz.JobDataMap;
@@ -42,9 +39,10 @@ import org.slf4j.Logger;
 public class EncodeJob implements Job {
 	private static final Logger log = getLogger(EncodeJob.class);
 	public static final String CAPTURE_KEY = "capture";
-	Robot robot;
-	Rectangle screen = new Rectangle(spinnerX, spinnerY, spinnerWidth, spinnerHeight);
-	int[][] image = null;
+	private Robot robot;
+	private ScreenDimensions dim;
+	private Rectangle screen = null;
+	private int[][] image = null;
 
 	public EncodeJob() {
 		try {
@@ -58,12 +56,17 @@ public class EncodeJob implements Job {
 	public void execute(JobExecutionContext context) throws JobExecutionException {
 		JobDataMap data = context.getJobDetail().getJobDataMap();
 		CaptureScreen capture = (CaptureScreen)data.get(CAPTURE_KEY);
+		if (screen == null) {
+			dim = capture.getDim();
+			screen = new Rectangle(dim.getSpinnerX(), dim.getSpinnerY()
+					, dim.getSpinnerWidth(), dim.getSpinnerHeight());
+		}
 
 		long start = 0;
 		if (log.isTraceEnabled()) {
 			start = System.currentTimeMillis();
 		}
-		image = ScreenV1Encoder.getImage(screen, robot);
+		image = ScreenV1Encoder.getImage(dim, screen, robot);
 		if (log.isTraceEnabled()) {
 			log.trace(String.format("encode: Image was captured in %s ms, size %sk", System.currentTimeMillis() - start, 4 * image.length * image[0].length / 1024));
 			start = System.currentTimeMillis();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java
----------------------------------------------------------------------
diff --git a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java
index 39f1357..122fffd 100644
--- a/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java
+++ b/openmeetings-screenshare/src/main/java/org/apache/openmeetings/screenshare/job/RemoteJob.java
@@ -20,13 +20,6 @@ package org.apache.openmeetings.screenshare.job;
 
 import static java.awt.Toolkit.getDefaultToolkit;
 import static java.awt.datatransfer.DataFlavor.stringFlavor;
-import static org.apache.openmeetings.screenshare.Core.Ampl_factor;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeX;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.resizeY;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerHeight;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerWidth;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerX;
-import static org.apache.openmeetings.screenshare.gui.ScreenDimensions.spinnerY;
 import static org.apache.openmeetings.screenshare.util.Util.getFloat;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -45,6 +38,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.openmeetings.screenshare.Core;
+import org.apache.openmeetings.screenshare.gui.ScreenDimensions;
 import org.quartz.DisallowConcurrentExecution;
 import org.quartz.Job;
 import org.quartz.JobDataMap;
@@ -57,6 +51,7 @@ public class RemoteJob implements Job {
 	private static final Logger log = getLogger(RemoteJob.class);
 	public static final String CORE_KEY = "core";
 	private Robot robot = null;
+	private ScreenDimensions dim = null;
 
 	public RemoteJob() {
 		try {
@@ -71,6 +66,9 @@ public class RemoteJob implements Job {
 	public void execute(JobExecutionContext context) throws JobExecutionException {
 		JobDataMap data = context.getJobDetail().getJobDataMap();
 		Core core = (Core)data.get(CORE_KEY);
+		if (dim == null) {
+			dim = core.getDim();
+		}
 		try {
 			Map<String, Object> obj;
 			while ((obj = core.getRemoteEvents().poll(1, TimeUnit.MILLISECONDS)) != null) {
@@ -189,12 +187,12 @@ public class RemoteJob implements Job {
 		}
 	}
 
-	private static Point getCoordinates(Map<String, Object> obj) {
-		float scaleFactorX = spinnerWidth / (Ampl_factor * resizeX);
-		float scaleFactorY = spinnerHeight / (Ampl_factor * resizeY);
+	private Point getCoordinates(Map<String, Object> obj) {
+		float scaleFactorX = dim.getSpinnerWidth() / dim.getResizeX();
+		float scaleFactorY = dim.getSpinnerHeight() / dim.getResizeY();
 
-		int x = Math.round(scaleFactorX * getFloat(obj, "x") + spinnerX);
-		int y = Math.round(scaleFactorY * getFloat(obj, "y") + spinnerY);
+		int x = Math.round(scaleFactorX * getFloat(obj, "x") + dim.getSpinnerX());
+		int y = Math.round(scaleFactorY * getFloat(obj, "y") + dim.getSpinnerY());
 		return new Point(x, y);
 	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
----------------------------------------------------------------------
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
index dc0556f..4d18b34 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
@@ -105,9 +105,8 @@ public class OpenmeetingsVariables {
 	public static final String FLASH_QUALITY = "quality";
 	public static final String FLASH_ECHO_PATH = "echoPath";
 	public static final String FLASH_MIC_RATE = "micRate";
-
-	public static int DEFAULT_MINUTES_REMINDER_SEND = 15;
-	public static String DEFAULT_BASE_URL = "http://localhost:5080/openmeetings/";
+	public static final int DEFAULT_MINUTES_REMINDER_SEND = 15;
+	public static final String DEFAULT_BASE_URL = "http://localhost:5080/openmeetings/";
 
 	public static String webAppRootKey = null;
 	public static String webAppRootPath = null;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/381838de/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 472934c..42fb8ea 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -688,7 +688,8 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 		Set<String> clients = get().getRooms().get(roomId);
 		if (clients != null) {
 			for (String uid : clients) {
-				if (getOnlineClient(uid).getUserId().equals(userId)) {
+				Client c = getOnlineClient(uid);
+				if (c != null && c.getUserId().equals(userId)) {
 					return true;
 				}
 			}