diff --git a/src/Main-app.xml b/src/Main-app.xml
index 421acad..3ee0dff 100644
--- a/src/Main-app.xml
+++ b/src/Main-app.xml
@@ -15,7 +15,7 @@
- org.bigbluebutton.bbb-air-client
+ BigBlueButtonMobile
BigBlueButton
diff --git a/src/org/bigbluebutton/AppConfig.as b/src/org/bigbluebutton/AppConfig.as
index 8fcf638..c5347ef 100644
--- a/src/org/bigbluebutton/AppConfig.as
+++ b/src/org/bigbluebutton/AppConfig.as
@@ -8,6 +8,8 @@ package org.bigbluebutton
import org.bigbluebutton.command.DisconnectUserSignal;
import org.bigbluebutton.command.LoadSlideCommand;
import org.bigbluebutton.command.LoadSlideSignal;
+ import org.bigbluebutton.command.ReconnectIOSVideoCommand;
+ import org.bigbluebutton.command.ReconnectIOSVideoSignal;
import org.bigbluebutton.command.ShareCameraCommand;
import org.bigbluebutton.command.ShareCameraSignal;
import org.bigbluebutton.command.ShareMicrophoneCommand;
@@ -21,13 +23,13 @@ package org.bigbluebutton
import org.bigbluebutton.core.IChatMessageService;
import org.bigbluebutton.core.IDeskshareConnection;
import org.bigbluebutton.core.ILoginService;
- import org.bigbluebutton.core.IUsersService;
- import org.bigbluebutton.core.UsersService;
import org.bigbluebutton.core.IPresentationService;
- import org.bigbluebutton.core.IVoiceConnection;
+ import org.bigbluebutton.core.IUsersService;
import org.bigbluebutton.core.IVideoConnection;
+ import org.bigbluebutton.core.IVoiceConnection;
import org.bigbluebutton.core.LoginService;
import org.bigbluebutton.core.PresentationService;
+ import org.bigbluebutton.core.UsersService;
import org.bigbluebutton.core.VideoConnection;
import org.bigbluebutton.core.VoiceConnection;
import org.bigbluebutton.model.ConferenceParameters;
@@ -38,8 +40,6 @@ package org.bigbluebutton
import org.bigbluebutton.model.UserUISession;
import org.bigbluebutton.model.chat.ChatMessagesSession;
import org.bigbluebutton.model.chat.IChatMessagesSession;
-
-
import robotlegs.bender.extensions.signalCommandMap.api.ISignalCommandMap;
import robotlegs.bender.framework.api.IConfig;
@@ -79,6 +79,7 @@ package org.bigbluebutton
signalCommandMap.map(LoadSlideSignal).toCommand(LoadSlideCommand);
signalCommandMap.map(CameraQualitySignal).toCommand(CameraQualityCommand);
signalCommandMap.map(DisconnectUserSignal).toCommand(DisconnectUserCommand);
+ signalCommandMap.map(ReconnectIOSVideoSignal).toCommand(ReconnectIOSVideoCommand);
}
}
}
\ No newline at end of file
diff --git a/src/org/bigbluebutton/command/ConnectCommand.as b/src/org/bigbluebutton/command/ConnectCommand.as
index a446b32..46f7706 100644
--- a/src/org/bigbluebutton/command/ConnectCommand.as
+++ b/src/org/bigbluebutton/command/ConnectCommand.as
@@ -90,14 +90,22 @@ package org.bigbluebutton.command
presentationService.setupMessageSenderReceiver();
// set up and connect the remaining connections
- videoConnection.uri = userSession.config.getConfigFor("VideoConfModule").@uri + "/" + conferenceParameters.room;
+ videoConnection.uri = userSession.config.getConfigFor("VideoConfModule").@uri;
+ videoConnection.iosUri = userSession.config.getConfigFor("VideoConfModule").@iosUri;
//TODO see if videoConnection.successConnected is dispatched when it's connected properly
videoConnection.successConnected.add(successVideoConnected);
videoConnection.unsuccessConnected.add(unsuccessVideoConnected);
+ videoConnection.successIOSConnected.add(successIOSVideoConnected);
+ videoConnection.unsuccessIOSConnected.add(unsuccessIOSVideoConnected);
videoConnection.connect();
+ if (userSession.clientIsIOS)
+ {
+ videoConnection.connectIOS();
+ }
+
userSession.videoConnection = videoConnection;
voiceConnection.uri = userSession.config.getConfigFor("PhoneModule").@uri;
@@ -108,13 +116,13 @@ package org.bigbluebutton.command
deskshareConnection.connect();
userSession.deskshareConnection = deskshareConnection;
-
+
// Query the server for chat, users, and presentation info
chatService.sendWelcomeMessage();
chatService.getPublicChatMessages();
presentationService.getPresentationInfo();
-
+
userSession.userList.allUsersAddedSignal.add(successUsersAdded);
usersService.queryForParticipants();
usersService.queryForRecordingStatus();
@@ -162,5 +170,19 @@ package org.bigbluebutton.command
videoConnection.unsuccessConnected.remove(unsuccessVideoConnected);
videoConnection.successConnected.remove(successVideoConnected);
}
+
+ private function successIOSVideoConnected():void {
+ Log.getLogger("org.bigbluebutton").info(String(this) + ":successIOSVideoConnected()");
+
+ videoConnection.successConnected.remove(successIOSVideoConnected);
+ videoConnection.unsuccessConnected.remove(unsuccessIOSVideoConnected);
+ }
+
+ private function unsuccessIOSVideoConnected(reason:String):void {
+ Log.getLogger("org.bigbluebutton").info(String(this) + ":unsuccessIOSVideoConnected()");
+
+ videoConnection.unsuccessConnected.remove(unsuccessIOSVideoConnected);
+ videoConnection.successConnected.remove(successIOSVideoConnected);
+ }
}
}
\ No newline at end of file
diff --git a/src/org/bigbluebutton/command/DisconnectUserCommand.as b/src/org/bigbluebutton/command/DisconnectUserCommand.as
index f006da2..83c8181 100644
--- a/src/org/bigbluebutton/command/DisconnectUserCommand.as
+++ b/src/org/bigbluebutton/command/DisconnectUserCommand.as
@@ -28,6 +28,11 @@ package org.bigbluebutton.command
userSession.mainConnection.connection.close();
userSession.videoConnection.connection.close();
userSession.voiceConnection.connection.close();
+
+ if(userSession.videoConnection.iosConnection)
+ {
+ userSession.videoConnection.iosConnection.close();
+ }
}
}
}
\ No newline at end of file
diff --git a/src/org/bigbluebutton/command/ReconnectIOSVideoCommand.as b/src/org/bigbluebutton/command/ReconnectIOSVideoCommand.as
new file mode 100644
index 0000000..fad0d1a
--- /dev/null
+++ b/src/org/bigbluebutton/command/ReconnectIOSVideoCommand.as
@@ -0,0 +1,17 @@
+package org.bigbluebutton.command
+{
+ import org.bigbluebutton.model.IUserSession;
+
+ import robotlegs.bender.bundles.mvcs.Command;
+
+ public class ReconnectIOSVideoCommand extends Command
+ {
+ [Inject]
+ public var userSession:IUserSession;
+
+ public override function execute():void
+ {
+ userSession.videoConnection.connectIOS();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/org/bigbluebutton/command/ReconnectIOSVideoSignal.as b/src/org/bigbluebutton/command/ReconnectIOSVideoSignal.as
new file mode 100644
index 0000000..618a39e
--- /dev/null
+++ b/src/org/bigbluebutton/command/ReconnectIOSVideoSignal.as
@@ -0,0 +1,12 @@
+package org.bigbluebutton.command
+{
+ import org.osflash.signals.Signal;
+
+ public class ReconnectIOSVideoSignal extends Signal
+ {
+ public function ReconnectIOSVideoSignal()
+ {
+ super();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/org/bigbluebutton/command/ShareCameraCommand.as b/src/org/bigbluebutton/command/ShareCameraCommand.as
index a86feea..bf4705a 100644
--- a/src/org/bigbluebutton/command/ShareCameraCommand.as
+++ b/src/org/bigbluebutton/command/ShareCameraCommand.as
@@ -31,6 +31,9 @@ package org.bigbluebutton.command
[Inject]
public var usersService: IUsersService;
+ [Inject]
+ public var conferenceParameters:IConferenceParameters;
+
override public function execute():void {
if (enabled) {
userSession.videoConnection.cameraPosition = position;
@@ -40,12 +43,12 @@ package org.bigbluebutton.command
}
}
- private function buildStreamName(camWidth:int, camHeight:int, userId:String):String {
+ private function buildStreamName(camWidth:int, camHeight:int, userId:String, roomId:String):String {
var d:Date = new Date();
var curTime:Number = d.getTime();
var uid:String = userSession.userId;
var res:String = camWidth + "x" + camHeight;
- return res.concat("-" + uid) + "-" + curTime;
+ return res.concat("-" + uid) + "-" + roomId + "-" + curTime;
}
private function setupCamera(position:String):Camera
@@ -107,7 +110,7 @@ package org.bigbluebutton.command
if(userSession.videoConnection.camera)
{
- var streamName:String = buildStreamName(userSession.videoConnection.camera.width, userSession.videoConnection.camera.height, userId);
+ var streamName:String = buildStreamName(userSession.videoConnection.camera.width, userSession.videoConnection.camera.height, userId, conferenceParameters.room);
usersService.addStream(userId, streamName);
userSession.videoConnection.startPublishing(userSession.videoConnection.camera, streamName);
diff --git a/src/org/bigbluebutton/core/BaseConnection.as b/src/org/bigbluebutton/core/BaseConnection.as
index 524afdf..10eea20 100644
--- a/src/org/bigbluebutton/core/BaseConnection.as
+++ b/src/org/bigbluebutton/core/BaseConnection.as
@@ -20,7 +20,7 @@ package org.bigbluebutton.core
{
[Inject]
public var disconnectUserSignal:DisconnectUserSignal;
-
+
public static const NAME:String = "BaseConnection";
protected var _successConnected:ISignal = new Signal();
@@ -29,7 +29,7 @@ package org.bigbluebutton.core
protected var _netConnection:NetConnection;
protected var _uri:String;
protected var _onUserCommand:Boolean;
-
+
public function BaseConnection() {
Log.getLogger("org.bigbluebutton").info(String(this));
}
@@ -48,19 +48,19 @@ package org.bigbluebutton.core
{
return _unsuccessConnected;
}
-
+
public function get successConnected():ISignal
{
return _successConnected;
}
-
+
public function get connection():NetConnection {
return _netConnection;
}
public function connect(uri:String, ...parameters):void {
_uri = uri;
-
+
// The connect call needs to be done properly. At the moment lock settings
// are not implemented in the mobile client, so parameters[7] and parameters[8]
// are "faked" in order to connect (without them, I couldn't get the connect
@@ -110,7 +110,10 @@ package org.bigbluebutton.core
case "NetConnection.Connect.Closed":
trace(NAME + ": Connection closed. Uri: " + _uri);
- sendConnectionFailedEvent(ConnectionFailedEvent.CONNECTION_CLOSED);
+ if (!_uri.indexOf("iosvideo") == -1)
+ {
+ sendConnectionFailedEvent(ConnectionFailedEvent.CONNECTION_CLOSED);
+ }
break;
case "NetConnection.Connect.InvalidApp":
@@ -138,7 +141,7 @@ package org.bigbluebutton.core
break;
}
}
-
+
protected function sendConnectionSuccessEvent():void
{
successConnected.dispatch();
diff --git a/src/org/bigbluebutton/core/IVideoConnection.as b/src/org/bigbluebutton/core/IVideoConnection.as
index 053a6ec..4211852 100644
--- a/src/org/bigbluebutton/core/IVideoConnection.as
+++ b/src/org/bigbluebutton/core/IVideoConnection.as
@@ -9,16 +9,27 @@ package org.bigbluebutton.core
{
function get unsuccessConnected():ISignal
function get successConnected():ISignal
+ function get unsuccessIOSConnected():ISignal
+ function get successIOSConnected():ISignal
+ function get successIOSVideoReconnected():ISignal
function set uri(uri:String):void
function get uri():String
+ function set iosUri(uri:String):void
+ function get iosUri():String
function get connection():NetConnection
+ function get iosConnection():NetConnection
+ function get iosBaseConnection():IBaseConnection
function get cameraPosition():String;
function set cameraPosition(position:String):void
function get camera():Camera;
function set camera(value:Camera):void
function get selectedCameraQuality():int;
function set selectedCameraQuality(value:int):void
+ function get streamViewCounter():int
+ function increaseStreamViewCounter():void
+ function resetStreamViewCounter():void
function connect():void
+ function connectIOS():void
function startPublishing(camera:Camera, streamName:String):void
function stopPublishing():void
function selectCameraQuality(value:int):void
diff --git a/src/org/bigbluebutton/core/VideoConnection.as b/src/org/bigbluebutton/core/VideoConnection.as
index d060863..6cf2439 100644
--- a/src/org/bigbluebutton/core/VideoConnection.as
+++ b/src/org/bigbluebutton/core/VideoConnection.as
@@ -10,31 +10,53 @@ package org.bigbluebutton.core
import mx.utils.ObjectUtil;
+ import org.bigbluebutton.command.ReconnectIOSVideoSignal;
+ import org.bigbluebutton.model.IUserSession;
import org.osflash.signals.ISignal;
import org.osflash.signals.Signal;
import org.osmf.logging.Log;
+ import robotlegs.bender.framework.api.IInjector;
+
public class VideoConnection extends DefaultConnectionCallback implements IVideoConnection
{
[Inject]
public var baseConnection:IBaseConnection;
+ [Inject]
+ public var injector:IInjector;
+
+ [Inject]
+ public var userSession:IUserSession;
+
+ [Inject]
+ public var reconnectIOSVideoSignal:ReconnectIOSVideoSignal;
+
+ private var _iosBaseConnection:IBaseConnection;
private var _ns:NetStream;
private var _cameraPosition:String;
protected var _successConnected:ISignal = new Signal();
protected var _unsuccessConnected:ISignal = new Signal();
+ protected var _successIOSConnected:ISignal = new Signal();
+ protected var _unsuccessIOSConnected:ISignal = new Signal();
+ protected var _successIOSReconnected:ISignal = new Signal();
protected var _applicationURI:String;
+ protected var _iosApplicationURI:String;
private var _camera:Camera;
private var _selectedCameraQuality:int;
+ private var _streamViewCounter:int;
public static var CAMERA_QUALITY_LOW:int = 0;
public static var CAMERA_QUALITY_MEDIUM:int = 1;
public static var CAMERA_QUALITY_HIGH:int = 2;
-
+ public static var MAX_STREAM_VIEWS:int = 4;
+
+ public static const IOS_NAME:String = "IOSVideoConnection";
+
public function VideoConnection()
{
Log.getLogger("org.bigbluebutton").info(String(this));
@@ -48,6 +70,24 @@ package org.bigbluebutton.core
baseConnection.unsuccessConnected.add(onConnectionUnsuccess);
}
+ public function initIOSConnection():void
+ {
+ _iosBaseConnection.init(this);
+ _iosBaseConnection.successConnected.add(onIOSConnectionSuccess);
+ _iosBaseConnection.unsuccessConnected.add(onIOSConnectionUnsuccess);
+ _iosBaseConnection.connection.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
+ }
+
+ private function onIOSConnectionUnsuccess(reason:String):void
+ {
+ unsuccessIOSConnected.dispatch(reason);
+ }
+
+ private function onIOSConnectionSuccess():void
+ {
+ successIOSConnected.dispatch();
+ }
+
private function onConnectionUnsuccess(reason:String):void
{
unsuccessConnected.dispatch(reason);
@@ -69,6 +109,15 @@ package org.bigbluebutton.core
return _successConnected;
}
+ public function get unsuccessIOSConnected():ISignal
+ {
+ return _unsuccessIOSConnected;
+ }
+ public function get successIOSConnected():ISignal
+ {
+ return _successIOSConnected;
+ }
+
public function set uri(uri:String):void {
_applicationURI = uri;
}
@@ -77,14 +126,66 @@ package org.bigbluebutton.core
return _applicationURI;
}
+ public function set iosUri(uri:String):void {
+ _iosApplicationURI = uri;
+ }
+
+ public function get iosUri():String {
+ return _iosApplicationURI;
+ }
+
public function get connection():NetConnection {
return baseConnection.connection;
}
+ public function get iosConnection():NetConnection
+ {
+ return _iosBaseConnection.connection;
+ }
+
+ public function get iosBaseConnection():IBaseConnection
+ {
+ return _iosBaseConnection;
+ }
+
public function connect():void {
baseConnection.connect(uri);
}
+ public function connectIOS():void
+ {
+ _iosBaseConnection = injector.getInstance(IBaseConnection);
+ initIOSConnection();
+ _iosBaseConnection.connect(iosUri);
+ }
+
+ protected function netStatus(event:NetStatusEvent):void
+ {
+ var info : Object = event.info;
+ var statusCode : String = info.code;
+
+ switch (statusCode) {
+ case "NetConnection.Connect.Success":
+ trace(IOS_NAME + ": Connection succeeded. Uri: " + uri);
+ sendIOSVideoReconnectionSuccessEvent();
+ break;
+ case "NetConnection.Connect.Closed":
+ trace(IOS_NAME + ": Connection closed. Uri: " + uri);
+ reconnectIOSVideoSignal.dispatch();
+ break;
+ }
+ }
+
+ protected function sendIOSVideoReconnectionSuccessEvent():void
+ {
+ successIOSVideoReconnected.dispatch();
+ }
+
+ public function get successIOSVideoReconnected():ISignal
+ {
+ return _successIOSReconnected;
+ }
+
public function get cameraPosition():String
{
return _cameraPosition;
@@ -115,6 +216,21 @@ package org.bigbluebutton.core
_selectedCameraQuality = value;
}
+ public function get streamViewCounter():int
+ {
+ return _streamViewCounter;
+ }
+
+ public function increaseStreamViewCounter():void
+ {
+ _streamViewCounter++;
+ }
+
+ public function resetStreamViewCounter():void
+ {
+ _streamViewCounter = 0;
+ }
+
/**
* Set video quality based on the user selection
**/
diff --git a/src/org/bigbluebutton/model/IUserSession.as b/src/org/bigbluebutton/model/IUserSession.as
index 75fdba7..40c3d3e 100644
--- a/src/org/bigbluebutton/model/IUserSession.as
+++ b/src/org/bigbluebutton/model/IUserSession.as
@@ -22,6 +22,7 @@ package org.bigbluebutton.model
function set config(value:Config):void;
function get userId():String;
function set userId(value:String):void;
+ function get clientIsIOS():Boolean;
function get userList():UserList;
function get voiceConnection():IVoiceConnection;
function set voiceConnection(value:IVoiceConnection):void;
diff --git a/src/org/bigbluebutton/model/UserSession.as b/src/org/bigbluebutton/model/UserSession.as
index 322a5fa..ab962a8 100644
--- a/src/org/bigbluebutton/model/UserSession.as
+++ b/src/org/bigbluebutton/model/UserSession.as
@@ -1,6 +1,7 @@
package org.bigbluebutton.model
{
import flash.net.NetConnection;
+ import flash.system.Capabilities;
import mx.collections.ArrayList;
@@ -28,6 +29,7 @@ package org.bigbluebutton.model
protected var _userList:UserList;
protected var _presentationList:PresentationList;
protected var _recording:Boolean;
+ protected var _clientIsIOS:Boolean;
protected var _guestSignal:ISignal = new Signal();
protected var _successJoiningMeetingSignal:ISignal = new Signal();
@@ -110,11 +112,17 @@ package org.bigbluebutton.model
{
_deskshareConnection = value;
}
+
+ public function get clientIsIOS():Boolean
+ {
+ return _clientIsIOS;
+ }
public function UserSession()
{
_userList = new UserList();
_presentationList = new PresentationList();
+ _clientIsIOS = (Capabilities.manufacturer.indexOf("iOS") != -1);
}
public function get presentationList():PresentationList
diff --git a/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as b/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as
index 9ec160d..00cbaa3 100644
--- a/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as
+++ b/src/org/bigbluebutton/view/navigation/pages/common/VideoView.as
@@ -43,10 +43,15 @@ package org.bigbluebutton.view.navigation.pages.common
this.streamName = streamName;
this.connection = connection;
+ initNetStream(connection);
+ }
+
+ public function initNetStream(connection:NetConnection):void
+ {
ns = new NetStream(connection);
ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
- ns.client = this;
+ ns.client = {};
ns.bufferTime = 0;
ns.receiveVideo(true);
ns.receiveAudio(false);
@@ -108,7 +113,7 @@ package org.bigbluebutton.view.navigation.pages.common
{
video.height = screenWidth;
video.width = ((originalVideoWidth * video.height)/originalVideoHeight);
-
+
if (screenWidth < video.width)
{
video.width = screenHeight;
@@ -164,7 +169,7 @@ package org.bigbluebutton.view.navigation.pages.common
this.stage.addChild(video);
}
- private function onNetStatus(e:NetStatusEvent):void{
+ protected function onNetStatus(e:NetStatusEvent):void{
switch(e.info.code){
case "NetStream.Publish.Start":
trace("NetStream.Publish.Start for broadcast stream " + streamName);
@@ -184,7 +189,7 @@ package org.bigbluebutton.view.navigation.pages.common
}
}
- private function onAsyncError(e:AsyncErrorEvent):void{
+ protected function onAsyncError(e:AsyncErrorEvent):void{
trace("VideoWindow::asyncerror " + e.toString());
}
diff --git a/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as b/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as
index b6c0fea..ab38a07 100644
--- a/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as
+++ b/src/org/bigbluebutton/view/navigation/pages/videochat/VideoChatViewMediator.as
@@ -1,19 +1,17 @@
package org.bigbluebutton.view.navigation.pages.videochat
{
- import flash.display.DisplayObject;
-
import mx.collections.ArrayCollection;
import mx.core.FlexGlobals;
import mx.resources.ResourceManager;
import mx.utils.ObjectUtil;
+ import org.bigbluebutton.command.ReconnectIOSVideoSignal;
+ import org.bigbluebutton.core.VideoConnection;
import org.bigbluebutton.model.IUserSession;
import org.bigbluebutton.model.IUserUISession;
import org.bigbluebutton.model.User;
import org.bigbluebutton.model.UserList;
- import org.bigbluebutton.model.UserSession;
import org.bigbluebutton.view.navigation.pages.PagesENUM;
- import org.mockito.integrations.currentMockito;
import org.osmf.logging.Log;
import robotlegs.bender.bundles.mvcs.Mediator;
@@ -31,8 +29,13 @@ package org.bigbluebutton.view.navigation.pages.videochat
[Inject]
public var userUISession: IUserUISession;
+ [Inject]
+ public var reconnectIOSVideoSignal:ReconnectIOSVideoSignal;
+
protected var dataProvider:ArrayCollection;
+ private var currentUser:User;
+
override public function initialize():void
{
Log.getLogger("org.bigbluebutton").info(String(this));
@@ -43,6 +46,8 @@ package org.bigbluebutton.view.navigation.pages.videochat
userUISession.pageTransitionStartSignal.add(onPageTransitionStart);
view.streamlist.addEventListener(IndexChangeEvent.CHANGE, onSelectStream);
+ userSession.videoConnection.successIOSVideoReconnected.add(onVideoReconnected);
+
checkVideo();
FlexGlobals.topLevelApplication.pageName.text = ResourceManager.getInstance().getString('resources', 'video.title');
dataProvider = new ArrayCollection();
@@ -96,14 +101,16 @@ package org.bigbluebutton.view.navigation.pages.videochat
{
if (event.newIndex >= 0)
{
- var user:User = dataProvider.getItemAt(event.newIndex) as User;
- if(user.hasStream)
+ currentUser = dataProvider.getItemAt(event.newIndex) as User;
+
+ if(currentUser.hasStream)
{
if(view && view.getDisplayedUserID() != null)
{
stopStream(view.getDisplayedUserID());
}
- startStream(user.name, user.streamName);
+
+ startStream(currentUser.name, currentUser.streamName);
}
}
}
@@ -116,6 +123,8 @@ package org.bigbluebutton.view.navigation.pages.videochat
userUISession.pageTransitionStartSignal.remove(onPageTransitionStart);
+ userSession.videoConnection.successIOSVideoReconnected.remove(onVideoReconnected);
+
view.dispose();
view = null;
@@ -202,7 +211,30 @@ package org.bigbluebutton.view.navigation.pages.videochat
var length:Number = Number(String(resolution.dimensions[1]));
if (view)
{
- view.startStream(userSession.videoConnection.connection, name, streamName, resolution.userID, width, length, view.videoGroup.height, view.videoGroup.width);
+ // iOS client uses nginx-rtmp module to view transcoded video stream.
+ // Everytime after client viewed 4 streams - NetConnection.Connect.Closed will be raised in VideoConnection and
+ // we need to restart NetConnection in order to play the stream. However magic number 4 will raise NetConnection.Connect.Closed only
+ // in non-ios devies and in ios devices NetConnection will stop functionality and keep silence, so we need to manully count the number
+ // of streams viewed on ios and restart the NetConnection after the fourth time.
+ if (userSession.clientIsIOS)
+ {
+ userSession.videoConnection.increaseStreamViewCounter();
+
+ if (userSession.videoConnection.streamViewCounter > VideoConnection.MAX_STREAM_VIEWS)
+ {
+ userSession.videoConnection.resetStreamViewCounter();
+ trace("Maximum number of 4 stream views on ios device reached, restarting the ios NetConnection.");
+ reconnectIOSVideoSignal.dispatch();
+ }
+ else
+ {
+ view.startStream(userSession.videoConnection.iosConnection, name, streamName, resolution.userID, width, length, view.videoGroup.height, view.videoGroup.width);
+ }
+ }
+ else
+ {
+ view.startStream(userSession.videoConnection.connection, name, streamName, resolution.userID, width, length, view.videoGroup.height, view.videoGroup.width);
+ }
}
}
}
@@ -230,7 +262,7 @@ package org.bigbluebutton.view.navigation.pages.videochat
var userWithCamera:User = getUserWithCamera();
var newUser:User;
-
+
if (changedUser)
{
// Priority state machine
@@ -238,28 +270,33 @@ package org.bigbluebutton.view.navigation.pages.videochat
if (selectedUser && selectedUser.hasStream && changedUser.userID == selectedUser.userID)
{
if (view) view.stopStream();
+ currentUser = changedUser;
startStream(changedUser.name, changedUser.streamName);
}
else if (changedUser.presenter && changedUser.hasStream)
{
if (view) view.stopStream();
+ currentUser = changedUser;
startStream(changedUser.name, changedUser.streamName);
}
else if (currentUserID && changedUser.userID == currentUserID)
{
if (view) view.stopStream();
+ currentUser = changedUser;
startStream(changedUser.name, changedUser.streamName);
}
else if (userWithCamera)
{
if (userWithCamera.userID == changedUser.userID)
{
- if (view) view.stopStream();
+ if (view) view.stopStream();
+ currentUser = changedUser;
startStream(changedUser.name, changedUser.streamName);
}
else if (!changedUser.hasStream && userWithCamera.me)
{
- if (view) view.stopStream();
+ if (view) view.stopStream();
+ currentUser = userWithCamera;
startStream(userWithCamera.name, userWithCamera.streamName);
}
}
@@ -296,19 +333,28 @@ package org.bigbluebutton.view.navigation.pages.videochat
{
return;
}
-
+
if (newUser)
{
if (view) view.stopStream();
+ currentUser = newUser;
startStream(newUser.name, newUser.streamName);
view.noVideoMessage.visible = false;
}
}
}
+ private function onVideoReconnected():void
+ {
+ if (view && currentUser)
+ {
+ startStream(currentUser.name, currentUser.streamName);
+ }
+ }
+
protected function getVideoResolution(stream:String):Object
{
- var pattern:RegExp = new RegExp("(\\d+x\\d+)-([A-Za-z0-9]+)-\\d+", "");
+ var pattern:RegExp = new RegExp("(\\d+x\\d+)-([A-Za-z0-9]+)-([a-z0-9]+-\\d+)-\\d+", "");
if (pattern.test(stream))
{
trace("The stream name is well formatted [" + stream + "]");