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/04/11 15:52:14 UTC

svn commit: r1790995 - in /openmeetings/application/trunk: openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ openmeetings-flash/src/main/flex/ openmeetings-flash/src/main/flex/org/apache/openmeetings/ openmeetings-install/src/ma...

Author: solomax
Date: Tue Apr 11 15:52:14 2017
New Revision: 1790995

URL: http://svn.apache.org/viewvc?rev=1790995&view=rev
Log:
[OPENMEETINGS-551] settings dialog seems to be implemented

Modified:
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml
    openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
    openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizardPage.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Tue Apr 11 15:52:14 2017
@@ -19,10 +19,15 @@
 package org.apache.openmeetings.core.remote.red5;
 
 import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE_PROXY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_VIDEO_CODEC;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.awt.Point;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -32,6 +37,7 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicLong;
@@ -92,6 +98,8 @@ import org.red5.server.api.stream.IBroad
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import com.github.openjson.JSONObject;
+
 public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter implements IPendingServiceCallback {
 	private static final Logger log = Red5LoggerFactory.getLogger(ScopeApplicationAdapter.class, webAppRootKey);
 	private static final String SECURITY_CODE_PARAM = "securityCode";
@@ -108,7 +116,7 @@ public class ScopeApplicationAdapter ext
 	@Autowired
 	private RecordingService recordingService;
 	@Autowired
-	private ConfigurationDao configurationDao;
+	private ConfigurationDao cfgDao;
 	@Autowired
 	private AppointmentDao appointmentDao;
 	@Autowired
@@ -125,6 +133,7 @@ public class ScopeApplicationAdapter ext
 	private RecordingDao recordingDao;
 	@Autowired
 	private ServerDao serverDao;
+	private JSONObject flashSettings;
 
 	private static AtomicLong broadCastCounter = new AtomicLong(0);
 
@@ -147,6 +156,18 @@ public class ScopeApplicationAdapter ext
 			getCryptKey();
 
 			// init your handler here
+			Properties props = new Properties();
+			try (InputStream is = new FileInputStream(new File(new File(OmFileHelper.getRootDir(), "conf"), "red5.properties"))) {
+				props.load(is);
+			}
+			flashSettings = new JSONObject()
+					.put("secure", "yes".equals(cfgDao.getConfValue(CONFIG_FLASH_SECURE, String.class, "no")))
+					.put("proxyType", cfgDao.getConfValue(CONFIG_FLASH_SECURE_PROXY, String.class, "none"))
+					.put("rtmpPort", props.getProperty("rtmp.port"))
+					.put("rtmpsPort", props.getProperty("rtmps.port"))
+					.put("videoCodec", cfgDao.getConfValue(CONFIG_FLASH_VIDEO_CODEC, String.class, "h263"))
+					.put("fps", cfgDao.getConfValue(OpenmeetingsVariables.CONFIG_FLASH_VIDEO_FPS, Integer.class, "30"))
+					;
 
 			for (String scopeName : scope.getScopeNames()) {
 				log.debug("scopeName :: " + scopeName);
@@ -1847,11 +1868,11 @@ public class ScopeApplicationAdapter ext
 	}
 
 	private boolean getWhiteboardDrawStatus() {
-		return configurationDao.getWhiteboardDrawStatus();
+		return cfgDao.getWhiteboardDrawStatus();
 	}
 
 	public String getCryptKey() {
-		return configurationDao.getCryptKey();
+		return cfgDao.getCryptKey();
 	}
 
 	public IScope getRoomScope(String room) {
@@ -1940,4 +1961,8 @@ public class ScopeApplicationAdapter ext
 
 		sendMessageToCurrentScope("addNewUser", currentClient, false);
 	}
+
+	public JSONObject getFlashSettings() {
+		return flashSettings;
+	}
 }

Modified: openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml (original)
+++ openmeetings/application/trunk/openmeetings-flash/src/main/flex/main.mxml Tue Apr 11 15:52:14 2017
@@ -21,8 +21,8 @@
 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
 		xmlns:s="library://ns.adobe.com/flex/spark"
 		xmlns:mx="library://ns.adobe.com/flex/mx"
-		width="570" height="900" pageTitle="Openmeetings"
-		preinitialize="init()" fontSize="12" applicationComplete="appInit()">
+		width="570" height="900" pageTitle="Openmeetings" fontSize="12"
+		applicationComplete="appInit(event)" uncaughtError="uncaughtError(event)">
 	<fx:Declarations>
 		<!-- Place non-visual elements (e.g., services, value objects) here -->
 		<mx:TraceTarget/>
@@ -32,10 +32,7 @@
 
 		import org.apache.openmeetings.OmVideo;
 
-		private var sid:String;
-		private var roomid:int;
 		private var audioOnly:Boolean = false;
-		private var labels:Object = new Object();
 		private var FPS:int;
 		private var bandwidth:int = 0;
 		private var quality:int = 100;
@@ -46,36 +43,12 @@
 		private var selectedCam:int = -1;
 		private var video:OmVideo;
 		private var recName:String;
-		private var codec:String = OmVideo.CODEC_H264;
-		private var protocol:String;
-		private var host:String;
-		private var port:String;
-		private var app:String;
+		private var mic:Microphone = null;
 		[Bindable]
 		private var interview:Boolean = false;
 
-		private function init():void {
-			trace("init()");
-			var tla:Object = FlexGlobals.topLevelApplication;
-			sid = tla.parameters['sid'];
-			roomid = tla.parameters['roomid'];
-			audioOnly = 'true' == tla.parameters['audioOnly'];
-			interview = 'true' == tla.parameters['interview'];
-			var _fps:int = parseInt(tla.parameters['fps']);
-			FPS = interview ? 24 : (isNaN(_fps) || _fps < 1 ? 30 : _fps);
-
-			var lbls:Array = JSON.parse(tla.parameters['labels']) as Array;
-			for (var i:int = 0; i < lbls.length; ++i) {
-				labels[lbls[i].id] = lbls[i].value;
-			}
-			protocol = tla.parameters['protocol'];
-			host = tla.parameters['host'];
-			port = tla.parameters['port'];
-			app = tla.parameters['app'];
-		}
-
-		private function debug(str:String):void {
-			ExternalInterface.call("console.log", str);
+		private function debug(...rest):void {
+			ExternalInterface.call("console.log", rest);
 		}
 
 		private function camAvail():Boolean {
@@ -86,10 +59,15 @@
 			return Microphone.names.length > 0;
 		}
 
-		private function appInit():void {
-			video = new OmVideo(videoDisplay, codec, protocol + "://" + host + ":" + port + "/" + app);
-
+		private function appInit(evt:Event):void {
 			var tla:Object = FlexGlobals.topLevelApplication;
+			debug("appInit()", tla.parameters);
+			audioOnly = 'true' == tla.parameters['audioOnly'];
+			interview = 'true' == tla.parameters['interview'];
+			var _fps:int = parseInt(tla.parameters['fps']);
+			FPS = (isNaN(_fps) || _fps < 1 ? 30 : _fps);
+			video = new OmVideo(videoDisplay, tla.parameters);
+
 			ExternalInterface.addCallback("getDevices", function ():Object {
 				return {
 					cams: Camera.names
@@ -115,25 +93,34 @@
 				selectedMic = micIdx;
 				setResolution(width, height, true);
 			});
+			ExternalInterface.addCallback("startRec", function ():void {
+				startTestRecording();
+			});
+			ExternalInterface.addCallback("play", function ():void {
+				playTestRecording();
+			});
 			ExternalInterface.call("VideoSettings.initSwf");
 		}
 
+		private function uncaughtError(e:UncaughtErrorEvent):void {
+			debug("Unexpected ERROR", e);
+		}
+
 		private function getMic():Microphone {
 			debug("Entering getMic ...");
 			var _micro:Microphone = null;
 			if (selectedMic > -1) {
 				_micro = echoPath == 0 ? Microphone.getMicrophone(selectedMic) : Microphone.getEnhancedMicrophone(selectedMic);
 
-				if (_micro != null && echoPath == 256) {
-					var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
-					options.mode = MicrophoneEnhancedMode.FULL_DUPLEX;
-					options.echoPath = 256;
-					options.nonLinearProcessing = true;
-					_micro.enhancedOptions = options;
-					debug("echoPath set to 256 " + _micro.enhancedOptions);
-				}
-
 				if (_micro != null) {
+					if (echoPath == 256) {
+						var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
+						options.mode = MicrophoneEnhancedMode.FULL_DUPLEX;
+						options.echoPath = echoPath;
+						options.nonLinearProcessing = true;
+						_micro.enhancedOptions = options;
+						debug("echoPath set to " + echoPath + ", " + _micro.enhancedOptions);
+					}
 					_micro.codec = SoundCodec.NELLYMOSER;
 					_micro.framesPerPacket = 1;
 					_micro.setSilenceLevel(0, 2000);
@@ -186,12 +173,13 @@
 					video.attachCamera(cam);
 					cam.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
 						debug("cameraStatusHandler! " + event);
-						//cam.removeEventListener(StatusEvent.STATUS, arguments.callee);
+						cam.removeEventListener(StatusEvent.STATUS, arguments.callee);
 						switch (event.code) {
 							case 'Camera.Muted':
 								debug("Unable to connect to active camera.");
 								break;
 							case 'Camera.Unmuted':
+								ExternalInterface.call("VideoSettings.allowRec", true);
 								_attachCamera(getCam());
 								break;
 						}
@@ -200,20 +188,22 @@
 					_attachCamera(cam);
 				}
 			} else {
-				var mic:Microphone = getMic();
-				if (mic != null) {
-					if (mic.muted) {
+				var _mic:Microphone = getMic();
+				if (_mic != null) {
+					if (_mic.muted) {
 						var nc:NetConnection = new NetConnection();
 						nc.connect(null);
 						var ns:NetStream = new NetStream(nc);
-						ns.attachAudio(mic);
-						mic.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
+						ns.attachAudio(_mic);
+						_mic.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void {
 							debug("micStatusHandler! " + event);
-							mic.removeEventListener(StatusEvent.STATUS, arguments.callee);
+							_mic.removeEventListener(StatusEvent.STATUS, arguments.callee);
 							ns.close();
 							nc.close();
-							if (mic.muted) {
+							if (_mic.muted) {
 								debug("Unable to connect to active microphone.");
+							} else {
+								ExternalInterface.call("VideoSettings.allowRec", true);
 							}
 						});
 					}
@@ -257,39 +247,39 @@
 		}
 
 		private function startTestRecording():void {
-			var counter:int = 5;
-			timerText.visible = true;
-			timerText.text = "5 sec";
-			var recTimer:Timer = new Timer(1000, counter);
-			var t:Date = new Date();
-			recName = "TEST_SETUP_" + t.getTime();
-			var mic:Microphone = getMic();
-			video.record(recName, getCam(), mic, function ():void {
-				mic.addEventListener(ActivityEvent.ACTIVITY, micActivityHandler);
-				//mic.onA
-				var micTimer:Timer = new Timer(100, 0);
-				micTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
-					//FIXME TODO fill.width = mic.activityLevel * RIGHT_WIDTH / 100;
-					debug("activity: " + mic.activityLevel);
+			try {
+				var counter:int = 5;
+				timerText.visible = true;
+				timerText.text = "5 sec";
+				var recTimer:Timer = new Timer(1000, counter);
+				var t:Date = new Date();
+				recName = "TEST_SETUP_" + t.getTime();
+				mic = getMic();
+				var activityTimer:Timer = new Timer(100);
+				activityTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
+					ExternalInterface.call("VideoSettings.micActivity", mic.activityLevel);
 				});
-				recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
-					timerText.text = --counter + " sec";
-					if (counter == 0) {
-						timerText.visible = false;
-						playTestRecording();
-						micTimer.stop();
-						mic.removeEventListener(ActivityEvent.ACTIVITY, micActivityHandler);
+				video.record(recName, getCam(), mic, function ():void {
+					if (mic != null) {
+						activityTimer.start();
 					}
+					recTimer.addEventListener(TimerEvent.TIMER, function (event:TimerEvent):void {
+						timerText.text = --counter + " sec";
+						if (counter == 0) {
+							timerText.visible = false;
+							ExternalInterface.call("VideoSettings.allowPlay");
+							playTestRecording();
+							activityTimer.stop();
+							mic = null;
+						}
+					});
+					recTimer.start();
 				});
-				recTimer.start();
-				micTimer.start();
-			});
-		}
-
-		private function micActivityHandler(event:ActivityEvent):void {
-			//Do nothing, it just need to be there.
+			} catch (err:Error) {
+				debug("ERROR: " + err);
+			}
 		}
-	]]></fx:Script>
+		]]></fx:Script>
 
 	<mx:UIComponent id="videoDisplay" width="0" height="0" />
 	<s:Label id="timerText" height="20" width="45" x="20" y="5" paddingLeft="5" paddingTop="5"

Modified: openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as (original)
+++ openmeetings/application/trunk/openmeetings-flash/src/main/flex/org/apache/openmeetings/OmVideo.as Tue Apr 11 15:52:14 2017
@@ -19,6 +19,7 @@
 package org.apache.openmeetings {
 import flash.events.AsyncErrorEvent;
 import flash.events.NetStatusEvent;
+import flash.external.ExternalInterface;
 import flash.media.Camera;
 import flash.media.H264Level;
 import flash.media.H264Profile;
@@ -43,13 +44,12 @@ public class OmVideo {
 	public var width:int;
 	public var height:int;
 	private var mode:String;
-	private var codec:String;
-	private var url:String;
+	private var params:Object;
+	private var fallback:Boolean;
 
-	public function OmVideo(ui:UIComponent, codec:String, url:String) {
+	public function OmVideo(ui:UIComponent, params:Object) {
 		this.ui = ui;
-		this.codec = codec;
-		this.url = url;
+		this.params = params;
 	}
 
 	private function getVideo():Video {
@@ -84,44 +84,42 @@ public class OmVideo {
 		vid = null;
 	}
 
+	private function debug(... rest):void {
+		ExternalInterface.call("console.log", rest);
+	}
+
 	private function createStream():void {
+		debug("createStream: ");
 		ns = new NetStream(nc);
 		//see: http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/flash/net/NetStream.html
 		//according to the docs the construct to catch event has to be implemented like this.
 		//var t = this;
-		var clientObject:Object = new Object();
-		clientObject.onMetaData = function(metadata:Object):void {
-			//t.onMetaData(metadata);
-			trace("onMetaData: ", metadata);
-		};
-		clientObject.onPlayStatus = function(metadata:Object):void {
-			//t.onPlayStatus(metadata);
-			trace("onPlayStatus: ", metadata);
-		};
-		clientObject.onCuePoint = function(metadata:Object):void {
-			//t.onCuePoint(metadata);
-			trace("onCuePoint: ", metadata);
-		};
-		clientObject.ioError = function(error:Object):void {
-			//t.ioError(error);
-			trace("ioError: ", error);
-		};
-		clientObject.netStatus = function(status:Object):void {
-			//t.netStatus(status);
-			trace("netStatus: ", status);
-		};
-		clientObject.asyncError = function(error:Object):void {
-			//t.asyncError(error);
-			trace("asyncError: ", error);
+		ns.client = {
+			onMetaData: function(metadata:Object):void {
+				debug("onMetaData: ", metadata);
+			}
+			, onPlayStatus: function(metadata:Object):void {
+				debug("onPlayStatus: ", metadata);
+			}
+			, onCuePoint: function(metadata:Object):void {
+				debug("onCuePoint: ", metadata);
+			}
+			, ioError: function(error:Object):void {
+				debug("ioError: ", error);
+			}
+			, netStatus: function(status:Object):void {
+				debug("netStatus: ", status);
+			}
+			, asyncError: function(error:Object):void {
+				debug("asyncError: ", error);
+			}
 		};
-		ns.client = clientObject;
 		//this is a workaround, attaching the event to the client object does not work
 		ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus2);
 	}
 
 	private function onNetStatus2(evt:Object):void {
-		trace("netStream_onNetStatus: ", evt.info.code, evt.target);
-		//this.onNetStatus.sendEvent(evt.info);
+		debug("netStream_onNetStatus: ", evt.info.code, evt.target);
 	}
 
 	private function _publish(mode:String, name:String, cam:Camera, mic:Microphone, f:Function):void {
@@ -137,8 +135,8 @@ public class OmVideo {
 			attachCamera(cam);
 
 			var videoStreamSettings:VideoStreamSettings = null;
-			trace("codec = " + codec);
-			if (codec === CODEC_H264) {
+			debug("codec = " + params.videoCodec);
+			if (params.videoCodec === CODEC_H264) {
 				var vss:H264VideoStreamSettings = new H264VideoStreamSettings();
 				vss.setProfileLevel(H264Profile.BASELINE, H264Level.LEVEL_5_1);
 				videoStreamSettings = vss;
@@ -147,7 +145,7 @@ public class OmVideo {
 			}
 			videoStreamSettings.setQuality(cam.bandwidth, cam.quality);
 			videoStreamSettings.setKeyFrameInterval(cam.keyFrameInterval);
-			trace("::keyFrameInterval " + cam.keyFrameInterval);
+			debug("::keyFrameInterval " + cam.keyFrameInterval);
 			videoStreamSettings.setMode(cam.width, cam.height, cam.fps);
 			ns.videoStreamSettings = videoStreamSettings;
 		}
@@ -162,12 +160,22 @@ public class OmVideo {
 		}
 	}
 
+	private function getUrl():String {
+		var secure:Boolean = ('true' === params.secure);
+		var url:String = (secure ? "rtmps" : "rtmp") + "://"
+				+ params.host + ":" + (secure ? params.rtmpsPort : params.rtmpPort)
+				+ "/" + params.app;
+		//TODO fallback
+		return url;
+	}
+
 	private function publish(mode:String, name:String, cam:Camera, mic:Microphone, f:Function):void {
 		if (nc == null || !nc.connected) {
-			trace("NetConnection is not connected");
+			var url:String = getUrl();
+			debug("NetConnection is not connected", url);
 			nc = new NetConnection();
 			nc.addEventListener(NetStatusEvent.NET_STATUS, function onConnectionStatus(e:NetStatusEvent):void {
-				trace("ConnectionStatus: " + e.info.code);
+				debug("ConnectionStatus: " + e.info.code);
 				if (e.info.code == "NetConnection.Connect.Success") {
 					_publish(mode, name, cam, mic, f);
 				} else {
@@ -175,26 +183,28 @@ public class OmVideo {
 				}
 			});
 			nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function (event:AsyncErrorEvent):void {
-				trace("login Async error" + event);
+				debug("login Async error" + event);
 			});
 			nc.client = {
 				onMetaData: function (infoObject:Object):void {
-					for (var propName:String in infoObject) {
-						trace(propName + " = " + infoObject[propName]);
-					}
+					debug("onMetaData::", infoObject);
 				}
 				, onBWDone: function(...rest):void {
-					trace("onBWDone");
+					debug("onBWDone");
 				}
 				, onBWCheck: function(...rest):Number {
-					trace("onBWCheck");
+					debug("onBWCheck");
 					return 0;
 				}
 				, setId: function (id:Number):void {
-					trace("id: " + id); //TODO save connection id
+					debug("id: " + id); //TODO save connection id
 				}
 			};
-			nc.connect(url);
+			nc.connect(url, {
+				uid: params.uid
+				, sid: params.sid
+				, nativeSsl: 'best' == params.proxyType
+			});
 		} else {
 			_publish(mode, name, cam, mic, f);
 		}
@@ -205,6 +215,7 @@ public class OmVideo {
 	}
 
 	public function play(name:String):void {
+		debug("PLAY::", name);
 		if (ns != null){
 			reset();
 		}
@@ -215,16 +226,15 @@ public class OmVideo {
 		//FIXME: Commented out, cause this leads to Buffer-Full/Buffer-Empty Events
 		//after re-syncing the stream
 		//this.setBuffer(0.1);
-		ns.play(name);
+		ns.play(name + ".flv");
 	}
 
 	public function reset():void {
-		var vid:Video = getVideo();
 		if (ns != null) {
 			switch (mode) {
 				case PLAY:
 					ns.pause();
-					ns.close();
+					ns.dispose();
 					clear();
 					break;
 				case BROADCAST:
@@ -232,7 +242,7 @@ public class OmVideo {
 					ns.publish(null); //false in original code
 				default:
 					clear();
-					ns.close();
+					ns.dispose();
 					break;
 			}
 		} else {

Modified: openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/application/trunk/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Tue Apr 11 15:52:14 2017
@@ -34,6 +34,10 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LDAP_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DOCUMENT_DPI;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DOCUMENT_QUALITY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_SECURE_PROXY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_VIDEO_CODEC;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FLASH_VIDEO_FPS;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FRONTEND_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_GOOGLE_ANALYTICS_CODE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_IGNORE_BAD_SSL;
@@ -352,6 +356,10 @@ public class ImportInitvalues {
 				"Users entered the room via invitationHash or secureHash will be redirected to this URL on connection lost");
 		cfgDao.add(CONFIG_CALENDAR_FIRST_DAY, "0", null, "The day that each week begins. The value must be a number that represents the day of the week. Sunday=0, Monday=1, Tuesday=2, etc.");
 		cfgDao.add(CONFIG_GOOGLE_ANALYTICS_CODE, null, null, "Code for Google Analytics");
+		cfgDao.add(CONFIG_FLASH_SECURE, "no", null, "Wether it should try to connect to rtmps first or not\nValid values: yes / no");
+		cfgDao.add(CONFIG_FLASH_SECURE_PROXY, "none", null, "The setting for the NetConnection default settings is 'none'\n set to value 'best' if you are trying to use rtmp over native SSL");
+		cfgDao.add(CONFIG_FLASH_VIDEO_CODEC, "h263", null, "Camera codecType, possible values: 'h263', 'h264'");
+		cfgDao.add(CONFIG_FLASH_VIDEO_FPS, "30", null, "Camera FPS, should be positive number in range (0, 60]");
 
 		log.debug("Configurations ADDED");
 	}

Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Tue Apr 11 15:52:14 2017
@@ -51,6 +51,10 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_IMAGEMAGIC_PATH = "imagemagick_path";
 	public static final String CONFIG_DOCUMENT_DPI = "document.dpi";
 	public static final String CONFIG_DOCUMENT_QUALITY = "document.quality";
+	public static final String CONFIG_FLASH_SECURE = "flash.secure";
+	public static final String CONFIG_FLASH_SECURE_PROXY = "flash.secure.proxy";
+	public static final String CONFIG_FLASH_VIDEO_CODEC = "flash.video.codec";
+	public static final String CONFIG_FLASH_VIDEO_FPS = "flash.video.fps";
 	public static final String MENU_ROOMS_NAME = "Conference Rooms";
 	public static final int RECENT_ROOMS_COUNT = 5;
 	public static final int LEVEL_USER = 1;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.html Tue Apr 11 15:52:14 2017
@@ -16,12 +16,9 @@
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 <html xmlns:wicket="http://wicket.apache.org">
-<wicket:head>
-	<script type="text/javascript" src="js/openmeetings_functions.js"></script>
-</wicket:head>
 <wicket:panel>
 	<form wicket:id="signin" class="signin">
 		<table>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizardPage.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizardPage.html?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizardPage.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizardPage.html Tue Apr 11 15:52:14 2017
@@ -7,20 +7,19 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-    	  
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:head>
-	<script type="text/javascript" src="js/openmeetings_functions.js" ></script>
 	<style type="text/css">
 		.abstractWizard .adminForm div.formelement {
 			max-width: 600px;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Tue Apr 11 15:52:14 2017
@@ -36,6 +36,7 @@ import java.util.Set;
 import java.util.UUID;
 
 import org.apache.directory.api.util.Strings;
+import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
 import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
@@ -123,14 +124,12 @@ public class RoomPanel extends BasePanel
 				String path = url.getPath();
 				path = path.substring(1, path.indexOf('/', 2) + 1);
 				ClientProperties cp = WebSession.get().getClientInfo().getProperties();
-				target.appendJavaScript(String.format("VideoSettings.init(%s);", new JSONObject()
+				target.appendJavaScript(String.format("VideoSettings.init(%s);", new JSONObject(getBean(ScopeApplicationAdapter.class).getFlashSettings().toString())
 						.put("uid", getClient().getUid())
 						.put("audioOnly", r.isAudioOnly())
 						.put("SID", WebSession.getSid())
 						.put("interview", Room.Type.interview == r.getType())
-						//.put("protocol", cfgDao.getConfValue(CONFIG_FLASH_PROTOCOL, String.class, ""))
 						.put("host", url.getHost())
-						//.put("port", cfgDao.getConfValue(CONFIG_FLASH_PORT, String.class, ""))
 						.put("app", path + r.getId())
 						.put("wmode", cp.isBrowserInternetExplorer() && cp.getBrowserVersionMajor() == 11 ? "opaque" : "direct")
 						.toString()

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java Tue Apr 11 15:52:14 2017
@@ -79,7 +79,6 @@ public class SwfPanel extends BasePanel
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);
 		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(newResourceReference())));
-		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forUrl("js/openmeetings_functions.js")));
 		response.render(OnDomReadyHeaderItem.forScript(panelLoaded.getCallbackScript()));
 	}
 

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js Tue Apr 11 15:52:14 2017
@@ -93,7 +93,8 @@ function startPrivateChat(el) {
 	$('#chatMessage .wysiwyg-editor').click();
 }
 var VideoSettings = (function() {
-	var self = {}, vs, lm, swf, s, cam, mic, res, inited = false;
+	var self = {}, vs, lm, swf, s, cam, mic, res,
+		vidScroll, recBtn, playBtn, inited = false, recAllowed = false;
 	function _load() {
 		s = {};
 		try {
@@ -112,6 +113,14 @@ var VideoSettings = (function() {
 		cam = vs.find('select.cam');
 		mic = vs.find('select.mic');
 		res = vs.find('select.cam-resolution');
+		vidScroll = vs.find('.vid-block .video-conainer');
+		recBtn = vs.find('.rec-start').click(function() {
+			recBtn.prop('disabled', true).button('refresh'); //TODO disable drop-downs
+			swf.startRec();
+		});
+		playBtn = vs.find('.play').click(function() {
+			swf.play();
+		});
 		vs.dialog({
 			classes: {
 				'ui-dialog': 'ui-corner-all video'
@@ -140,18 +149,43 @@ var VideoSettings = (function() {
 		lm.progressbar({ value: 0 });
 		options.width = 300;
 		options.height = 200;
-		swf = initVideo(vs.find('.vid-block .video-conainer'), 'video-settings-swf', options)[0];
+		swf = initVideo(vidScroll, 'video-settings-swf', options)[0];
 		vs.find('input, button').prop('disabled', true);
 		vs.find('button').button();
+		var rr = vs.find('.cam-resolution').parent('.sett-row');
+		if (!!options.interview) {
+			rr.show();
+		} else {
+			rr.hide();
+		}
 		_load();
 	}
+	function _updateRec() {
+		recBtn.prop('disabled', !recAllowed && (s.video.cam > -1 || s.video.mic > -1)).button('refresh');
+	}
 	function _readValues() {
-		s.video.cam = cam.val();
-		s.video.mic = mic.val();
+		s.video.cam = 1 * cam.val();
+		s.video.mic = 1 * mic.val();
 		var o = res.find('option:selected').data();
 		s.video.width = o.width;
 		s.video.height = o.height;
 		$(swf).attr('width', Math.max(300, s.video.width)).attr('height', Math.max(200, s.video.height));
+		vidScroll.scrollLeft(Math.max(0, s.video.width / 2 - 150))
+			.scrollTop(Math.max(0, s.video.height / 2 - 110));
+		_updateRec();
+	}
+	
+	function _allowRec(allow) {
+		recAllowed = allow;
+		_updateRec();
+	}
+	function _allowPlay() {
+		_updateRec();
+		playBtn.prop('disabled', false).button('refresh');
+	}
+	function _micActivity(level) {
+		console.log("activity: ", level)
+		lm.progressbar("value", Math.max(0, level));
 	}
 	function _initSwf() {
 		if (!inited) {
@@ -193,19 +227,17 @@ var VideoSettings = (function() {
 		_readValues();
 		swf.init(s.video.cam, s.video.mic, s.video.width, s.video.height);
 	}
-	function _open(interview) {
-		var rr = vs.find('.cam-resolution').parent('.sett-row');
-		if (interview) {
-			rr.show();
-		} else {
-			rr.hide();
-		}
+	function _open() {
+		recAllowed = false;
 		vs.dialog('open');
 	}
 	return {
 		init: _init
 		, initSwf: _initSwf
 		, open: _open
+		, allowRec: _allowRec
+		, allowPlay: _allowPlay
+		, micActivity: _micActivity
 		, close: function() { vs.dialog('close'); }
 	};
 })();

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html Tue Apr 11 15:52:14 2017
@@ -88,14 +88,14 @@
 					</div>
 				</div>
 				<div class="sett-row right">
-					<div><button><wicket:message key="775"/></button></div>
+					<div><button class="rec-start"><wicket:message key="775"/></button></div>
 				</div>
 			</div>
 			<div class="vid-block">
 				<div class="video-conainer"></div>
 				<div class="level-meter"></div>
 				<div class="sett-row right">
-					<div><button><wicket:message key="764"/></button></div>
+					<div><button class="play"><wicket:message key="764"/></button></div>
 				</div>
 			</div>
 		</div>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java?rev=1790995&r1=1790994&r2=1790995&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/SettingsIcon.java Tue Apr 11 15:52:14 2017
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.web.room.sidebar.icon;
 
 import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.web.room.RoomPanel;
 
 public class SettingsIcon extends ClientIcon {
@@ -42,6 +41,6 @@ public class SettingsIcon extends Client
 
 	@Override
 	protected String getScript() {
-		return String.format("VideoSettings.open(%s);", Room.Type.interview == room.getRoom().getType());
+		return String.format("VideoSettings.open();");
 	}
 }