From f726cb9a539265fd547ccc01a34bad57fb472fc2 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 2 Jul 2015 17:55:04 -0500 Subject: [PATCH] FS-7769: [mod_conference] Add new multi-canvas and telepresence features mod_conference new features: add conference layout "1x1+2x1" and add to layout group grid add conference flag video-bridge-first-two conference flag add conference flag video-required-for-canvas to only use avatars for members with video add conference flag video-muxing-personal-canvas add conf_verto_ prefix for variables to pass on live array subscription notice add api command conference foo vid-canvas [] add api command conference foo vid-layer [] add api command conference foo vid-watching-canvas [] changed api command conference foo vid-layout, args are now "|group []" add channel vars you can set before entering conference video_initial_canvas and video_initial_watching_canvas add many new output status vars to conference list api add new conference member flag "second-screen" add config param video-canvas-count add config param video-super-canvas-label-layers add config param video-super-canvas-show-all-layers add config param video-super-canvas-bgcolor verto client: add google login add hipchat js file conf_verto_hipchatURL= to control what hipchat server appears if any global device init and overrides allow passing sessid add confMan.canvasCount add handling of multiple canvases and launching them, and controlling all of their layouts re-layout moderator controls and add support for changing the watching and input canvas and layers when launching another canvas, watch subscriptions for the original call so we can automatically close the additional window maintain camera settings on call recovery --- .../conference_layouts.conf.xml | 8 + html5/verto/js/src/jquery.FSRTC.js | 2 +- html5/verto/js/src/jquery.verto.js | 239 +- html5/verto/video_demo/images/search.gif | Bin 0 -> 405198 bytes html5/verto/video_demo/index.html | 87 +- html5/verto/video_demo/js/jquery.hipchat.js | 47 + html5/verto/video_demo/js/md5.min.js | 1 + html5/verto/video_demo/js/verto-min.js | 34 +- html5/verto/video_demo/verto.js | 339 +- .../mod_conference/mod_conference.c | 3361 ++++++++++++----- .../applications/mod_dptools/mod_dptools.c | 17 +- src/mod/endpoints/mod_verto/mod_verto.c | 18 +- src/switch_core_media.c | 53 +- 13 files changed, 3073 insertions(+), 1133 deletions(-) create mode 100644 html5/verto/video_demo/images/search.gif create mode 100644 html5/verto/video_demo/js/jquery.hipchat.js create mode 100644 html5/verto/video_demo/js/md5.min.js diff --git a/conf/vanilla/autoload_configs/conference_layouts.conf.xml b/conf/vanilla/autoload_configs/conference_layouts.conf.xml index 3620f64011..9ba756c210 100644 --- a/conf/vanilla/autoload_configs/conference_layouts.conf.xml +++ b/conf/vanilla/autoload_configs/conference_layouts.conf.xml @@ -12,6 +12,11 @@ + + + + + @@ -300,11 +305,14 @@ + + 1x1 2x1 + 1x1+2x1 2x2 3x3 4x4 diff --git a/html5/verto/js/src/jquery.FSRTC.js b/html5/verto/js/src/jquery.FSRTC.js index fcd300d185..663f804164 100644 --- a/html5/verto/js/src/jquery.FSRTC.js +++ b/html5/verto/js/src/jquery.FSRTC.js @@ -491,7 +491,7 @@ var iceTimer; } if (bestFrameRate && !window.moz) { - video.optional.push({minFrameRate: bestFrameRate}); + video.optional.push({minFrameRate: bestFrameRate}); } } else { diff --git a/html5/verto/js/src/jquery.verto.js b/html5/verto/js/src/jquery.verto.js index bef4f49bc6..0297ff1bb6 100644 --- a/html5/verto/js/src/jquery.verto.js +++ b/html5/verto/js/src/jquery.verto.js @@ -76,15 +76,21 @@ videoParams: {}, audioParams: {}, loginParams: {}, + deviceParams: {}, userVariables: {}, iceServers: false, - ringSleep: 6000 + ringSleep: 6000, + sessid: null }, options); - verto.sessid = $.cookie('verto_session_uuid') || generateGUID(); - $.cookie('verto_session_uuid', verto.sessid, { - expires: 1 - }); + if (verto.options.sessid) { + verto.sessid = verto.options.sessid; + } else { + verto.sessid = $.cookie('verto_session_uuid') || generateGUID(); + $.cookie('verto_session_uuid', verto.sessid, { + expires: 1 + }); + } verto.dialogs = {}; verto.callbacks = callbacks || {}; @@ -1160,6 +1166,8 @@ var CONFMAN_SERNO = 1; + $.verto.modfuncs = {}; + $.verto.confMan = function(verto, params) { var confMan = this; @@ -1177,7 +1185,8 @@ confMan.verto = verto; confMan.serno = CONFMAN_SERNO++; - + confMan.canvasCount = confMan.params.laData.canvasCount; + function genMainMod(jq) { var play_id = "play_" + confMan.serno; var stop_id = "stop_" + confMan.serno; @@ -1186,8 +1195,6 @@ var rec_stop_id = "recording_stop" + confMan.serno; var div_id = "confman_" + confMan.serno; - - var html = "

" + "" + "" + @@ -1198,21 +1205,25 @@ jq.html(html); - if (confMan.params.hasVid) { - var vlayout_id = "confman_vid_layout_" + confMan.serno; - var vlselect_id = "confman_vl_select_" + confMan.serno; - - var vlhtml = "

" + - "Video Layout " + - "

"; - jq.append(vlhtml); + $.verto.modfuncs.change_video_layout = function(id, canvas_id) { + var val = $("#" + id + " option:selected").text(); + if (val !== "none") { + confMan.modCommand("vid-layout", null, [val, canvas_id]); + } + }; - $("#" + vlselect_id).change(function() { - var val = $("#" + vlselect_id).find(":selected").val(); - if (val !== "none") { - confMan.modCommand("vid-layout", null, val); - } - }); + if (confMan.params.hasVid) { + for (var j = 0; j < confMan.canvasCount; j++) { + var vlayout_id = "confman_vid_layout_" + j + "_" + confMan.serno; + var vlselect_id = "confman_vl_select_" + j + "_" + confMan.serno; + + + var vlhtml = "

" + + "Video Layout Canvas " + (j+1) + + " " + + "

"; + jq.append(vlhtml); + } $("#" + snapshot_id).click(function() { var file = prompt("Please enter file name", ""); @@ -1249,6 +1260,18 @@ function genControls(jq, rowid) { var x = parseInt(rowid); var kick_id = "kick_" + x; + var canvas_in_next_id = "canvas_in_next_" + x; + var canvas_in_prev_id = "canvas_in_prev_" + x; + var canvas_out_next_id = "canvas_out_next_" + x; + var canvas_out_prev_id = "canvas_out_prev_" + x; + + var canvas_in_set_id = "canvas_in_set_" + x; + var canvas_out_set_id = "canvas_out_set_" + x; + + var layer_set_id = "layer_set_" + x; + var layer_next_id = "layer_next_" + x; + var layer_prev_id = "layer_prev_" + x; + var tmute_id = "tmute_" + x; var tvmute_id = "tvmute_" + x; var vbanner_id = "vbanner_" + x; @@ -1260,21 +1283,52 @@ var transfer_id = "transfer" + x; - var html = "
" + - "" + + var html = "
"; + + html += "General Controls
"; + + html += "" + "" + - (confMan.params.hasVid ? "" : "") + - (confMan.params.hasVid ? "" : "") + - (confMan.params.hasVid ? "" : "") + - (confMan.params.hasVid ? "" : "") + "" + "" + - "" + - "
" - ; + ""; + + if (confMan.params.hasVid) { + html += "

Video Controls
"; + + + html += "" + + "" + + "" + + ""; + + if (confMan.canvasCount > 1) { + html += "

Canvas Controls
" + + "" + + "" + + "" + + + "
" + + + "" + + "" + + ""; + } + + html += "
" + + + "" + + "" + + "" + + + + + "
"; + } jq.html(html); + if (!jq.data("mouse")) { $("#" + box_id).hide(); } @@ -1300,6 +1354,50 @@ confMan.modCommand("kick", x); }); + + $("#" + layer_set_id).click(function() { + var cid = prompt("Please enter layer ID", ""); + if (cid) { + confMan.modCommand("vid-layer", x, cid); + } + }); + + $("#" + layer_next_id).click(function() { + confMan.modCommand("vid-layer", x, "next"); + }); + $("#" + layer_prev_id).click(function() { + confMan.modCommand("vid-layer", x, "prev"); + }); + + $("#" + canvas_in_set_id).click(function() { + var cid = prompt("Please enter canvas ID", ""); + if (cid) { + confMan.modCommand("vid-canvas", x, cid); + } + }); + + $("#" + canvas_out_set_id).click(function() { + var cid = prompt("Please enter canvas ID", ""); + if (cid) { + confMan.modCommand("vid-watching-canvas", x, cid); + } + }); + + $("#" + canvas_in_next_id).click(function() { + confMan.modCommand("vid-canvas", x, "next"); + }); + $("#" + canvas_in_prev_id).click(function() { + confMan.modCommand("vid-canvas", x, "prev"); + }); + + + $("#" + canvas_out_next_id).click(function() { + confMan.modCommand("vid-watching-canvas", x, "next"); + }); + $("#" + canvas_out_prev_id).click(function() { + confMan.modCommand("vid-watching-canvas", x, "prev"); + }); + $("#" + tmute_id).click(function() { confMan.modCommand("tmute", x); }); @@ -1340,7 +1438,7 @@ if (confMan.params.laData.role === "moderator") { atitle = "Action"; - awidth = 300; + awidth = 600; if (confMan.params.mainModID) { genMainMod($(confMan.params.mainModID)); @@ -1357,30 +1455,33 @@ } if (e.data["conf-command"] === "list-videoLayouts") { - var vlselect_id = "#confman_vl_select_" + confMan.serno; - var vlayout_id = "#confman_vid_layout_" + confMan.serno; - var x = 0; - var options; - - $(vlselect_id).selectmenu({}); - $(vlselect_id).selectmenu("enable"); - $(vlselect_id).empty(); - - $(vlselect_id).append(new Option("Choose a Layout", "none")); + for (var j = 0; j < confMan.canvasCount; j++) { + var vlselect_id = "#confman_vl_select_" + j + "_" + confMan.serno; + var vlayout_id = "#confman_vid_layout_" + j + "_" + confMan.serno; + + var x = 0; + var options; + + $(vlselect_id).selectmenu({}); + $(vlselect_id).selectmenu("enable"); + $(vlselect_id).empty(); + + $(vlselect_id).append(new Option("Choose a Layout", "none")); - if (e.data.responseData) { - options = e.data.responseData.sort(); + if (e.data.responseData) { + options = e.data.responseData.sort(); - for (var i in options) { - $(vlselect_id).append(new Option(options[i], options[i])); - x++; + for (var i in options) { + $(vlselect_id).append(new Option(options[i], options[i])); + x++; + } } - } - if (x) { - $(vlselect_id).selectmenu('refresh', true); - } else { - $(vlayout_id).hide(); + if (x) { + $(vlselect_id).selectmenu('refresh', true); + } else { + $(vlayout_id).hide(); + } } } else { @@ -1432,16 +1533,20 @@ "aaData": [], "aoColumns": [ { - "sTitle": "ID" + "sTitle": "ID", + "sWidth": "50" }, { - "sTitle": "Number" + "sTitle": "Number", + "sWidth": "250" }, { - "sTitle": "Name" + "sTitle": "Name", + "sWidth": "250" }, { - "sTitle": "Codec" + "sTitle": "Codec", + "sWidth": "100" }, { "sTitle": "Status", @@ -1459,7 +1564,7 @@ "bFilter": false, "bLengthChange": false, "bPaginate": false, - "iDisplayLength": 1000, + "iDisplayLength": 1400, "oLanguage": { "sEmptyTable": "The Conference is Empty....." @@ -1519,6 +1624,9 @@ videoParams: verto.options.videoParams }, params); + dialog.useCamera = verto.options.deviceParams.useCamera; + dialog.useMic = verto.options.deviceParams.useMic; + dialog.verto = verto; dialog.direction = direction; dialog.lastState = null; @@ -1957,12 +2065,17 @@ params.sdp = dialog.params.sdp; + dialog.useCamera = verto.options.deviceParams.useCamera; + dialog.useMic = verto.options.deviceParams.useMic; + if (params) { if (params.useVideo) { dialog.useVideo(true); } dialog.params.callee_id_name = params.callee_id_name; dialog.params.callee_id_number = params.callee_id_number; + dialog.useCamera = params.useCamera; + dialog.useMic = params.useMic; } dialog.rtc.createAnswer(params); @@ -2130,8 +2243,14 @@ $.verto.enum = Object.freeze($.verto.enum); $.verto.saved = []; + + $.verto.unloadJobs = []; $(window).bind('beforeunload', function() { + for (var f in $.verto.unloadJobs) { + $.verto.unloadJobs[f](); + } + for (var i in $.verto.saved) { var verto = $.verto.saved[i]; if (verto) { @@ -2139,6 +2258,7 @@ verto.logout(); } } + return $.verto.warnOnUnload; }); @@ -2216,4 +2336,9 @@ }); } + $.verto.genUUID = function () { + return generateGUID(); + } + + })(jQuery); diff --git a/html5/verto/video_demo/images/search.gif b/html5/verto/video_demo/images/search.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bce1659679b1daddfb92e027258a5c314e2b1eb GIT binary patch literal 405198 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 literal 0 HcmV?d00001 diff --git a/html5/verto/video_demo/index.html b/html5/verto/video_demo/index.html index 6725e38ad1..548d269e49 100644 --- a/html5/verto/video_demo/index.html +++ b/html5/verto/video_demo/index.html @@ -2,6 +2,14 @@ + + + + + + + + @@ -16,9 +24,11 @@ } .ctlbtn { - border: 0px; - color: #eeeeee; - background-color: #0000ae; + border: 2px; + border-style:outset; + color: #ffffff; + min-width: 125px; + background-color: #666666; font-face: arial; height:18px; font-size:7pt; @@ -73,6 +83,7 @@ max-height:40px; } +div#preload { display: none; } @@ -86,6 +97,17 @@

+
+ + + +
+ +
+

@@ -184,6 +228,7 @@ +
@@ -300,12 +345,10 @@ if ($('#devices').is(':visible')) { - + - -

+ -
@@ -422,7 +465,7 @@ if ($('#devices').is(':visible')) {

- +


@@ -474,10 +517,25 @@ if ($('#devices').is(':visible')) {
+
+ + +
+ +
+ + +
+
-
+
+ + + + +

@@ -587,7 +645,14 @@ if ($('#devices').is(':visible')) { + + + + + diff --git a/html5/verto/video_demo/js/jquery.hipchat.js b/html5/verto/video_demo/js/jquery.hipchat.js new file mode 100644 index 0000000000..e0e418ae6d --- /dev/null +++ b/html5/verto/video_demo/js/jquery.hipchat.js @@ -0,0 +1,47 @@ +(function ($) { + + // Creates an iframe with an embedded HipChat conversation window. + // + // Options: + // url - The url to the room to embed; required + // container - The container in which to insert the HipChat panel; required + // timezone - The timezone to use in the embedded room; required + // welcome - A welcome message to display when the room is joined; optional + // noframes - Content to include when iframes are disabled in the browser; optional + // width - The width of the iframe; defaults to 100% + // height - The height of the iframe; defaults to 400px + $.createHipChat = function (options) { + if (options && options.url && options.container && options.timezone) { + var $container = $(options.container); + if ($container.length === 0) return; + var params = { + anonymous: 0, + timezone: options.timezone, + minimal: 0 + }; + if (options.welcome) { + params.welcome_msg = options.welcome; + } + var url = options.url + (options.url.indexOf('?') > 0 ? '&' : '?') + $.param(params); + if (url.indexOf('https://') !== 0) { + url = 'https://' + url; + } + var w = options.width || '100%'; + var h = options.height || 400; + var nf = (options.noframes || ''); + return { + show: function () { + $container.html(''); + } + }; + } + }; + + $.fn.hipChatPanel = function (options) { + options.container = this[0]; + var panel = $.createHipChat(options); + this.html('') + .find('.show-hipchat').click(function (e) { panel.show(); }); + }; + +}(jQuery)); diff --git a/html5/verto/video_demo/js/md5.min.js b/html5/verto/video_demo/js/md5.min.js new file mode 100644 index 0000000000..11b1545602 --- /dev/null +++ b/html5/verto/video_demo/js/md5.min.js @@ -0,0 +1 @@ +!function(a){"use strict";function b(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}function c(a,b){return a<>>32-b}function d(a,d,e,f,g,h){return b(c(b(b(d,a),b(f,h)),g),e)}function e(a,b,c,e,f,g,h){return d(b&c|~b&e,a,b,f,g,h)}function f(a,b,c,e,f,g,h){return d(b&e|c&~e,a,b,f,g,h)}function g(a,b,c,e,f,g,h){return d(b^c^e,a,b,f,g,h)}function h(a,b,c,e,f,g,h){return d(c^(b|~e),a,b,f,g,h)}function i(a,c){a[c>>5]|=128<>>9<<4)+14]=c;var d,i,j,k,l,m=1732584193,n=-271733879,o=-1732584194,p=271733878;for(d=0;d>5]>>>b%32&255);return c}function k(a){var b,c=[];for(c[(a.length>>2)-1]=void 0,b=0;b>5]|=(255&a.charCodeAt(b/8))<16&&(e=i(e,8*a.length)),c=0;16>c;c+=1)f[c]=909522486^e[c],g[c]=1549556828^e[c];return d=i(f.concat(k(b)),512+8*b.length),j(i(g.concat(d),640))}function n(a){var b,c,d="0123456789abcdef",e="";for(c=0;c>>4&15)+d.charAt(15&b);return e}function o(a){return unescape(encodeURIComponent(a))}function p(a){return l(o(a))}function q(a){return n(p(a))}function r(a,b){return m(o(a),o(b))}function s(a,b){return n(r(a,b))}function t(a,b,c){return b?c?r(b,a):s(b,a):c?p(a):q(a)}"function"==typeof define&&define.amd?define(function(){return t}):a.md5=t}(this); \ No newline at end of file diff --git a/html5/verto/video_demo/js/verto-min.js b/html5/verto/video_demo/js/verto-min.js index 4edb39ccea..558d66893c 100644 --- a/html5/verto/video_demo/js/verto-min.js +++ b/html5/verto/video_demo/js/verto-min.js @@ -117,7 +117,8 @@ for(i=0;i-1){dt.fnClearTable();dt.fnAddData(obj.asArray());}else{dt.fnAddData(args.data);} dt.fnAdjustColumnSizing();break;case"modify":if(!args.data){return;} dt.fnUpdate(args.data,index);dt.fnAdjustColumnSizing();break;case"del":dt.fnDeleteRow(index);dt.fnAdjustColumnSizing();break;case"clear":dt.fnClearTable();break;case"reorder":dt.fnClearTable();dt.fnAddData(obj.asArray());break;case"hide":jq.hide();break;case"show":jq.show();break;}}catch(err){console.error("ERROR: "+err);iserr++;} -if(iserr){obj.errs++;if(obj.errs<3){obj.bootstrap(obj.user_obj);}}else{obj.errs=0;}};la.onChange(la,{action:"init"});};var CONFMAN_SERNO=1;$.verto.confMan=function(verto,params){var confMan=this;confMan.params=$.extend({tableID:null,statusID:null,mainModID:null,dialog:null,hasVid:false,laData:null,onBroadcast:null,onLaChange:null,onLaRow:null},params);confMan.verto=verto;confMan.serno=CONFMAN_SERNO++;function genMainMod(jq){var play_id="play_"+confMan.serno;var stop_id="stop_"+confMan.serno;var recording_id="recording_"+confMan.serno;var snapshot_id="snapshot_"+confMan.serno;var rec_stop_id="recording_stop"+confMan.serno;var div_id="confman_"+confMan.serno;var html="

"+""+""+""+""+ -(confMan.params.hasVid?"":"")+"

";jq.html(html);if(confMan.params.hasVid){var vlayout_id="confman_vid_layout_"+confMan.serno;var vlselect_id="confman_vl_select_"+confMan.serno;var vlhtml="

"+"Video Layout "+"

";jq.append(vlhtml);$("#"+vlselect_id).change(function(){var val=$("#"+vlselect_id).find(":selected").val();if(val!=="none"){confMan.modCommand("vid-layout",null,val);}});$("#"+snapshot_id).click(function(){var file=prompt("Please enter file name","");if(file){confMan.modCommand("vid-write-png",null,file);}});} +if(iserr){obj.errs++;if(obj.errs<3){obj.bootstrap(obj.user_obj);}}else{obj.errs=0;}};la.onChange(la,{action:"init"});};var CONFMAN_SERNO=1;$.verto.modfuncs={};$.verto.confMan=function(verto,params){var confMan=this;confMan.params=$.extend({tableID:null,statusID:null,mainModID:null,dialog:null,hasVid:false,laData:null,onBroadcast:null,onLaChange:null,onLaRow:null},params);confMan.verto=verto;confMan.serno=CONFMAN_SERNO++;confMan.canvasCount=confMan.params.laData.canvasCount;function genMainMod(jq){var play_id="play_"+confMan.serno;var stop_id="stop_"+confMan.serno;var recording_id="recording_"+confMan.serno;var snapshot_id="snapshot_"+confMan.serno;var rec_stop_id="recording_stop"+confMan.serno;var div_id="confman_"+confMan.serno;var html="

"+""+""+""+""+ +(confMan.params.hasVid?"":"")+"

";jq.html(html);$.verto.modfuncs.change_video_layout=function(id,canvas_id){var val=$("#"+id+" option:selected").text();if(val!=="none"){confMan.modCommand("vid-layout",null,[val,canvas_id]);}};if(confMan.params.hasVid){for(var j=0;j
"+"Video Layout Canvas "+(j+1)+" "+"

";jq.append(vlhtml);} +$("#"+snapshot_id).click(function(){var file=prompt("Please enter file name","");if(file){confMan.modCommand("vid-write-png",null,file);}});} $("#"+play_id).click(function(){var file=prompt("Please enter file name","");if(file){confMan.modCommand("play",null,file);}});$("#"+stop_id).click(function(){confMan.modCommand("stop",null,"all");});$("#"+recording_id).click(function(){var file=prompt("Please enter file name","");if(file){confMan.modCommand("recording",null,["start",file]);}});$("#"+rec_stop_id).click(function(){confMan.modCommand("recording",null,["stop","all"]);});} -function genControls(jq,rowid){var x=parseInt(rowid);var kick_id="kick_"+x;var tmute_id="tmute_"+x;var tvmute_id="tvmute_"+x;var vbanner_id="vbanner_"+x;var tvpresenter_id="tvpresenter_"+x;var tvfloor_id="tvfloor_"+x;var box_id="box_"+x;var volup_id="volume_in_up"+x;var voldn_id="volume_in_dn"+x;var transfer_id="transfer"+x;var html="
"+""+""+ -(confMan.params.hasVid?"":"")+ -(confMan.params.hasVid?"":"")+ -(confMan.params.hasVid?"":"")+ -(confMan.params.hasVid?"":"")+""+""+""+"
";jq.html(html);if(!jq.data("mouse")){$("#"+box_id).hide();} -jq.mouseover(function(e){jq.data({"mouse":true});$("#"+box_id).show();});jq.mouseout(function(e){jq.data({"mouse":false});$("#"+box_id).hide();});$("#"+transfer_id).click(function(){var xten=prompt("Enter Extension");if(xten){confMan.modCommand("transfer",x,xten);}});$("#"+kick_id).click(function(){confMan.modCommand("kick",x);});$("#"+tmute_id).click(function(){confMan.modCommand("tmute",x);});if(confMan.params.hasVid){$("#"+tvmute_id).click(function(){confMan.modCommand("tvmute",x);});$("#"+tvpresenter_id).click(function(){confMan.modCommand("vid-res-id",x,"presenter");});$("#"+tvfloor_id).click(function(){confMan.modCommand("vid-floor",x,"force");});$("#"+vbanner_id).click(function(){var text=prompt("Please enter text","");if(text){confMan.modCommand("vid-banner",x,escape(text));}});} +function genControls(jq,rowid){var x=parseInt(rowid);var kick_id="kick_"+x;var canvas_in_next_id="canvas_in_next_"+x;var canvas_in_prev_id="canvas_in_prev_"+x;var canvas_out_next_id="canvas_out_next_"+x;var canvas_out_prev_id="canvas_out_prev_"+x;var canvas_in_set_id="canvas_in_set_"+x;var canvas_out_set_id="canvas_out_set_"+x;var layer_set_id="layer_set_"+x;var layer_next_id="layer_next_"+x;var layer_prev_id="layer_prev_"+x;var tmute_id="tmute_"+x;var tvmute_id="tvmute_"+x;var vbanner_id="vbanner_"+x;var tvpresenter_id="tvpresenter_"+x;var tvfloor_id="tvfloor_"+x;var box_id="box_"+x;var volup_id="volume_in_up"+x;var voldn_id="volume_in_dn"+x;var transfer_id="transfer"+x;var html="
";html+="General Controls
";html+=""+""+""+""+"";if(confMan.params.hasVid){html+="

Video Controls
";html+=""+""+""+"";if(confMan.canvasCount>1){html+="

Canvas Controls
"+""+""+""+"
"+""+""+"";} +html+="
"+""+""+""+"
";} +jq.html(html);if(!jq.data("mouse")){$("#"+box_id).hide();} +jq.mouseover(function(e){jq.data({"mouse":true});$("#"+box_id).show();});jq.mouseout(function(e){jq.data({"mouse":false});$("#"+box_id).hide();});$("#"+transfer_id).click(function(){var xten=prompt("Enter Extension");if(xten){confMan.modCommand("transfer",x,xten);}});$("#"+kick_id).click(function(){confMan.modCommand("kick",x);});$("#"+layer_set_id).click(function(){var cid=prompt("Please enter layer ID","");if(cid){confMan.modCommand("vid-layer",x,cid);}});$("#"+layer_next_id).click(function(){confMan.modCommand("vid-layer",x,"next");});$("#"+layer_prev_id).click(function(){confMan.modCommand("vid-layer",x,"prev");});$("#"+canvas_in_set_id).click(function(){var cid=prompt("Please enter canvas ID","");if(cid){confMan.modCommand("vid-canvas",x,cid);}});$("#"+canvas_out_set_id).click(function(){var cid=prompt("Please enter canvas ID","");if(cid){confMan.modCommand("vid-watching-canvas",x,cid);}});$("#"+canvas_in_next_id).click(function(){confMan.modCommand("vid-canvas",x,"next");});$("#"+canvas_in_prev_id).click(function(){confMan.modCommand("vid-canvas",x,"prev");});$("#"+canvas_out_next_id).click(function(){confMan.modCommand("vid-watching-canvas",x,"next");});$("#"+canvas_out_prev_id).click(function(){confMan.modCommand("vid-watching-canvas",x,"prev");});$("#"+tmute_id).click(function(){confMan.modCommand("tmute",x);});if(confMan.params.hasVid){$("#"+tvmute_id).click(function(){confMan.modCommand("tvmute",x);});$("#"+tvpresenter_id).click(function(){confMan.modCommand("vid-res-id",x,"presenter");});$("#"+tvfloor_id).click(function(){confMan.modCommand("vid-floor",x,"force");});$("#"+vbanner_id).click(function(){var text=prompt("Please enter text","");if(text){confMan.modCommand("vid-banner",x,escape(text));}});} $("#"+volup_id).click(function(){confMan.modCommand("volume_in",x,"up");});$("#"+voldn_id).click(function(){confMan.modCommand("volume_in",x,"down");});return html;} -var atitle="";var awidth=0;if(confMan.params.laData.role==="moderator"){atitle="Action";awidth=300;if(confMan.params.mainModID){genMainMod($(confMan.params.mainModID));$(confMan.params.displayID).html("Moderator Controls Ready

");}else{$(confMan.params.mainModID).html("");} +var atitle="";var awidth=0;if(confMan.params.laData.role==="moderator"){atitle="Action";awidth=600;if(confMan.params.mainModID){genMainMod($(confMan.params.mainModID));$(confMan.params.displayID).html("Moderator Controls Ready

");}else{$(confMan.params.mainModID).html("");} verto.subscribe(confMan.params.laData.modChannel,{handler:function(v,e){if(confMan.params.onBroadcast){confMan.params.onBroadcast(verto,confMan,e.data);} -if(e.data["conf-command"]==="list-videoLayouts"){var vlselect_id="#confman_vl_select_"+confMan.serno;var vlayout_id="#confman_vid_layout_"+confMan.serno;var x=0;var options;$(vlselect_id).selectmenu({});$(vlselect_id).selectmenu("enable");$(vlselect_id).empty();$(vlselect_id).append(new Option("Choose a Layout","none"));if(e.data.responseData){options=e.data.responseData.sort();for(var i in options){$(vlselect_id).append(new Option(options[i],options[i]));x++;}} -if(x){$(vlselect_id).selectmenu('refresh',true);}else{$(vlayout_id).hide();}}else{if(!confMan.destroyed&&confMan.params.displayID){$(confMan.params.displayID).html(e.data.response+"

");if(confMan.lastTimeout){clearTimeout(confMan.lastTimeout);confMan.lastTimeout=0;} +if(e.data["conf-command"]==="list-videoLayouts"){for(var j=0;j
");if(confMan.lastTimeout){clearTimeout(confMan.lastTimeout);confMan.lastTimeout=0;} confMan.lastTimeout=setTimeout(function(){$(confMan.params.displayID).html(confMan.destroyed?"":"Moderator Controls Ready

");},4000);}}}});if(confMan.params.hasVid){confMan.modCommand("list-videoLayouts",null,null);}} var row_callback=null;if(confMan.params.laData.role==="moderator"){row_callback=function(nRow,aData,iDisplayIndex,iDisplayIndexFull){if(!aData[5]){var $row=$('td:eq(5)',nRow);genControls($row,aData);if(confMan.params.onLaRow){confMan.params.onLaRow(verto,confMan,$row,aData);}}};} -confMan.lt=new $.verto.liveTable(verto,confMan.params.laData.laChannel,confMan.params.laData.laName,$(confMan.params.tableID),{subParams:{callID:confMan.params.dialog?confMan.params.dialog.callID:null},"onChange":function(obj,args){$(confMan.params.statusID).text("Conference Members: "+" ("+obj.arrayLen()+" Total)");if(confMan.params.onLaChange){confMan.params.onLaChange(verto,confMan,$.verto.enum.confEvent.laChange,obj,args);}},"aaData":[],"aoColumns":[{"sTitle":"ID"},{"sTitle":"Number"},{"sTitle":"Name"},{"sTitle":"Codec"},{"sTitle":"Status","sWidth":confMan.params.hasVid?"200px":"150px"},{"sTitle":atitle,"sWidth":awidth,}],"bAutoWidth":true,"bDestroy":true,"bSort":false,"bInfo":false,"bFilter":false,"bLengthChange":false,"bPaginate":false,"iDisplayLength":1000,"oLanguage":{"sEmptyTable":"The Conference is Empty....."},"fnRowCallback":row_callback});};$.verto.confMan.prototype.modCommand=function(cmd,id,value){var confMan=this;confMan.verto.rpcClient.call("verto.broadcast",{"eventChannel":confMan.params.laData.modChannel,"data":{"application":"conf-control","command":cmd,"id":id,"value":value}});};$.verto.confMan.prototype.destroy=function(){var confMan=this;confMan.destroyed=true;if(confMan.lt){confMan.lt.destroy();} +confMan.lt=new $.verto.liveTable(verto,confMan.params.laData.laChannel,confMan.params.laData.laName,$(confMan.params.tableID),{subParams:{callID:confMan.params.dialog?confMan.params.dialog.callID:null},"onChange":function(obj,args){$(confMan.params.statusID).text("Conference Members: "+" ("+obj.arrayLen()+" Total)");if(confMan.params.onLaChange){confMan.params.onLaChange(verto,confMan,$.verto.enum.confEvent.laChange,obj,args);}},"aaData":[],"aoColumns":[{"sTitle":"ID","sWidth":"50"},{"sTitle":"Number","sWidth":"250"},{"sTitle":"Name","sWidth":"250"},{"sTitle":"Codec","sWidth":"100"},{"sTitle":"Status","sWidth":confMan.params.hasVid?"200px":"150px"},{"sTitle":atitle,"sWidth":awidth,}],"bAutoWidth":true,"bDestroy":true,"bSort":false,"bInfo":false,"bFilter":false,"bLengthChange":false,"bPaginate":false,"iDisplayLength":1400,"oLanguage":{"sEmptyTable":"The Conference is Empty....."},"fnRowCallback":row_callback});};$.verto.confMan.prototype.modCommand=function(cmd,id,value){var confMan=this;confMan.verto.rpcClient.call("verto.broadcast",{"eventChannel":confMan.params.laData.modChannel,"data":{"application":"conf-control","command":cmd,"id":id,"value":value}});};$.verto.confMan.prototype.destroy=function(){var confMan=this;confMan.destroyed=true;if(confMan.lt){confMan.lt.destroy();} if(confMan.params.laData.modChannel){confMan.verto.unsubscribe(confMan.params.laData.modChannel);} if(confMan.params.mainModID){$(confMan.params.mainModID).html("");}};$.verto.dialog=function(direction,verto,params){var dialog=this;dialog.params=$.extend({useVideo:verto.options.useVideo,useStereo:verto.options.useStereo,screenShare:false,useCamera:"any",useMic:"any",tag:verto.options.tag,localTag:verto.options.localTag,login:verto.options.login,videoParams:verto.options.videoParams},params);dialog.verto=verto;dialog.direction=direction;dialog.lastState=null;dialog.state=dialog.lastState=$.verto.enum.state.new;dialog.callbacks=verto.callbacks;dialog.answered=false;dialog.attach=params.attach||false;dialog.screenShare=params.screenShare||false;dialog.useCamera=params.useCamera;dialog.useMic=params.useMic;if(dialog.params.callID){dialog.callID=dialog.params.callID;}else{dialog.callID=dialog.params.callID=generateGUID();} if(dialog.params.tag){dialog.audioStream=document.getElementById(dialog.params.tag);if(dialog.params.useVideo){dialog.videoStream=dialog.audioStream;}} @@ -237,12 +237,14 @@ if(!msg.body){console.error("Missing Body");err++;} if(err){return false;} dialog.sendMethod("verto.info",{msg:msg});return true;};$.verto.dialog.prototype.answer=function(params){var dialog=this;if(!dialog.answered){if(!params){params={};} params.sdp=dialog.params.sdp;if(params){if(params.useVideo){dialog.useVideo(true);} -dialog.params.callee_id_name=params.callee_id_name;dialog.params.callee_id_number=params.callee_id_number;} +dialog.params.callee_id_name=params.callee_id_name;dialog.params.callee_id_number=params.callee_id_number;dialog.useCamera=params.useCamera;dialog.useMic=params.useMic;} dialog.rtc.createAnswer(params);dialog.answered=true;}};$.verto.dialog.prototype.handleAnswer=function(params){var dialog=this;dialog.gotAnswer=true;if(dialog.state.val>=$.verto.enum.state.active.val){return;} if(dialog.state.val>=$.verto.enum.state.early.val){dialog.setState($.verto.enum.state.active);}else{if(dialog.gotEarly){console.log("Dialog "+dialog.callID+" Got answer while still establishing early media, delaying...");}else{console.log("Dialog "+dialog.callID+" Answering Channel");dialog.rtc.answer(params.sdp,function(){dialog.setState($.verto.enum.state.active);},function(e){console.error(e);dialog.hangup();});console.log("Dialog "+dialog.callID+"ANSWER SDP",params.sdp);}}};$.verto.dialog.prototype.cidString=function(enc){var dialog=this;var party=dialog.params.remote_caller_id_name+(enc?" <":" <")+dialog.params.remote_caller_id_number+(enc?">":">");return party;};$.verto.dialog.prototype.sendMessage=function(msg,params){var dialog=this;if(dialog.callbacks.onMessage){dialog.callbacks.onMessage(dialog.verto,dialog,msg,params);}};$.verto.dialog.prototype.handleInfo=function(params){var dialog=this;dialog.sendMessage($.verto.enum.message.info,params.msg);};$.verto.dialog.prototype.handleDisplay=function(params){var dialog=this;if(params.display_name){dialog.params.remote_caller_id_name=params.display_name;} if(params.display_number){dialog.params.remote_caller_id_number=params.display_number;} dialog.sendMessage($.verto.enum.message.display,{});};$.verto.dialog.prototype.handleMedia=function(params){var dialog=this;if(dialog.state.val>=$.verto.enum.state.early.val){return;} -dialog.gotEarly=true;dialog.rtc.answer(params.sdp,function(){console.log("Dialog "+dialog.callID+"Establishing early media");dialog.setState($.verto.enum.state.early);if(dialog.gotAnswer){console.log("Dialog "+dialog.callID+"Answering Channel");dialog.setState($.verto.enum.state.active);}},function(e){console.error(e);dialog.hangup();});console.log("Dialog "+dialog.callID+"EARLY SDP",params.sdp);};$.verto.ENUM=function(s){var i=0,o={};s.split(" ").map(function(x){o[x]={name:x,val:i++};});return Object.freeze(o);};$.verto.enum={};$.verto.enum.states=Object.freeze({new:{requesting:1,recovering:1,ringing:1,destroy:1,answering:1,hangup:1},requesting:{trying:1,hangup:1},recovering:{answering:1,hangup:1},trying:{active:1,early:1,hangup:1},ringing:{answering:1,hangup:1},answering:{active:1,hangup:1},active:{answering:1,requesting:1,hangup:1,held:1},held:{hangup:1,active:1},early:{hangup:1,active:1},hangup:{destroy:1},destroy:{},purge:{destroy:1}});$.verto.enum.state=$.verto.ENUM("new requesting trying recovering ringing answering early active held hangup destroy purge");$.verto.enum.direction=$.verto.ENUM("inbound outbound");$.verto.enum.message=$.verto.ENUM("display info pvtEvent");$.verto.enum=Object.freeze($.verto.enum);$.verto.saved=[];$(window).bind('beforeunload',function(){for(var i in $.verto.saved){var verto=$.verto.saved[i];if(verto){verto.purge();verto.logout();}} +dialog.gotEarly=true;dialog.rtc.answer(params.sdp,function(){console.log("Dialog "+dialog.callID+"Establishing early media");dialog.setState($.verto.enum.state.early);if(dialog.gotAnswer){console.log("Dialog "+dialog.callID+"Answering Channel");dialog.setState($.verto.enum.state.active);}},function(e){console.error(e);dialog.hangup();});console.log("Dialog "+dialog.callID+"EARLY SDP",params.sdp);};$.verto.ENUM=function(s){var i=0,o={};s.split(" ").map(function(x){o[x]={name:x,val:i++};});return Object.freeze(o);};$.verto.enum={};$.verto.enum.states=Object.freeze({new:{requesting:1,recovering:1,ringing:1,destroy:1,answering:1,hangup:1},requesting:{trying:1,hangup:1},recovering:{answering:1,hangup:1},trying:{active:1,early:1,hangup:1},ringing:{answering:1,hangup:1},answering:{active:1,hangup:1},active:{answering:1,requesting:1,hangup:1,held:1},held:{hangup:1,active:1},early:{hangup:1,active:1},hangup:{destroy:1},destroy:{},purge:{destroy:1}});$.verto.enum.state=$.verto.ENUM("new requesting trying recovering ringing answering early active held hangup destroy purge");$.verto.enum.direction=$.verto.ENUM("inbound outbound");$.verto.enum.message=$.verto.ENUM("display info pvtEvent");$.verto.enum=Object.freeze($.verto.enum);$.verto.saved=[];$.verto.unloadJobs=[];$(window).bind('beforeunload',function(){for(var f in $.verto.unloadJobs){$.verto.unloadJobs[f]();} +for(var i in $.verto.saved){var verto=$.verto.saved[i];if(verto){verto.purge();verto.logout();}} return $.verto.warnOnUnload;});$.verto.videoDevices=[];$.verto.audioDevices=[];var checkDevices=function(runtime){console.info("enumerating devices");var aud=[],vid=[];if(MediaStreamTrack.getSources){MediaStreamTrack.getSources(function(media_sources){for(var i=0;i $(window).width()) { + if ($("#" + video_screen).width() > $(window).width()) { //resize(false); - $("#webcam").width("100%"); - $("#webcam").height("100%"); + $("#" + video_screen).width("100%"); + $("#" + video_screen).height("100%"); } }); function resize(up) { - var width = $("#webcam").width(); - var height = $("#webcam").height(); + var width = $("#" + video_screen).width(); + var height = $("#" + video_screen).height(); if (up) { - $("#webcam").width(width * 1.20); - $("#webcam").height(height * 1.20); + $("#" + video_screen).width(width * 1.20); + $("#" + video_screen).height(height * 1.20); } else { - $("#webcam").width(width * .80); - $("#webcam").height(height * .80); + $("#" + video_screen).width(width * .80); + $("#" + video_screen).height(height * .80); } - console.log("video size changed to " + $("#webcam").width() + "x" + $("#webcam").height()); + console.log("video size changed to " + $("#" + video_screen).width() + "x" + $("#" + video_screen).height()); } function real_size() { - $("#webcam").width(""); - $("#webcam").height(""); + $("#" + video_screen).width(""); + $("#" + video_screen).height(""); console.log("video size changed to natural default"); @@ -253,24 +261,88 @@ var callbacks = { case "conference-liveArray-part": clearConfMan(); + if (data.pvtData.secondScreen) { + $("#mainButtons").show(); + $("#canvasButtons").hide(); + $("#keypad").show(); + } break; case "conference-liveArray-join": clearConfMan(); - confMan = new $.verto.confMan(verto, { - tableID: "#conf_list", - statusID: "#conf_count", - mainModID: "#conf_mod", - displayID: "#conf_display", - dialog: dialog, - hasVid: check_vid(), - laData: data.pvtData - }); - $("#conf").show(); - $("#chatwin").html(""); - $("#message").show(); + if (data.pvtData.secondScreen) { + $("#mainButtons").hide(); + $("#canvasButtons").show(); + $("#keypad").hide(); + } else { + confMan = new $.verto.confMan(verto, { + tableID: "#conf_list", + statusID: "#conf_count", + mainModID: "#conf_mod", + displayID: "#conf_display", + dialog: dialog, + hasVid: check_vid(), + laData: data.pvtData + }); - chatting_with = data.pvtData.chatID; + if (!data.pvtData.canvasCount) { + data.pvtData.canvasCount = 1; + } + + var canvasCount = data.pvtData.canvasCount + 0; + + if (canvasCount <= 1) { + $("#canvasui").hide(); + } if (canvasCount > 1) { + $("#canvasui").show(); + $("#canvasid").selectmenu({}); + $("#canvasid").selectmenu("enable"); + $("#canvasid").empty(); + + var x; + + for (x = 1; x < canvasCount; x++) { + $("#canvasid").append(new Option("Canvas " + (x + 1), (x + 1))); + } + + $("#canvasid").append(new Option("Super Canvas", x + 1)); + + $("#canvasid").selectmenu('refresh', true); + + $("#canvasbut").click(function() { + var canvas_id = $("#canvasid").find(":selected").val(); + var s = window.location.href; + s = s.replace(/\#.*/,''); + s += "#sessid=random&master=" + cur_call.callID + + "&secondScreen=true&canvas_id=" + canvas_id + "&autocall=" + $("#ext").val() + "-canvas-" + canvas_id; + console.log("opening new window to " + s); + window.open(s, "canvas_window_" + canvas_id, "toolbar=0,location=0,menubar=0,directories=0,width=" + ($("#" + video_screen).width() + 50) + ",height=" + ($("#" + video_screen).height() + 400)); + }); + } + + $("#conf").show(); + $("#chatwin").html(""); + + if (data.pvtData.hipchatURL) { + var namex = $("#cidname").val(); + + if (!namex.indexOf(" ") > 0) { + namex += " " + $("#cid").val(); + } + + var name = namex.replace(/ /i, '%20'); + + $('#hcmessage').hipChatPanel({ + url: data.pvtData.hipchatURL + "?name=" + name, + timezone: "CST" + }); + $("#hctop").show().find('.show-hipchat').click(); + } else { + $("#message").show(); + } + + chatting_with = data.pvtData.chatID; + } break; } @@ -402,17 +474,38 @@ var callbacks = { break; case $.verto.enum.state.early: case $.verto.enum.state.active: - display("Talking to: " + d.cidString()); + if (sessid) { + cur_call.setMute("on"); + display("Viewing Canvas: " + canvas_id); + + verto.subscribe("presence", { + handler: function(v, e) { + if (e.data.channelUUID === master && e.data.channelCallState === "HANGUP") { + cur_call.hangup(); + } + } + }); + + } else { + display("Talking to: " + d.cidString()); + } goto_page("incall"); break; case $.verto.enum.state.hangup: $("#main_info").html("Call ended with cause: " + d.cause); goto_page("main"); + exit_full_screen(); case $.verto.enum.state.destroy: $("#hangup_cause").html(""); clearConfMan(); real_size(); cur_call = null; + if (sessid) { + setTimeout(function() { + delete $.verto.warnOnUnload; + window.close(); + }, 500); + } break; case $.verto.enum.state.held: break; @@ -458,6 +551,10 @@ var callbacks = { var today = new Date(); $("#errordisplay").html("Connection Error.
Last Attempt: " + today); goto_page("main"); + + if (sessid) { + window.close(); + } }, onEvent: function(v, e) { @@ -511,6 +608,12 @@ $("#hupbtn").click(function() { cur_call = null; }); +$("#hupbtn2").click(function() { + delete $.verto.warnOnUnload; + verto.hangup(); + cur_call = null; +}); + $("#mutebtn").click(function() { cur_call.dtmf("0"); }); @@ -542,19 +645,23 @@ function on_full(which) clearTimeout(rs); $("#usr2").hide(); rs = setTimeout(function() { - $("#webcam").width($(window).width()); - $("#webcam").height($(window).height()); + $("#" + video_screen).width($(window).width()); + $("#" + video_screen).height($(window).height()); }, 1500); $("#rows").css("position", "absolute").css("z-index", "2"); $("#fullbtn").text("Exit Full Screen"); + $("#fullbtn2").text("Exit Full Screen"); + $("#usrctl").show(); } else { + $("#usrctl").hide(); $("#rows").css("position", "static").css("z-index", "2"); $("#fullbtn").text("Enter Full Screen"); + $("#fullbtn2").text("Enter Full Screen"); clearTimeout(usrto); clearTimeout(rs); rs = setTimeout(function() { - $("#webcam").width("100%"); - $("#webcam").height("100%"); + $("#" + video_screen).width("100%"); + $("#" + video_screen).height("100%"); }, 1500); } @@ -587,10 +694,15 @@ $("#fullbtn").click(function() { } else { exit_full_screen(); } +}); +$("#fullbtn2").click(function() { -// $("#mod1").css("position", "absolute").css("z-index", "2"); - + if (!is_full) { + full_screen("fs"); + } else { + exit_full_screen(); + } }); $("#biggerbtn").click(function() { @@ -601,7 +713,7 @@ $("#smallerbtn").click(function() { resize(false); }); -$("#webcam").click(function() { +$("#" + video_screen).click(function() { check_vid(); }); @@ -624,10 +736,14 @@ function docall() { incomingBandwidth: incomingBandwidth, useVideo: check_vid(), useStereo: $("#use_stereo").is(':checked'), - useCamera: $("#usecamera").find(":selected").val(), + useCamera: sessid ? "none" : $("#usecamera").find(":selected").val(), useMic: $("#usemic").find(":selected").val(), dedEnc: $("#use_dedenc").is(':checked'), - mirrorInput: $("#mirror_input").is(':checked') + mirrorInput: $("#mirror_input").is(':checked'), + userVariables: { + avatar: $("#avatar").val(), + email: $("#email").val(), + }, }); } @@ -727,13 +843,29 @@ function pop(id, cname, dft) { $.cookie(cname, tmp, { expires: 365 }); + $(id).val(tmp).change(function() { + if (!save_settings) return; + $.cookie(cname, $(id).val(), { expires: 365 }); }); } +function pop_select(id, cname, dft) { + var tmp = $.cookie(cname) || dft; + $.cookie(cname, tmp, { + expires: 365 + }); + // $("#usecamera").find(":selected").val() + $(id).change(function() { + tmp = $(id).find(":selected").val(); + $.cookie(cname, tmp, { + expires: 365 + }); + }); +} function refresh_devices() @@ -756,6 +888,7 @@ function refresh_devices() var x = 0; $("#usecamera").append(new Option("No Camera", "none")); + $("#usemic").append(new Option("Do Not Specify", "any")); for (var i in $.verto.videoDevices) { var source = $.verto.videoDevices[i]; var o = new Option(source.label, source.id); @@ -772,7 +905,7 @@ function refresh_devices() $("#useshare").append(oo); } - x = 0; + x = 1; for (var i in $.verto.audioDevices) { var source = $.verto.audioDevices[i]; @@ -799,10 +932,24 @@ function refresh_devices() $("input[type='checkbox']").checkboxradio("refresh"); //console.error($("#usecamera").find(":selected").val()); + + var tmp; + tmp = $.cookie("verto_demo_camera_selected") || "false"; + if (tmp) { + $('#usecamera option[value=' + tmp + ']').prop('selected', 'selected').change(); + pop_select("#usecamera","verto_demo_camera_selected", tmp); + } + + tmp = $.cookie("verto_demo_mic_selected") || "false"; + if (tmp) { + $('#usemic option[value=' + tmp + ']').prop('selected', 'selected').change(); + pop_select("#usemic","verto_demo_mic_selected", tmp); + } } function init() { cur_call = null; + goto_page("main"); $("#usecamera").selectmenu({}); $("#usemic").selectmenu({}); @@ -812,8 +959,10 @@ function init() { pop("#ext", "verto_demo_ext", "3500"); } + pop("#avatar", "verto_demo_avatar", ""); pop("#cidname", "verto_demo_name", "FreeSWITCH User"); pop("#cid", "verto_demo_cid", "1008"); + pop("#email", "verto_demo_email", ""); pop("#textto", "verto_demo_textto", "1000"); pop("#login", "verto_demo_login", "1008"); @@ -1146,9 +1295,6 @@ function init() { $.cookie("verto_demo_local_video_checked", tmp ? "true" : "false", { expires: 365 }); - if (verto) { - verto.iceServers(tmp); - } }); check_vid_res(); @@ -1157,10 +1303,11 @@ function init() { login: $("#login").val() + "@" + $("#hostName").val(), passwd: $("#passwd").val(), socketUrl: $("#wsURL").val(), - tag: "webcam", + tag: video_screen, //localTag: $("#local_video").is(':checked') ? "local_webcam" : null, ringFile: "sounds/bell_ring2.wav", - loginParams: {foo: true, bar: "yes"}, + sessid: sessid, + //loginParams: {second_screen: second_screen}, videoParams: { "minWidth": vid_width, "minHeight": vid_height, @@ -1171,6 +1318,11 @@ function init() { //chromeMediaSource: 'screen', //mediaSource: 'screen' }, + + deviceParams: { + useCamera: $("#usecamera").find(":selected").val(), useMic: $("#usemic").find(":selected").val() + }, + // audioParams: { // googAutoGainControl: false, // googNoiseSuppression: false, @@ -1181,6 +1333,55 @@ function init() { },callbacks); + function handleEmailResponse(resp) { + for (var i=0; i < resp.emails.length; i++) { + if (resp.emails[i].type === 'account' && resp.emails[i].value) { + $("#email").val(resp.emails[i].value); + $("#email").change(); + } + } + + if (resp.displayName) { + $("#cidname").val(resp.displayName); + $("#cidname").trigger("change"); + } + + $("#avatar").val(resp.image.url + "0"); + $("#avatar").trigger("change"); + + gapi.auth.signOut(); + } + + $("#signinButton").click(function() { + gapi.auth.signIn({callback: function(authResult) { + console.log('Sign-in state: ' + authResult['error']); + if (authResult['status']['signed_in']) { + // Update the app to reflect a signed in user + // Hide the sign-in button now that the user is authorized, for example: + //document.getElementById('signinButton').setAttribute('style', 'display: none'); + gapi.client.load('plus','v1', function(){ + var request = gapi.client.plus.people.get({userId: 'me'}).execute(handleEmailResponse); + }); + } else { + // Update the app to reflect a signed out user + // Possible error values: + // "user_signed_out" - User is signed-out + // "access_denied" - User denied access to your app + // "immediate_failed" - Could not automatically log in the user + console.log('Sign-in state: ' + authResult['error']); + } + + }}); + }); + + $("#email").change(function(e) { + $("#avatar").val("http://gravatar.com/avatar/" + md5($("#emailaddr").val()) + ".png?s=600"); + $.cookie("verto_demo_email", e.currentTarget.value, { + expires: 365 + }); + + }); + $("#login").change(function(e) { $("#cid").val(e.currentTarget.value); $.cookie("verto_demo_cid", e.currentTarget.value, { @@ -1199,6 +1400,7 @@ function init() { $("#logoutbtn").click(function() { verto.logout(); online(false); + $("#errordisplay").html(""); }); $("#loginbtn").click(function() { @@ -1212,7 +1414,7 @@ function init() { }); $("#xferdiv").hide(); -// $("#webcam").hide(); +// $("#" + video_screen).hide(); online(false); @@ -1245,18 +1447,48 @@ function init() { $(window).load(function() { var hash = window.location.hash.substring(1); var a = []; + var vars = []; if (hash && hash.indexOf("page-") == -1) { window.location.hash = ""; - $("#ext").val(hash); - autocall = true; + + if (vars = hash.split("&")) { + for (var i in vars) { + var v = vars[i]; + if (a = v.split("=")) { + var v_name = a[0]; + var v_val = a[1]; + + if (v_name === "sessid") { + sessid = v_val; + if (sessid === "random") { + sessid = $.verto.genUUID(); + } + save_settings = false; + $.verto.warnOnUnload = "WARNING: DO NOT RELOAD THIS PAGE! Please Close it Instead\n"; + $.verto.unloadJobs.push(function() { + exit_full_screen(); + verto.hangup(); + cur_call = null; + }); + } else if (v_name === "master") { + master = v_val; + } else if (v_name === "canvas_id") { + canvas_id = v_val; + } else if (v_name === "autocall") { + $("#ext").val(v_val); + autocall = true; + } + } + } + } } - if (hash && (a = hash.split("&"))) { - window.location.hash = a[0]; - } + //if (hash && (a = hash.split("&"))) { + // window.location.hash = a[0]; + // } - $("#webcam").hide(); + $("#" + video_screen).hide(); $("#camdiv").hide(); $('#demos').hide(); $('#devices').hide(); @@ -1283,8 +1515,11 @@ $(window).load(function() { } }); - - $.verto.init({}, init); + $("#search").show(); + goto_page("enum"); + setTimeout(function() { + $.verto.init({}, init); + }, 500); }); diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 598c8efe5e..5900c8deea 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -119,9 +119,11 @@ static int EC = 0; #define VIDEO_LAYOUT_SCALE 360.0f #define CONFERENCE_MUX_DEFAULT_LAYOUT "group:grid" +#define CONFERENCE_MUX_DEFAULT_SUPER_LAYOUT "grid" #define CONFERENCE_CANVAS_DEFAULT_WIDTH 1280 #define CONFERENCE_CANVAS_DEFAULT_HIGHT 720 - +#define MAX_CANVASES 20 +#define SUPER_CANVAS_ID MAX_CANVASES #define test_eflag(conference, flag) ((conference)->eflags & flag) typedef enum { @@ -148,13 +150,100 @@ static struct { struct conference_member; typedef struct conference_member conference_member_t; +struct caller_control_actions; + +typedef struct caller_control_actions { + char *binded_dtmf; + char *data; + char *expanded_data; +} caller_control_action_t; + +typedef struct caller_control_menu_info { + switch_ivr_menu_t *stack; + char *name; +} caller_control_menu_info_t; + +typedef enum { + MFLAG_RUNNING, + MFLAG_CAN_SPEAK, + MFLAG_CAN_HEAR, + MFLAG_KICKED, + MFLAG_ITHREAD, + MFLAG_NOCHANNEL, + MFLAG_INTREE, + MFLAG_NO_MINIMIZE_ENCODING, + MFLAG_FLUSH_BUFFER, + MFLAG_ENDCONF, + MFLAG_HAS_AUDIO, + MFLAG_TALKING, + MFLAG_RESTART, + MFLAG_MINTWO, + MFLAG_MUTE_DETECT, + MFLAG_DIST_DTMF, + MFLAG_MOD, + MFLAG_INDICATE_MUTE, + MFLAG_INDICATE_UNMUTE, + MFLAG_NOMOH, + MFLAG_VIDEO_BRIDGE, + MFLAG_INDICATE_MUTE_DETECT, + MFLAG_PAUSE_RECORDING, + MFLAG_ACK_VIDEO, + MFLAG_GHOST, + MFLAG_JOIN_ONLY, + MFLAG_POSITIONAL, + MFLAG_NO_POSITIONAL, + MFLAG_JOIN_VID_FLOOR, + MFLAG_RECEIVING_VIDEO, + MFLAG_CAN_BE_SEEN, + MFLAG_SECOND_SCREEN, + MFLAG_SILENT, + /////////////////////////// + MFLAG_MAX +} member_flag_t; + +typedef enum { + CFLAG_RUNNING, + CFLAG_DYNAMIC, + CFLAG_ENFORCE_MIN, + CFLAG_DESTRUCT, + CFLAG_LOCKED, + CFLAG_ANSWERED, + CFLAG_BRIDGE_TO, + CFLAG_WAIT_MOD, + CFLAG_VID_FLOOR, + CFLAG_WASTE_FLAG, + CFLAG_OUTCALL, + CFLAG_INHASH, + CFLAG_EXIT_SOUND, + CFLAG_ENTER_SOUND, + CFLAG_USE_ME, + CFLAG_AUDIO_ALWAYS, + CFLAG_ENDCONF_FORCED, + CFLAG_RFC4579, + CFLAG_FLOOR_CHANGE, + CFLAG_VID_FLOOR_LOCK, + CFLAG_JSON_EVENTS, + CFLAG_LIVEARRAY_SYNC, + CFLAG_CONF_RESTART_AUTO_RECORD, + CFLAG_POSITIONAL, + CFLAG_TRANSCODE_VIDEO, + CFLAG_VIDEO_MUXING, + CFLAG_MINIMIZE_VIDEO_ENCODING, + CFLAG_MANAGE_INBOUND_VIDEO_BITRATE, + CFLAG_JSON_STATUS, + CFLAG_VIDEO_BRIDGE_FIRST_TWO, + CFLAG_VIDEO_REQUIRED_FOR_CANVAS, + CFLAG_PERSONAL_CANVAS, + ///////////////////////////////// + CFLAG_MAX +} conference_flag_t; typedef struct conference_cdr_node_s { switch_caller_profile_t *cp; char *record_path; switch_time_t join_time; switch_time_t leave_time; - uint32_t flags; + member_flag_t mflags[MFLAG_MAX]; uint32_t id; conference_member_t *member; switch_event_t *var_event; @@ -188,84 +277,7 @@ struct call_list { }; typedef struct call_list call_list_t; -struct caller_control_actions; -typedef struct caller_control_actions { - char *binded_dtmf; - char *data; - char *expanded_data; -} caller_control_action_t; - -typedef struct caller_control_menu_info { - switch_ivr_menu_t *stack; - char *name; -} caller_control_menu_info_t; - -typedef enum { - MFLAG_RUNNING = (1 << 0), - MFLAG_CAN_SPEAK = (1 << 1), - MFLAG_CAN_HEAR = (1 << 2), - MFLAG_KICKED = (1 << 3), - MFLAG_ITHREAD = (1 << 4), - MFLAG_NOCHANNEL = (1 << 5), - MFLAG_INTREE = (1 << 6), - MFLAG_NO_MINIMIZE_ENCODING = (1 << 7), - MFLAG_FLUSH_BUFFER = (1 << 8), - MFLAG_ENDCONF = (1 << 9), - MFLAG_HAS_AUDIO = (1 << 10), - MFLAG_TALKING = (1 << 11), - MFLAG_RESTART = (1 << 12), - MFLAG_MINTWO = (1 << 13), - MFLAG_MUTE_DETECT = (1 << 14), - MFLAG_DIST_DTMF = (1 << 15), - MFLAG_MOD = (1 << 16), - MFLAG_INDICATE_MUTE = (1 << 17), - MFLAG_INDICATE_UNMUTE = (1 << 18), - MFLAG_NOMOH = (1 << 19), - MFLAG_VIDEO_BRIDGE = (1 << 20), - MFLAG_INDICATE_MUTE_DETECT = (1 << 21), - MFLAG_PAUSE_RECORDING = (1 << 22), - MFLAG_ACK_VIDEO = (1 << 23), - MFLAG_GHOST = (1 << 24), - MFLAG_JOIN_ONLY = (1 << 25), - MFLAG_POSITIONAL = (1 << 26), - MFLAG_NO_POSITIONAL = (1 << 27), - MFLAG_JOIN_VID_FLOOR = (1 << 28), - MFLAG_RECEIVING_VIDEO = (1 << 29), - MFLAG_CAN_BE_SEEN = (1 << 30) -} member_flag_t; - -typedef enum { - CFLAG_RUNNING = (1 << 0), - CFLAG_DYNAMIC = (1 << 1), - CFLAG_ENFORCE_MIN = (1 << 2), - CFLAG_DESTRUCT = (1 << 3), - CFLAG_LOCKED = (1 << 4), - CFLAG_ANSWERED = (1 << 5), - CFLAG_BRIDGE_TO = (1 << 6), - CFLAG_WAIT_MOD = (1 << 7), - CFLAG_VID_FLOOR = (1 << 8), - CFLAG_WASTE_FLAG = (1 << 9), - CFLAG_OUTCALL = (1 << 10), - CFLAG_INHASH = (1 << 11), - CFLAG_EXIT_SOUND = (1 << 12), - CFLAG_ENTER_SOUND = (1 << 13), - CFLAG_USE_ME = (1 << 14), - CFLAG_AUDIO_ALWAYS = (1 << 15), - CFLAG_ENDCONF_FORCED = (1 << 16), - CFLAG_RFC4579 = (1 << 17), - CFLAG_FLOOR_CHANGE = (1 << 18), - CFLAG_VID_FLOOR_LOCK = (1 << 19), - CFLAG_JSON_EVENTS = (1 << 20), - CFLAG_LIVEARRAY_SYNC = (1 << 21), - CFLAG_CONF_RESTART_AUTO_RECORD = (1 << 22), - CFLAG_POSITIONAL = (1 << 23), - CFLAG_TRANSCODE_VIDEO = (1 << 24), - CFLAG_VIDEO_MUXING = (1 << 25), - CFLAG_MINIMIZE_VIDEO_ENCODING = (1 << 26), - CFLAG_MANAGE_INBOUND_VIDEO_BITRATE = (1 << 27), - CFLAG_JSON_STATUS = (1 << 28) -} conf_flag_t; typedef enum { RFLAG_CAN_SPEAK = (1 << 0), @@ -335,6 +347,7 @@ typedef struct al_handle_s { switch_mutex_t *mutex; } al_handle_t; #endif +struct conference_obj; typedef struct conference_file_node { switch_file_handle_t fh; @@ -351,6 +364,8 @@ typedef struct conference_file_node { uint32_t member_id; al_handle_t *al; int layer_id; + int canvas_id; + struct conference_obj *conference; } conference_file_node_t; typedef enum { @@ -389,6 +404,8 @@ typedef struct mcu_layer_def_s { mcu_layer_geometry_t layers[MCU_MAX_LAYERS]; } mcu_layer_def_t; +struct mcu_canvas_s; + typedef struct mcu_layer_s { mcu_layer_geometry_t geometry; int member_id; @@ -401,6 +418,7 @@ typedef struct mcu_layer_s { int y_pos; int banner_patched; int mute_patched; + int avatar_patched; int refresh; int is_avatar; switch_img_position_t logo_pos; @@ -412,6 +430,7 @@ typedef struct mcu_layer_s { switch_image_t *mute_img; switch_img_txt_handle_t *txthandle; conference_file_node_t *fnode; + struct mcu_canvas_s *canvas; } mcu_layer_t; typedef struct video_layout_s { @@ -448,10 +467,14 @@ typedef struct mcu_canvas_s { switch_memory_pool_t *pool; video_layout_t *vlayout; video_layout_t *new_vlayout; + int canvas_id; + struct conference_obj *conference; + switch_thread_t *video_muxing_thread; + int video_timer_reset; + switch_queue_t *video_queue; + int32_t video_write_bandwidth; } mcu_canvas_t; -struct conference_obj; - /* Record Node */ typedef struct conference_record { struct conference_obj *conference; @@ -501,12 +524,12 @@ typedef struct conference_obj { char *video_layout_name; char *video_layout_group; char *video_canvas_bgcolor; + char *video_super_canvas_bgcolor; char *video_letterbox_bgcolor; char *no_video_avatar; conf_video_mode_t conf_video_mode; int members_with_video; - int video_timer_reset; - int32_t video_write_bandwidth; + int members_with_avatar; switch_codec_settings_t video_codec_settings; uint32_t canvas_width; uint32_t canvas_height; @@ -525,8 +548,8 @@ typedef struct conference_obj { char *caller_controls; char *moderator_controls; switch_live_array_t *la; - uint32_t flags; - member_flag_t mflags; + conference_flag_t flags[CFLAG_MAX]; + member_flag_t mflags[MFLAG_MAX]; switch_call_cause_t bridge_hangup_cause; switch_mutex_t *flag_mutex; uint32_t rate; @@ -588,8 +611,13 @@ typedef struct conference_obj { struct vid_helper mh; conference_record_t *rec_node_head; int last_speech_channels; - switch_thread_t *video_muxing_thread; mcu_canvas_t *canvas; + mcu_canvas_t *canvases[MAX_CANVASES+1]; + int canvas_count; + int super_canvas_label_layers; + int super_canvas_show_all_layers; + int canvas_running_count; + switch_mutex_t *canvas_mutex; switch_hash_t *layout_hash; switch_hash_t *layout_group_hash; struct conf_fps video_fps; @@ -615,7 +643,7 @@ struct conference_member { switch_buffer_t *audio_buffer; switch_buffer_t *mux_buffer; switch_buffer_t *resample_buffer; - uint32_t flags; + member_flag_t flags[MFLAG_MAX]; uint32_t score; uint32_t last_score; uint32_t score_iir; @@ -674,6 +702,8 @@ struct conference_member { al_handle_t *al; int last_speech_channels; int video_layer_id; + int canvas_id; + int watching_canvas_id; int video_codec_index; int video_codec_id; char *video_banner_text; @@ -691,6 +721,8 @@ struct conference_member { int good_img; int auto_avatar; int avatar_patched; + mcu_canvas_t *canvas; + switch_image_t *pcanvas_img; }; typedef enum { @@ -722,6 +754,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe static switch_status_t conference_del_member(conference_obj_t *conference, conference_member_t *member); static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *obj); static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thread, void *obj); +static void *SWITCH_THREAD_FUNC conference_super_video_muxing_thread_run(switch_thread_t *thread, void *obj); static void conference_loop_output(conference_member_t *member); static uint32_t conference_stop_file(conference_obj_t *conference, file_stop_t stop); static switch_status_t conference_play_file(conference_obj_t *conference, char *file, uint32_t leadin, switch_channel_t *channel, uint8_t async); @@ -733,19 +766,96 @@ static void member_bind_controls(conference_member_t *member, const char *contro static void conference_send_presence(conference_obj_t *conference); static void conference_set_video_floor_holder(conference_obj_t *conference, conference_member_t *member, switch_bool_t force); static void canvas_del_fnode_layer(conference_obj_t *conference, conference_file_node_t *fnode); -static void canvas_set_fnode_layer(conference_obj_t *conference, conference_file_node_t *fnode, int idx); +static void canvas_set_fnode_layer(mcu_canvas_t *canvas, conference_file_node_t *fnode, int idx); + + +static inline void conference_set_flag(conference_obj_t *conference, conference_flag_t flag) +{ + conference->flags[flag] = 1; +} +static inline void conference_set_flag_locked(conference_obj_t *conference, conference_flag_t flag) +{ + switch_mutex_lock(conference->flag_mutex); + conference->flags[flag] = 1; + switch_mutex_unlock(conference->flag_mutex); +} +static inline void conference_clear_flag(conference_obj_t *conference, conference_flag_t flag) +{ + conference->flags[flag] = 0; +} +static inline void conference_clear_flag_locked(conference_obj_t *conference, conference_flag_t flag) +{ + switch_mutex_lock(conference->flag_mutex); + conference->flags[flag] = 0; + switch_mutex_unlock(conference->flag_mutex); +} +static inline switch_bool_t conference_test_flag(conference_obj_t *conference, conference_flag_t flag) +{ + return !!conference->flags[flag]; +} +static inline void conference_set_mflag(conference_obj_t *conference, member_flag_t mflag) +{ + conference->mflags[mflag] = 1; +} +static inline void conference_clear_mflag(conference_obj_t *conference, member_flag_t mflag) +{ + conference->mflags[mflag] = 0; +} +static inline switch_bool_t conference_test_mflag(conference_obj_t *conference, member_flag_t mflag) +{ + return !!conference->mflags[mflag]; +} +static inline switch_bool_t cdr_test_mflag(conference_cdr_node_t *np, member_flag_t mflag) +{ + return !!np->mflags[mflag]; +} +static inline void member_set_flag(conference_member_t *member, member_flag_t flag) +{ + member->flags[flag] = 1; +} +static inline void member_set_flag_locked(conference_member_t *member, member_flag_t flag) +{ + switch_mutex_lock(member->flag_mutex); + member->flags[flag] = 1; + switch_mutex_unlock(member->flag_mutex); +} +static inline void member_clear_flag(conference_member_t *member, member_flag_t flag) +{ + member->flags[flag] = 0; +} +static inline void member_clear_flag_locked(conference_member_t *member, member_flag_t flag) +{ + switch_mutex_lock(member->flag_mutex); + member->flags[flag] = 0; + switch_mutex_unlock(member->flag_mutex); +} +static inline switch_bool_t member_test_flag(conference_member_t *member, member_flag_t flag) +{ + return !!member->flags[flag]; +} + + + + SWITCH_STANDARD_API(conf_api_main); static int conference_set_fps(conference_obj_t *conference, float fps) { - int i = 0; + int i = 0, j = 0; for (i = 0; FPS_VALS[i].ms; i++) { if (FPS_VALS[i].fps == fps) { + conference->video_fps = FPS_VALS[i]; - conference->video_timer_reset = 1; + + for (j = 0; j <= conference->canvas_count; j++) { + if (conference->canvases[j]) { + conference->canvases[j]->video_timer_reset = 1; + } + } + return 1; } } @@ -768,7 +878,7 @@ static switch_status_t conference_outcall_bg(conference_obj_t *conference, switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name, const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause, switch_event_t **var_event); SWITCH_STANDARD_APP(conference_function); -static void launch_conference_video_muxing_thread(conference_obj_t *conference); +static void launch_conference_video_muxing_thread(conference_obj_t *conference, mcu_canvas_t *canvas, int super); static void launch_conference_thread(conference_obj_t *conference); static void launch_conference_video_muxing_write_thread(conference_member_t *member); static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *obj); @@ -1022,14 +1132,14 @@ static void reset_image(switch_image_t *img, switch_rgb_color_t *color) /* clear layer and reset_layer called inside lock always */ -static void clear_layer(mcu_canvas_t *canvas, mcu_layer_t *layer) +static void clear_layer(mcu_layer_t *layer) { - switch_img_fill(canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &canvas->bgcolor); + switch_img_fill(layer->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &layer->canvas->bgcolor); layer->banner_patched = 0; layer->refresh = 1; } -static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer) +static void reset_layer(mcu_layer_t *layer) { layer->tagged = 0; @@ -1042,35 +1152,35 @@ static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer) layer->is_avatar = 0; if (layer->geometry.overlap) { - canvas->refresh = 1; + layer->canvas->refresh = 1; } switch_img_free(&layer->img); layer->img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, layer->screen_w, layer->screen_h, 1); switch_assert(layer->img); - clear_layer(canvas, layer); + clear_layer(layer); switch_img_free(&layer->cur_img); } -static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, switch_image_t *ximg, switch_bool_t freeze) +static void scale_and_patch(mcu_layer_t *layer, switch_image_t *ximg, switch_bool_t freeze) { switch_image_t *IMG, *img; - switch_mutex_lock(conference->canvas->mutex); + switch_mutex_lock(layer->canvas->mutex); - IMG = conference->canvas->img; + IMG = layer->canvas->img; img = ximg ? ximg : layer->cur_img; switch_assert(IMG); if (!img) { - switch_mutex_unlock(conference->canvas->mutex); + switch_mutex_unlock(layer->canvas->mutex); return; } if (layer->refresh) { - switch_img_fill(conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &conference->canvas->letterbox_bgcolor); + switch_img_fill(layer->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &layer->canvas->letterbox_bgcolor); layer->refresh = 0; } @@ -1101,7 +1211,7 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, sw if (layer->img && (layer->img->d_w != img_w || layer->img->d_h != img_h)) { switch_img_free(&layer->img); layer->banner_patched = 0; - clear_layer(conference->canvas, layer); + clear_layer(layer); } if (!layer->img) { @@ -1109,7 +1219,7 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, sw } if (layer->banner_img && !layer->banner_patched) { - switch_img_fill(conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &conference->canvas->letterbox_bgcolor); + switch_img_fill(layer->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &layer->canvas->letterbox_bgcolor); switch_img_patch(IMG, layer->banner_img, layer->x_pos, layer->y_pos + (layer->screen_h - layer->banner_img->d_h)); if (!freeze) { @@ -1124,13 +1234,14 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, sw if (switch_img_scale(img, &layer->img, img_w, img_h) == SWITCH_STATUS_SUCCESS) { if (layer->bugged && layer->member_id > -1) { conference_member_t *member; - if ((member = conference_member_get(conference, layer->member_id))) { + if ((member = conference_member_get(layer->canvas->conference, layer->member_id))) { switch_frame_t write_frame = { 0 }; write_frame.img = layer->img; switch_core_media_bug_patch_video(member->session, &write_frame); switch_thread_rwlock_unlock(member->rwlock); } } + switch_img_patch(IMG, layer->img, x_pos, y_pos); } @@ -1154,8 +1265,7 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, sw switch_img_patch(IMG, img, 0, 0); } - switch_mutex_unlock(conference->canvas->mutex); - + switch_mutex_unlock(layer->canvas->mutex); } static void set_canvas_bgcolor(mcu_canvas_t *canvas, char *color) @@ -1169,16 +1279,16 @@ static void set_canvas_letterbox_bgcolor(mcu_canvas_t *canvas, char *color) switch_color_set_rgb(&canvas->letterbox_bgcolor, color); } -static void check_used_layers(conference_obj_t *conference) +static void check_used_layers(mcu_canvas_t *canvas) { int i; - if (!conference->canvas) return; + if (!canvas) return; - conference->canvas->layers_used = 0; - for (i = 0; i < conference->canvas->total_layers; i++) { - if (conference->canvas->layers[i].member_id) { - conference->canvas->layers_used++; + canvas->layers_used = 0; + for (i = 0; i < canvas->total_layers; i++) { + if (canvas->layers[i].member_id) { + canvas->layers_used++; } } } @@ -1186,14 +1296,21 @@ static void check_used_layers(conference_obj_t *conference) static void detach_video_layer(conference_member_t *member) { mcu_layer_t *layer = NULL; + mcu_canvas_t *canvas = NULL; - if (!member->conference->canvas || member->video_layer_id < 0) { - return; + switch_mutex_lock(member->conference->canvas_mutex); + + if (member->canvas_id < 0) goto end; + + canvas = member->conference->canvases[member->canvas_id]; + + if (!canvas || member->video_layer_id < 0) { + goto end; } - switch_mutex_lock(member->conference->canvas->mutex); + switch_mutex_lock(canvas->mutex); - layer = &member->conference->canvas->layers[member->video_layer_id]; + layer = &canvas->layers[member->video_layer_id]; if (layer->geometry.audio_position) { conf_api_sub_position(member, NULL, "0:0:0"); @@ -1203,12 +1320,20 @@ static void detach_video_layer(conference_member_t *member) switch_img_txt_handle_destroy(&layer->txthandle); } - reset_layer(member->conference->canvas, layer); + reset_layer(layer); layer->member_id = 0; member->video_layer_id = -1; + //member->canvas_id = 0; + //member->watching_canvas_id = -1; member->avatar_patched = 0; - check_used_layers(member->conference); - switch_mutex_unlock(member->conference->canvas->mutex); + check_used_layers(canvas); + canvas->send_keyframe = 1; + switch_mutex_unlock(canvas->mutex); + + end: + + switch_mutex_unlock(member->conference->canvas_mutex); + } @@ -1221,7 +1346,7 @@ static void layer_set_logo(conference_member_t *member, mcu_layer_t *layer, cons char *tmp; switch_img_position_t pos = POS_LEFT_TOP; - switch_mutex_lock(member->conference->canvas->mutex); + switch_mutex_lock(layer->canvas->mutex); if (!path) { path = member->video_logo; @@ -1293,7 +1418,7 @@ static void layer_set_logo(conference_member_t *member, mcu_layer_t *layer, cons end: - switch_mutex_unlock(member->conference->canvas->mutex); + switch_mutex_unlock(layer->canvas->mutex); } @@ -1310,8 +1435,7 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co const char *var, *tmp = NULL; char *dup = NULL; - - switch_mutex_lock(member->conference->canvas->mutex); + switch_mutex_lock(layer->canvas->mutex); if (!text) { text = member->video_banner_text; @@ -1408,7 +1532,7 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co switch_safe_free(dup); - switch_mutex_unlock(member->conference->canvas->mutex); + switch_mutex_unlock(layer->canvas->mutex); } static void reset_video_bitrate_counters(conference_member_t *member) @@ -1419,7 +1543,7 @@ static void reset_video_bitrate_counters(conference_member_t *member) member->blanks = 0; } -static switch_status_t attach_video_layer(conference_member_t *member, int idx) +static switch_status_t attach_video_layer(conference_member_t *member, mcu_canvas_t *canvas, int idx) { mcu_layer_t *layer = NULL; switch_channel_t *channel = NULL; @@ -1439,9 +1563,11 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx) return SWITCH_STATUS_FALSE; } - switch_mutex_lock(member->conference->canvas->mutex); + switch_mutex_lock(member->conference->canvas_mutex); - layer = &member->conference->canvas->layers[idx]; + switch_mutex_lock(canvas->mutex); + + layer = &canvas->layers[idx]; layer->tagged = 0; @@ -1474,7 +1600,7 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx) detach_video_layer(member); } - reset_layer(member->conference->canvas, layer); + reset_layer(layer); switch_img_free(&layer->mute_img); member->avatar_patched = 0; @@ -1495,48 +1621,51 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx) layer->member_id = member->id; member->video_layer_id = idx; - check_used_layers(member->conference); + member->canvas_id = canvas->canvas_id; + canvas->send_keyframe = 1; + + //member->watching_canvas_id = canvas->canvas_id; + check_used_layers(canvas); if (layer->geometry.audio_position) { conf_api_sub_position(member, NULL, layer->geometry.audio_position); } - - switch_img_fill(member->conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, - &member->conference->canvas->letterbox_bgcolor); - + switch_img_fill(canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &canvas->letterbox_bgcolor); reset_video_bitrate_counters(member); end: - switch_mutex_unlock(member->conference->canvas->mutex); + switch_mutex_unlock(canvas->mutex); + + switch_mutex_unlock(member->conference->canvas_mutex); return status; } -static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vlayout) +static void init_canvas_layers(conference_obj_t *conference, mcu_canvas_t *canvas, video_layout_t *vlayout) { int i = 0; - if (!conference->canvas) return; + if (!canvas) return; - switch_mutex_lock(conference->canvas->mutex); - conference->canvas->layout_floor_id = -1; + switch_mutex_lock(canvas->mutex); + canvas->layout_floor_id = -1; if (!vlayout) { - vlayout = conference->canvas->new_vlayout; - conference->canvas->new_vlayout = NULL; + vlayout = canvas->new_vlayout; + canvas->new_vlayout = NULL; } if (!vlayout) { + switch_mutex_unlock(canvas->mutex); return; } - conference->canvas->vlayout = vlayout; + canvas->vlayout = vlayout; for (i = 0; i < vlayout->layers; i++) { - mcu_layer_t *layer = &conference->canvas->layers[i]; - + mcu_layer_t *layer = &canvas->layers[i]; layer->geometry.x = vlayout->images[i].x; layer->geometry.y = vlayout->images[i].y; layer->geometry.scale = vlayout->images[i].scale; @@ -1545,18 +1674,18 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla layer->idx = i; layer->refresh = 1; - layer->screen_w = conference->canvas->img->d_w * layer->geometry.scale / VIDEO_LAYOUT_SCALE; - layer->screen_h = conference->canvas->img->d_h * layer->geometry.scale / VIDEO_LAYOUT_SCALE; + layer->screen_w = canvas->img->d_w * layer->geometry.scale / VIDEO_LAYOUT_SCALE; + layer->screen_h = canvas->img->d_h * layer->geometry.scale / VIDEO_LAYOUT_SCALE; // if (layer->screen_w % 2) layer->screen_w++; // round to even // if (layer->screen_h % 2) layer->screen_h++; // round to even - layer->x_pos = conference->canvas->img->d_w * layer->geometry.x / VIDEO_LAYOUT_SCALE; - layer->y_pos = conference->canvas->img->d_h * layer->geometry.y / VIDEO_LAYOUT_SCALE; + layer->x_pos = canvas->img->d_w * layer->geometry.x / VIDEO_LAYOUT_SCALE; + layer->y_pos = canvas->img->d_h * layer->geometry.y / VIDEO_LAYOUT_SCALE; if (layer->geometry.floor) { - conference->canvas->layout_floor_id = i; + canvas->layout_floor_id = i; } /* if we ever decided to reload layers config on demand the pointer assignment below will lead to segs but we @@ -1565,57 +1694,113 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla layer->geometry.audio_position = vlayout->images[i].audio_position; } - reset_image(conference->canvas->img, &conference->canvas->bgcolor); + reset_image(canvas->img, &canvas->bgcolor); for (i = 0; i < MCU_MAX_LAYERS; i++) { - mcu_layer_t *layer = &conference->canvas->layers[i]; + mcu_layer_t *layer = &canvas->layers[i]; layer->member_id = 0; layer->tagged = 0; layer->banner_patched = 0; layer->refresh = 1; - reset_layer(conference->canvas, layer); - + layer->canvas = canvas; + reset_layer(layer); } - conference->canvas->layers_used = 0; - conference->canvas->total_layers = vlayout->layers; - conference->canvas->send_keyframe = 1; + canvas->layers_used = 0; + canvas->total_layers = vlayout->layers; + canvas->send_keyframe = 1; - switch_mutex_unlock(conference->canvas->mutex); + switch_mutex_unlock(canvas->mutex); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Canvas position %d applied layout %s\n", canvas->canvas_id, vlayout->name); } -static void init_canvas(conference_obj_t *conference, video_layout_t *vlayout) +static switch_status_t attach_canvas(conference_obj_t *conference, mcu_canvas_t *canvas, int super) { - if (!conference->canvas) { - conference->canvas = switch_core_alloc(conference->pool, sizeof(*conference->canvas)); - conference->canvas->pool = conference->pool; - switch_mutex_init(&conference->canvas->mutex, SWITCH_MUTEX_NESTED, conference->pool); - conference->canvas->layout_floor_id = -1; + if (conference->canvas_count >= MAX_CANVASES + 1) { + return SWITCH_STATUS_FALSE; } - switch_img_free(&conference->canvas->img); + canvas->canvas_id = conference->canvas_count; - conference->canvas->img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, conference->canvas_width, conference->canvas_height, 0); + if (!super) { + conference->canvas_count++; + + if (!conference->canvas) { + conference->canvas = canvas; + } + } + + conference->canvases[canvas->canvas_id] = canvas; - switch_assert(conference->canvas->img); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Canvas attached to position %d\n", canvas->canvas_id); - conference->canvas->width = conference->canvas_width; - conference->canvas->height = conference->canvas_height; - - switch_mutex_lock(conference->canvas->mutex); - set_canvas_bgcolor(conference->canvas, conference->video_canvas_bgcolor); - set_canvas_letterbox_bgcolor(conference->canvas, conference->video_letterbox_bgcolor); - init_canvas_layers(conference, vlayout); - switch_mutex_unlock(conference->canvas->mutex); + return SWITCH_STATUS_SUCCESS; } +static switch_status_t init_canvas(conference_obj_t *conference, video_layout_t *vlayout, mcu_canvas_t **canvasP) +{ + mcu_canvas_t *canvas; + + if (conference->canvas_count >= MAX_CANVASES) { + return SWITCH_STATUS_FALSE; + } + + canvas = switch_core_alloc(conference->pool, sizeof(*canvas)); + canvas->conference = conference; + canvas->pool = conference->pool; + switch_mutex_init(&canvas->mutex, SWITCH_MUTEX_NESTED, conference->pool); + canvas->layout_floor_id = -1; + + switch_img_free(&canvas->img); + + canvas->width = conference->canvas_width; + canvas->height = conference->canvas_height; + + canvas->img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, canvas->width, canvas->height, 0); + switch_queue_create(&canvas->video_queue, 200, canvas->pool); + + switch_assert(canvas->img); + + switch_mutex_lock(canvas->mutex); + set_canvas_bgcolor(canvas, conference->video_canvas_bgcolor); + set_canvas_letterbox_bgcolor(canvas, conference->video_letterbox_bgcolor); + init_canvas_layers(conference, canvas, vlayout); + switch_mutex_unlock(canvas->mutex); + + canvas->canvas_id = -1; + *canvasP = canvas; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Layout set to %s\n", vlayout->name); + + return SWITCH_STATUS_SUCCESS; +} + +static int flush_video_queue(switch_queue_t *q) +{ + switch_image_t *img; + void *pop; + int r = 0; + + if (!q) return 0; + + while (switch_queue_size(q) > 1 && switch_queue_trypop(q, &pop) == SWITCH_STATUS_SUCCESS && pop) { + img = (switch_image_t *)pop; + switch_img_free(&img); + r++; + } + + return r + switch_queue_size(q); +} + + static void destroy_canvas(mcu_canvas_t **canvasP) { int i; mcu_canvas_t *canvas = *canvasP; switch_img_free(&canvas->img); + flush_video_queue(canvas->video_queue); for (i = 0; i < MCU_MAX_LAYERS; i++) { switch_img_free(&canvas->layers[i].img); @@ -1630,7 +1815,7 @@ typedef struct codec_set_s { uint8_t *packet; } codec_set_t; -static void write_canvas_image_to_codec_group(conference_obj_t *conference, codec_set_t *codec_set, +static void write_canvas_image_to_codec_group(conference_obj_t *conference, mcu_canvas_t *canvas, codec_set_t *codec_set, int codec_index, uint32_t timestamp, switch_bool_t need_refresh, switch_bool_t need_keyframe, switch_bool_t need_reset) @@ -1684,10 +1869,14 @@ static void write_canvas_image_to_codec_group(conference_obj_t *conference, code for (imember = conference->members; imember; imember = imember->next) { switch_frame_t *dupframe; - if (switch_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { + if (imember->watching_canvas_id != canvas->canvas_id) { continue; } + if (member_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { + continue; + } + if (imember->video_codec_index != codec_index) { continue; } @@ -1703,7 +1892,7 @@ static void write_canvas_image_to_codec_group(conference_obj_t *conference, code //switch_core_session_write_encoded_video_frame(imember->session, frame, 0, 0); switch_set_flag(frame, SFF_ENCODED); - + if (switch_frame_buffer_dup(imember->fb, frame, &dupframe) == SWITCH_STATUS_SUCCESS) { switch_queue_push(imember->mux_out_queue, dupframe); dupframe = NULL; @@ -1721,12 +1910,14 @@ static void write_canvas_image_to_codec_group(conference_obj_t *conference, code #define MAX_MUX_CODECS 10 -static video_layout_t *find_best_layout(conference_obj_t *conference, layout_group_t *lg) +static video_layout_t *find_best_layout(conference_obj_t *conference, layout_group_t *lg, uint32_t count) { video_layout_node_t *vlnode = NULL, *last = NULL; + if (!count) count = conference->members_with_video + conference->members_with_avatar; + for (vlnode = lg->layouts; vlnode; vlnode = vlnode->next) { - if (vlnode->vlayout->layers >= conference->count) { + if (vlnode->vlayout->layers >= count) { break; } @@ -1736,16 +1927,16 @@ static video_layout_t *find_best_layout(conference_obj_t *conference, layout_gro return vlnode? vlnode->vlayout : last ? last->vlayout : NULL; } -static video_layout_t *get_layout(conference_obj_t *conference) +static video_layout_t *get_layout(conference_obj_t *conference, const char *video_layout_name, const char *video_layout_group) { layout_group_t *lg = NULL; video_layout_t *vlayout = NULL; - if (conference->video_layout_group) { - lg = switch_core_hash_find(conference->layout_group_hash, conference->video_layout_group); - vlayout = find_best_layout(conference, lg); + if (video_layout_group) { + lg = switch_core_hash_find(conference->layout_group_hash, video_layout_group); + vlayout = find_best_layout(conference, lg, 0); } else { - vlayout = switch_core_hash_find(conference->layout_hash, conference->video_layout_name); + vlayout = switch_core_hash_find(conference->layout_hash, video_layout_name); } return vlayout; @@ -1753,11 +1944,16 @@ static video_layout_t *get_layout(conference_obj_t *conference) static void vmute_snap(conference_member_t *member, switch_bool_t clear) { - if (member->conference->canvas && member->video_layer_id > -1) { - mcu_layer_t *layer = NULL; - switch_mutex_lock(member->conference->canvas->mutex); - layer = &member->conference->canvas->layers[member->video_layer_id]; + + if (member->canvas_id > -1 && member->video_layer_id > -1) { + mcu_layer_t *layer = NULL; + mcu_canvas_t *canvas = NULL; + + canvas = member->conference->canvases[member->canvas_id]; + + switch_mutex_lock(canvas->mutex); + layer = &canvas->layers[member->video_layer_id]; switch_img_free(&layer->mute_img); switch_img_free(&member->video_mute_img); @@ -1766,7 +1962,7 @@ static void vmute_snap(conference_member_t *member, switch_bool_t clear) switch_img_copy(layer->cur_img, &layer->mute_img); } - switch_mutex_unlock(member->conference->canvas->mutex); + switch_mutex_unlock(canvas->mutex); } } @@ -1776,10 +1972,10 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_write_thread_run(switch_ void *pop; int loops = 0; - while(switch_test_flag(member, MFLAG_RUNNING) || switch_queue_size(member->mux_out_queue)) { + while(member_test_flag(member, MFLAG_RUNNING) || switch_queue_size(member->mux_out_queue)) { switch_frame_t *frame; - if (switch_test_flag(member, MFLAG_RUNNING)) { + if (member_test_flag(member, MFLAG_RUNNING)) { if (switch_queue_pop(member->mux_out_queue, &pop) == SWITCH_STATUS_SUCCESS) { if (!pop) continue; @@ -1835,35 +2031,30 @@ static void check_video_recording(conference_obj_t *conference, switch_frame_t * } -static int flush_video_queue(switch_queue_t *q) -{ - switch_image_t *img; - void *pop; - int r = 0; - - if (!q) return 0; - - while (switch_queue_size(q) > 1 && switch_queue_trypop(q, &pop) == SWITCH_STATUS_SUCCESS && pop) { - img = (switch_image_t *)pop; - switch_img_free(&img); - r++; - } - - return r + switch_queue_size(q); -} - static void check_avatar(conference_member_t *member, switch_bool_t force) { const char *avatar = NULL, *var = NULL; + mcu_canvas_t *canvas; - if (member->conference->canvas) { - switch_mutex_lock(member->conference->canvas->mutex); + if (member->canvas_id < 0) { + return; + } + + canvas = member->conference->canvases[member->canvas_id]; + + if (conference_test_flag(member->conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS) && + (!switch_channel_test_flag(member->channel, CF_VIDEO) || member->video_flow == SWITCH_MEDIA_FLOW_SENDONLY)) { + return; + } + + if (canvas) { + switch_mutex_lock(canvas->mutex); } member->avatar_patched = 0; if (!force && switch_channel_test_flag(member->channel, CF_VIDEO) && member->video_flow != SWITCH_MEDIA_FLOW_SENDONLY) { - switch_set_flag_locked(member, MFLAG_ACK_VIDEO); + member_set_flag_locked(member, MFLAG_ACK_VIDEO); } else { if (member->conference->no_video_avatar) { avatar = member->conference->no_video_avatar; @@ -1888,8 +2079,8 @@ static void check_avatar(conference_member_t *member, switch_bool_t force) switch_img_copy(member->video_mute_img, &member->avatar_png_img); } - if (member->conference->canvas) { - switch_mutex_unlock(member->conference->canvas->mutex); + if (canvas) { + switch_mutex_unlock(canvas->mutex); } } @@ -1914,10 +2105,10 @@ static void check_flush(conference_member_t *member) } } -static void patch_fnode(conference_obj_t *conference, conference_file_node_t *fnode) +static void patch_fnode(mcu_canvas_t *canvas, conference_file_node_t *fnode) { if (fnode && fnode->layer_id > -1) { - mcu_layer_t *layer = &conference->canvas->layers[fnode->layer_id]; + mcu_layer_t *layer = &canvas->layers[fnode->layer_id]; switch_frame_t file_frame = { 0 }; switch_status_t status = switch_core_file_read_video(&fnode->fh, &file_frame, SVR_FLUSH); @@ -1926,34 +2117,198 @@ static void patch_fnode(conference_obj_t *conference, conference_file_node_t *fn layer->cur_img = file_frame.img; layer->tagged = 1; } else if (status == SWITCH_STATUS_IGNORE) { - if (conference->canvas && fnode->layer_id > -1 ) { - canvas_del_fnode_layer(conference, fnode); + if (canvas && fnode->layer_id > -1 ) { + canvas_del_fnode_layer(canvas->conference, fnode); } } } } -static void fnode_check_video(conference_obj_t *conference, conference_file_node_t *fnode) { +static void fnode_check_video(conference_file_node_t *fnode) { + mcu_canvas_t *canvas = fnode->conference->canvases[fnode->canvas_id]; + if (switch_core_file_has_video(&fnode->fh) && switch_core_file_read_video(&fnode->fh, NULL, SVR_CHECK) == SWITCH_STATUS_BREAK) { int full_screen = 0; - if (fnode->fh.params) { + if (fnode->fh.params && fnode->conference->canvas_count == 1) { full_screen = switch_true(switch_event_get_header(fnode->fh.params, "full-screen")); } if (full_screen) { - conference->canvas->play_file = 1; - conference->playing_video_file = 1; + canvas->play_file = 1; + canvas->conference->playing_video_file = 1; } else { - canvas_set_fnode_layer(conference, fnode, -1); + canvas_set_fnode_layer(canvas, fnode, -1); } } } +static switch_status_t find_layer(conference_obj_t *conference, mcu_canvas_t *canvas, conference_member_t *member, mcu_layer_t **layerP) +{ + uint32_t avatar_layers = 0; + mcu_layer_t *layer = NULL; + int i; + + switch_mutex_lock(conference->canvas_mutex); + + for (i = 0; i < canvas->total_layers; i++) { + mcu_layer_t *xlayer = &canvas->layers[i]; + + if (xlayer->is_avatar && xlayer->member_id != conference->video_floor_holder) { + avatar_layers++; + } + } + + if (!layer && + (canvas->layers_used < canvas->total_layers || + (avatar_layers && !member->avatar_png_img) || member_test_flag(member, MFLAG_MOD)) && + (member->avatar_png_img || member->video_flow != SWITCH_MEDIA_FLOW_SENDONLY)) { + /* find an empty layer */ + for (i = 0; i < canvas->total_layers; i++) { + mcu_layer_t *xlayer = &canvas->layers[i]; + + if (xlayer->geometry.res_id) { + if (member->video_reservation_id && !strcmp(xlayer->geometry.res_id, member->video_reservation_id)) { + layer = xlayer; + attach_video_layer(member, canvas, i); + break; + } + } else if (xlayer->geometry.flooronly && !xlayer->fnode) { + if (member->id == conference->video_floor_holder) { + layer = xlayer; + attach_video_layer(member, canvas, i); + break; + } + } else if ((!xlayer->member_id || (!member->avatar_png_img && + xlayer->is_avatar && + xlayer->member_id != conference->video_floor_holder)) && + !xlayer->fnode && !xlayer->geometry.fileonly) { + switch_status_t lstatus; + + lstatus = attach_video_layer(member, canvas, i); + + if (lstatus == SWITCH_STATUS_SUCCESS || lstatus == SWITCH_STATUS_BREAK) { + layer = xlayer; + break; + } + } + } + } + + switch_mutex_unlock(conference->canvas_mutex); + + if (layer) { + *layerP = layer; + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; + +} + +static void next_canvas(conference_member_t *imember) +{ + if (imember->canvas_id == imember->conference->canvas_count - 1) { + imember->canvas_id = 0; + } else { + imember->canvas_id++; + } +} + +static void pop_next_image(conference_member_t *member, switch_image_t **imgP) +{ + switch_image_t *img = *imgP; + int size = 0; + void *pop; + + if (!member->avatar_png_img && switch_channel_test_flag(member->channel, CF_VIDEO)) { + do { + if (switch_queue_trypop(member->video_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) { + switch_img_free(&img); + img = (switch_image_t *)pop; + member->blanks = 0; + } else { + break; + } + size = switch_queue_size(member->video_queue); + } while(size > member->conference->video_fps.fps / 2); + + if (member_test_flag(member, MFLAG_CAN_BE_SEEN) && member->video_layer_id > -1 && member->video_flow != SWITCH_MEDIA_FLOW_SENDONLY) { + if (img) { + member->good_img++; + if ((member->good_img % (int)(member->conference->video_fps.fps * 10)) == 0) { + reset_video_bitrate_counters(member); + } + } else { + member->blanks++; + member->good_img = 0; + + if (member->blanks == member->conference->video_fps.fps || (member->blanks % (int)(member->conference->video_fps.fps * 10)) == 0) { + member->managed_kps = 0; + switch_core_session_request_video_refresh(member->session); + } + + if (member->blanks == member->conference->video_fps.fps * 5) { + member->blackouts++; + check_avatar(member, SWITCH_TRUE); + member->managed_kps = 0; + + if (member->avatar_png_img) { + //if (layer) { + //layer->is_avatar = 1; + //} + + member->auto_avatar = 1; + } + } + } + } + } else { + check_flush(member); + } + + *imgP = img; +} + +static void check_auto_bitrate(conference_member_t *member, mcu_layer_t *layer) +{ + if (conference_test_flag(member->conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE) && !member->managed_kps) { + switch_core_session_message_t msg = { 0 }; + int kps; + int w = 320; + int h = 240; + + if (layer) { + if (layer->screen_w > 320 && layer->screen_h > 240) { + w = layer->screen_w; + h = layer->screen_h; + } + } + + if (!layer || !member_test_flag(member, MFLAG_CAN_BE_SEEN) || member->avatar_png_img) { + kps = 200; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps because user's image is not visible\n", + switch_channel_get_name(member->channel), kps); + } else { + kps = switch_calc_bitrate(w, h, 2, member->conference->video_fps.fps); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accomodate %dx%d resolution\n", + switch_channel_get_name(member->channel), kps, layer->screen_w, layer->screen_h); + } + + msg.message_id = SWITCH_MESSAGE_INDICATE_BITRATE_REQ; + msg.numeric_arg = kps * 1024; + msg.from = __FILE__; + + switch_core_session_receive_message(member->session, &msg); + member->managed_kps = kps; + } +} + static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thread, void *obj) { - conference_obj_t *conference = (conference_obj_t *) obj; + mcu_canvas_t *canvas = (mcu_canvas_t *) obj; + conference_obj_t *conference = canvas->conference; conference_member_t *imember; switch_codec_t *check_codec = NULL; codec_set_t *write_codecs[MAX_MUX_CODECS] = { 0 }; @@ -1965,67 +2320,193 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread switch_frame_t write_frame = { 0 }; uint8_t *packet = NULL; switch_image_t *write_img = NULL, *file_img = NULL; - uint32_t timestamp = 0, avatar_layers = 0; - video_layout_t *vlayout = get_layout(conference); + uint32_t timestamp = 0; + //video_layout_t *vlayout = get_layout(conference); + int members_with_video = 0, members_with_avatar = 0; + int do_refresh = 0; + int last_file_count = 0; - if (!vlayout) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot find layout\n"); - conference->video_layout_name = conference->video_layout_group = NULL; - switch_clear_flag(conference, CFLAG_VIDEO_MUXING); - return NULL; - } - - init_canvas(conference, vlayout); - - conference->video_timer_reset = 1; + canvas->video_timer_reset = 1; packet = switch_core_alloc(conference->pool, SWITCH_RTP_MAX_BUF_LEN); - while (globals.running && !switch_test_flag(conference, CFLAG_DESTRUCT) && switch_test_flag(conference, CFLAG_VIDEO_MUXING)) { + while (globals.running && !conference_test_flag(conference, CFLAG_DESTRUCT) && conference_test_flag(conference, CFLAG_VIDEO_MUXING)) { switch_bool_t need_refresh = SWITCH_FALSE, need_keyframe = SWITCH_FALSE, need_reset = SWITCH_FALSE; switch_time_t now; int min_members = 0; + int count_changed = 0; + int file_count = 0, check_async_file = 0, check_file = 0; + switch_image_t *async_file_img = NULL, *normal_file_img = NULL, *file_imgs[2] = { 0 }; + switch_frame_t file_frame = { 0 }; + int j = 0; - - switch_mutex_lock(conference->canvas->mutex); - if (conference->canvas->new_vlayout) { - init_canvas_layers(conference, NULL); + switch_mutex_lock(canvas->mutex); + if (canvas->new_vlayout) { + init_canvas_layers(conference, canvas, NULL); } - switch_mutex_unlock(conference->canvas->mutex); + switch_mutex_unlock(canvas->mutex); - if (conference->video_timer_reset) { - conference->video_timer_reset = 0; + if (canvas->video_timer_reset) { + canvas->video_timer_reset = 0; - if (conference->canvas->timer.interval) { - switch_core_timer_destroy(&conference->canvas->timer); + if (canvas->timer.interval) { + switch_core_timer_destroy(&canvas->timer); } - switch_core_timer_init(&conference->canvas->timer, "soft", conference->video_fps.ms, conference->video_fps.samples, NULL); - conference->canvas->send_keyframe = 1; + switch_core_timer_init(&canvas->timer, "soft", conference->video_fps.ms, conference->video_fps.samples, NULL); + canvas->send_keyframe = 1; } if (!conference->playing_video_file) { - switch_core_timer_next(&conference->canvas->timer); + switch_core_timer_next(&canvas->timer); } now = switch_micro_time_now(); + if (members_with_video != conference->members_with_video) { + do_refresh = 100; + count_changed = 1; + } + + if (members_with_avatar != conference->members_with_avatar) { + count_changed = 1; + } + + if (count_changed && !conference_test_flag(conference, CFLAG_PERSONAL_CANVAS)) { + layout_group_t *lg = NULL; + video_layout_t *vlayout = NULL; + int canvas_count = 0; + + switch_mutex_lock(conference->member_mutex); + for (imember = conference->members; imember; imember = imember->next) { + if (imember->canvas_id == canvas->canvas_id || imember->canvas_id == -1) { + canvas_count++; + } + } + switch_mutex_unlock(conference->member_mutex); + + if (conference->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, conference->video_layout_group))) { + if ((vlayout = find_best_layout(conference, lg, canvas_count))) { + switch_mutex_lock(conference->member_mutex); + conference->canvas->new_vlayout = vlayout; + switch_mutex_unlock(conference->member_mutex); + } + } + } + + if (count_changed) { + need_refresh = 1; + need_keyframe = 1; + do_refresh = 100; + } + + if (conference->async_fnode && switch_core_file_has_video(&conference->async_fnode->fh)) { + check_async_file = 1; + file_count++; + } + + if (conference->fnode && switch_core_file_has_video(&conference->fnode->fh)) { + check_file = 1; + file_count++; + } + + if (file_count != last_file_count) { + count_changed = 1; + } + + last_file_count = file_count; + + if (do_refresh) { + if ((do_refresh % 50) == 0) { + switch_mutex_lock(conference->member_mutex); + + for (imember = conference->members; imember; imember = imember->next) { + if (imember->canvas_id != canvas->canvas_id) continue; + + if (imember->session && switch_channel_test_flag(imember->channel, CF_VIDEO)) { + switch_core_session_request_video_refresh(imember->session); + switch_core_media_gen_key_frame(imember->session); + } + } + switch_mutex_unlock(conference->member_mutex); + } + do_refresh--; + } + + members_with_video = conference->members_with_video; + members_with_avatar = conference->members_with_avatar; + + if (conference_test_flag(conference, CFLAG_VIDEO_BRIDGE_FIRST_TWO)) { + if (conference->members_with_video < 3) { + switch_yield(20000); + continue; + } + } + switch_mutex_lock(conference->member_mutex); - for (imember = conference->members; imember; imember = imember->next) { - void *pop; switch_image_t *img = NULL; - int size = 0; int i; - + if (!imember->session || (!switch_channel_test_flag(imember->channel, CF_VIDEO) && !imember->avatar_png_img) || - switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { + conference_test_flag(conference, CFLAG_PERSONAL_CANVAS) || switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { continue; - } + } - if (!switch_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { + if (imember->watching_canvas_id == canvas->canvas_id && switch_channel_test_flag(imember->channel, CF_VIDEO_REFRESH_REQ)) { + switch_channel_clear_flag(imember->channel, CF_VIDEO_REFRESH_REQ); + need_keyframe = SWITCH_TRUE; + } + + if (conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING) && + imember->watching_canvas_id > -1 && imember->watching_canvas_id == canvas->canvas_id && + !member_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { min_members++; + + if (switch_channel_test_flag(imember->channel, CF_VIDEO)) { + if (imember->video_codec_index < 0 && (check_codec = switch_core_session_get_video_write_codec(imember->session))) { + for (i = 0; write_codecs[i] && switch_core_codec_ready(&write_codecs[i]->codec) && i < MAX_MUX_CODECS; i++) { + if (check_codec->implementation->codec_id == write_codecs[i]->codec.implementation->codec_id) { + imember->video_codec_index = i; + imember->video_codec_id = check_codec->implementation->codec_id; + need_refresh = SWITCH_TRUE; + break; + } + } + + if (imember->video_codec_index < 0) { + write_codecs[i] = switch_core_alloc(conference->pool, sizeof(codec_set_t)); + + if (switch_core_codec_copy(check_codec, &write_codecs[i]->codec, + &conference->video_codec_settings, conference->pool) == SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Setting up video write codec %s at slot %d\n", write_codecs[i]->codec.implementation->iananame, i); + + imember->video_codec_index = i; + imember->video_codec_id = check_codec->implementation->codec_id; + need_refresh = SWITCH_TRUE; + write_codecs[i]->frame.packet = switch_core_alloc(conference->pool, buflen); + write_codecs[i]->frame.data = ((uint8_t *)write_codecs[i]->frame.packet) + 12; + write_codecs[i]->frame.packetlen = buflen; + write_codecs[i]->frame.buflen = buflen - 12; + switch_set_flag((&write_codecs[i]->frame), SFF_RAW_RTP); + + } + } + } + + if (imember->video_codec_index < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Write Codec Error\n"); + switch_core_session_rwunlock(imember->session); + continue; + } + } + } + + if (imember->canvas_id > -1 && imember->canvas_id != canvas->canvas_id) { + switch_core_session_rwunlock(imember->session); + continue; } if (conference->playing_video_file) { @@ -2033,111 +2514,21 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread continue; } - if (conference->canvas->layout_floor_id > -1 && imember->id == conference->video_floor_holder && - imember->video_layer_id != conference->canvas->layout_floor_id) { - attach_video_layer(imember, conference->canvas->layout_floor_id); - } - - if (switch_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING) && switch_channel_test_flag(imember->channel, CF_VIDEO)) { - if (switch_channel_test_flag(imember->channel, CF_VIDEO_REFRESH_REQ)) { - switch_channel_clear_flag(imember->channel, CF_VIDEO_REFRESH_REQ); - need_refresh = SWITCH_TRUE; - } - - if (imember->video_codec_index < 0 && (check_codec = switch_core_session_get_video_write_codec(imember->session))) { - for (i = 0; write_codecs[i] && switch_core_codec_ready(&write_codecs[i]->codec) && i < MAX_MUX_CODECS; i++) { - if (check_codec->implementation->codec_id == write_codecs[i]->codec.implementation->codec_id) { - imember->video_codec_index = i; - imember->video_codec_id = check_codec->implementation->codec_id; - break; - } - } - - if (imember->video_codec_index < 0) { - write_codecs[i] = switch_core_alloc(conference->pool, sizeof(codec_set_t)); - - if (switch_core_codec_copy(check_codec, &write_codecs[i]->codec, - &conference->video_codec_settings, conference->pool) == SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "Setting up video write codec %s at slot %d\n", write_codecs[i]->codec.implementation->iananame, i); - - imember->video_codec_index = i; - imember->video_codec_id = check_codec->implementation->codec_id; - - write_codecs[i]->frame.packet = switch_core_alloc(conference->pool, buflen); - write_codecs[i]->frame.data = ((uint8_t *)write_codecs[i]->frame.packet) + 12; - write_codecs[i]->frame.packetlen = buflen; - write_codecs[i]->frame.buflen = buflen - 12; - switch_set_flag((&write_codecs[i]->frame), SFF_RAW_RTP); - - } - } - } - - if (imember->video_codec_index < 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Write Codec Error\n"); - switch_core_session_rwunlock(imember->session); - continue; - } - } - - img = NULL; - size = 0; - - if (!imember->avatar_png_img && switch_channel_test_flag(imember->channel, CF_VIDEO)) { - do { - if (switch_queue_trypop(imember->video_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) { - switch_img_free(&img); - img = (switch_image_t *)pop; - imember->blanks = 0; - } else { - break; - } - size = switch_queue_size(imember->video_queue); - } while(size > 0); - - if (switch_test_flag(imember, MFLAG_CAN_BE_SEEN) && imember->video_layer_id > -1 && imember->video_flow != SWITCH_MEDIA_FLOW_SENDONLY) { - if (img) { - imember->good_img++; - if ((imember->good_img % (int)(conference->video_fps.fps * 10)) == 0) { - reset_video_bitrate_counters(imember); - } - } else { - imember->blanks++; - imember->good_img = 0; - - if (imember->blanks == conference->video_fps.fps || (imember->blanks % (int)(conference->video_fps.fps * 10)) == 0) { - imember->managed_kps = 0; - switch_core_session_request_video_refresh(imember->session); - } - - if (imember->blanks == conference->video_fps.fps * 5) { - imember->blackouts++; - check_avatar(imember, SWITCH_TRUE); - imember->managed_kps = 0; - - if (imember->avatar_png_img) { - //if (layer) { - //layer->is_avatar = 1; - //} - - imember->auto_avatar = 1; - } - } - } - } - } else { - check_flush(imember); + //VIDFLOOR + if (conference->canvas_count == 1 && canvas->layout_floor_id > -1 && imember->id == conference->video_floor_holder && + imember->video_layer_id != canvas->layout_floor_id) { + attach_video_layer(imember, canvas, canvas->layout_floor_id); } + pop_next_image(imember, &img); layer = NULL; - switch_mutex_lock(conference->canvas->mutex); + switch_mutex_lock(canvas->mutex); //printf("MEMBER %d layer_id %d canvas: %d/%d\n", imember->id, imember->video_layer_id, - // conference->canvas->layers_used, conference->canvas->total_layers); + // canvas->layers_used, canvas->total_layers); if (imember->video_layer_id > -1) { - layer = &conference->canvas->layers[imember->video_layer_id]; + layer = &canvas->layers[imember->video_layer_id]; if (layer->member_id != imember->id) { layer = NULL; imember->video_layer_id = -1; @@ -2157,93 +2548,21 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread switch_img_free(&img); } - - avatar_layers = 0; - for (i = 0; i < conference->canvas->total_layers; i++) { - mcu_layer_t *xlayer = &conference->canvas->layers[i]; - - if (xlayer->is_avatar && xlayer->member_id != conference->video_floor_holder) { - avatar_layers++; + if (!layer) { + if (find_layer(conference, canvas, imember, &layer) != SWITCH_STATUS_SUCCESS) { + next_canvas(imember); } } - if (!layer && - (conference->canvas->layers_used < conference->canvas->total_layers || - (avatar_layers && !imember->avatar_png_img) || switch_test_flag(imember, MFLAG_MOD)) && - (imember->avatar_png_img || imember->video_flow != SWITCH_MEDIA_FLOW_SENDONLY)) { - /* find an empty layer */ - for (i = 0; i < conference->canvas->total_layers; i++) { - mcu_layer_t *xlayer = &conference->canvas->layers[i]; + check_auto_bitrate(imember, layer); - if (xlayer->geometry.res_id) { - if (imember->video_reservation_id && !strcmp(xlayer->geometry.res_id, imember->video_reservation_id)) { - layer = xlayer; - attach_video_layer(imember, i); - break; - } - } else if (xlayer->geometry.flooronly && !xlayer->fnode) { - if (imember->id == conference->video_floor_holder) { - layer = xlayer; - attach_video_layer(imember, i); - break; - } - } else if ((!xlayer->member_id || (!imember->avatar_png_img && - xlayer->is_avatar && - xlayer->member_id != conference->video_floor_holder)) && - !xlayer->fnode && !xlayer->geometry.fileonly) { - switch_status_t lstatus; - - lstatus = attach_video_layer(imember, i); - - if (lstatus == SWITCH_STATUS_SUCCESS || lstatus == SWITCH_STATUS_BREAK) { - layer = xlayer; - break; - } - } - } - } - - if (switch_test_flag(imember->conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE) && !imember->managed_kps) { - switch_core_session_message_t msg = { 0 }; - int kps; - int w = 320; - int h = 240; - - if (layer) { - if (layer->screen_w > 320 && layer->screen_h > 240) { - w = layer->screen_w; - h = layer->screen_h; - } - } - - - - if (!layer || !switch_test_flag(imember, MFLAG_CAN_BE_SEEN) || imember->avatar_png_img) { - kps = 200; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps because user's image is not visible\n", - switch_channel_get_name(imember->channel), kps); - } else { - kps = switch_calc_bitrate(w, h, 2, imember->conference->video_fps.fps); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accomodate %dx%d resolution\n", - switch_channel_get_name(imember->channel), kps, layer->screen_w, layer->screen_h); - } - - msg.message_id = SWITCH_MESSAGE_INDICATE_BITRATE_REQ; - msg.numeric_arg = kps * 1024; - msg.from = __FILE__; - - switch_core_session_receive_message(imember->session, &msg); - imember->managed_kps = kps; - } - - if (layer) { //if (layer->cur_img && layer->cur_img != imember->avatar_png_img) { // switch_img_free(&layer->cur_img); //} - if (switch_test_flag(imember, MFLAG_CAN_BE_SEEN)) { + if (member_test_flag(imember, MFLAG_CAN_BE_SEEN)) { layer->mute_patched = 0; } else { switch_image_t *tmp; @@ -2255,7 +2574,7 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread if (!layer->mute_patched) { if (imember->video_mute_img || layer->mute_img) { - clear_layer(conference->canvas, layer); + clear_layer(layer); if (!layer->mute_img && imember->video_mute_img) { //layer->mute_img = switch_img_read_png(imember->video_mute_png, SWITCH_IMG_FMT_I420); @@ -2263,13 +2582,13 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread } if (layer->mute_img) { - scale_and_patch(conference, layer, layer->mute_img, SWITCH_FALSE); + scale_and_patch(layer, layer->mute_img, SWITCH_FALSE); } } tmp = switch_img_write_text_img(layer->screen_w, layer->screen_h, SWITCH_TRUE, "VIDEO MUTED"); - switch_img_patch(conference->canvas->img, tmp, layer->x_pos, layer->y_pos); + switch_img_patch(canvas->img, tmp, layer->x_pos, layer->y_pos); switch_img_free(&tmp); layer->mute_patched = 1; @@ -2294,7 +2613,7 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread } } - switch_mutex_unlock(conference->canvas->mutex); + switch_mutex_unlock(canvas->mutex); if (img && img != imember->avatar_png_img) { switch_img_free(&img); @@ -2304,107 +2623,672 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread switch_core_session_rwunlock(imember->session); } } - + switch_mutex_unlock(conference->member_mutex); - if (conference->async_fnode) { - if (conference->async_fnode->layer_id > -1) { - patch_fnode(conference, conference->async_fnode); - } else { - fnode_check_video(conference, conference->async_fnode); + if (conference_test_flag(conference, CFLAG_PERSONAL_CANVAS)) { + layout_group_t *lg = NULL; + video_layout_t *vlayout = NULL; + conference_member_t *omember; + + if (video_key_freq && (now - last_key_time) > video_key_freq) { + need_keyframe = SWITCH_TRUE; + last_key_time = now; } - } - if (conference->fnode) { - if (conference->fnode->layer_id > -1) { - patch_fnode(conference, conference->fnode); - } else { - fnode_check_video(conference, conference->fnode); - } - } - - if (!conference->playing_video_file) { - for (i = 0; i < conference->canvas->total_layers; i++) { - mcu_layer_t *layer = &conference->canvas->layers[i]; + switch_mutex_lock(conference->member_mutex); - if (!layer->mute_patched && (layer->member_id > -1 || layer->fnode) && layer->cur_img && (layer->tagged || layer->geometry.overlap)) { - if (conference->canvas->refresh) { - layer->refresh = 1; - conference->canvas->refresh++; - } + for (imember = conference->members; imember; imember = imember->next) { + + if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO) || + switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { + continue; + } - if (layer->cur_img) { - scale_and_patch(conference, layer, NULL, SWITCH_FALSE); - } - - layer->tagged = 0; + if (switch_channel_test_flag(imember->channel, CF_VIDEO_REFRESH_REQ)) { + switch_channel_clear_flag(imember->channel, CF_VIDEO_REFRESH_REQ); + need_keyframe = SWITCH_TRUE; } - layer->bugged = 0; + if (count_changed) { + int total = conference->members_with_video; + + if (!conference_test_flag(conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS)) { + total += conference->members_with_avatar; + } + + if (imember->video_flow != SWITCH_MEDIA_FLOW_SENDONLY) { + total--; + } + + if (total < 1) total = 1; + + if (conference->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, conference->video_layout_group))) { + if ((vlayout = find_best_layout(conference, lg, total + file_count))) { + init_canvas_layers(conference, imember->canvas, vlayout); + } + } + } + + if (imember->video_flow != SWITCH_MEDIA_FLOW_SENDONLY) { + pop_next_image(imember, &imember->pcanvas_img); + } + + switch_core_session_rwunlock(imember->session); } + + if (check_async_file) { + if (switch_core_file_read_video(&conference->async_fnode->fh, &file_frame, SVR_BLOCK | SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { + if ((async_file_img = file_frame.img)) { + file_imgs[j++] = async_file_img; + } + } + } + + if (check_file) { + if (switch_core_file_read_video(&conference->fnode->fh, &file_frame, SVR_BLOCK | SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { + if ((normal_file_img = file_frame.img)) { + file_imgs[j++] = normal_file_img; + } + } + } + + for (imember = conference->members; imember; imember = imember->next) { + int i = 0; + + if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO || imember->video_flow == SWITCH_MEDIA_FLOW_SENDONLY) || + switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { + continue; + } + + for (omember = conference->members; omember; omember = omember->next) { + mcu_layer_t *layer = NULL; + switch_image_t *use_img = NULL; + + if (!omember->session || !switch_channel_test_flag(omember->channel, CF_VIDEO) || omember->video_flow == SWITCH_MEDIA_FLOW_SENDONLY) { + continue; + } + + if (conference->members_with_video + conference->members_with_avatar != 1 && imember == omember) { + continue; + } + + if (i < imember->canvas->total_layers) { + layer = &imember->canvas->layers[i++]; + if (layer->member_id != omember->id) { + const char *var = NULL; + + layer->mute_patched = 0; + layer->avatar_patched = 0; + switch_img_free(&layer->banner_img); + switch_img_free(&layer->logo_img); + + if (layer->geometry.audio_position) { + conf_api_sub_position(omember, NULL, layer->geometry.audio_position); + } + + var = NULL; + if (omember->video_banner_text || + (var = switch_channel_get_variable_dup(omember->channel, "video_banner_text", SWITCH_FALSE, -1))) { + layer_set_banner(omember, layer, var); + } + + var = NULL; + if (omember->video_logo || + (var = switch_channel_get_variable_dup(omember->channel, "video_logo_path", SWITCH_FALSE, -1))) { + layer_set_logo(omember, layer, var); + } + } + + layer->member_id = omember->id; + } + + if (!layer && omember->al) { + conf_api_sub_position(omember, NULL, "0:0:0"); + } + + use_img = omember->pcanvas_img; + + if (layer) { + + if (use_img && !omember->avatar_png_img) { + layer->avatar_patched = 0; + } else { + if (!layer->avatar_patched) { + scale_and_patch(layer, omember->avatar_png_img, SWITCH_FALSE); + layer->avatar_patched = 1; + } + use_img = NULL; + layer = NULL; + } + + if (layer) { + if (member_test_flag(imember, MFLAG_CAN_BE_SEEN)) { + layer->mute_patched = 0; + } else { + if (!layer->mute_patched) { + switch_image_t *tmp; + scale_and_patch(layer, imember->video_mute_img ? imember->video_mute_img : omember->pcanvas_img, SWITCH_FALSE); + tmp = switch_img_write_text_img(layer->screen_w, layer->screen_h, SWITCH_TRUE, "VIDEO MUTED"); + switch_img_patch(imember->canvas->img, tmp, layer->x_pos, layer->y_pos); + switch_img_free(&tmp); + layer->mute_patched = 1; + } + + use_img = NULL; + layer = NULL; + } + } + + if (layer && use_img) { + scale_and_patch(layer, use_img, SWITCH_FALSE); + } + } + + check_auto_bitrate(omember, layer); + } + + for (j = 0; j < file_count; j++) { + switch_image_t *img = file_imgs[j]; + + if (i < imember->canvas->total_layers) { + layer = &imember->canvas->layers[i++]; + scale_and_patch(layer, img, SWITCH_FALSE); + } + } + + switch_core_session_rwunlock(imember->session); + } + + switch_img_free(&normal_file_img); + switch_img_free(&async_file_img); + + for (imember = conference->members; imember; imember = imember->next) { + switch_frame_t *dupframe; + + if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO) || + switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { + continue; + } + + if (need_refresh) { + switch_core_session_request_video_refresh(imember->session); + } + + if (need_keyframe) { + switch_core_media_gen_key_frame(imember->session); + } + + switch_set_flag(&write_frame, SFF_RAW_RTP); + write_frame.img = imember->canvas->img; + write_frame.packet = packet; + write_frame.data = ((uint8_t *)packet) + 12; + write_frame.datalen = 0; + write_frame.buflen = SWITCH_RTP_MAX_BUF_LEN - 12; + write_frame.packetlen = 0; + + if (switch_frame_buffer_dup(imember->fb, &write_frame, &dupframe) == SWITCH_STATUS_SUCCESS) { + switch_queue_push(imember->mux_out_queue, dupframe); + dupframe = NULL; + } + + switch_core_session_rwunlock(imember->session); + } + + switch_mutex_unlock(conference->member_mutex); + } else { + + if (canvas->canvas_id == 0) { + if (conference->async_fnode) { + if (conference->async_fnode->layer_id > -1) { + patch_fnode(canvas, conference->async_fnode); + } else { + fnode_check_video(conference->async_fnode); + } + } + + if (conference->fnode) { + if (conference->fnode->layer_id > -1) { + patch_fnode(canvas, conference->fnode); + } else { + fnode_check_video(conference->fnode); + } + } + } + + if (!conference->playing_video_file) { + for (i = 0; i < canvas->total_layers; i++) { + mcu_layer_t *layer = &canvas->layers[i]; + + if (!layer->mute_patched && (layer->member_id > -1 || layer->fnode) && layer->cur_img && (layer->tagged || layer->geometry.overlap)) { + if (canvas->refresh) { + layer->refresh = 1; + canvas->refresh++; + } + + if (layer->cur_img) { + scale_and_patch(layer, NULL, SWITCH_FALSE); + } + + layer->tagged = 0; + } + + layer->bugged = 0; + } + } + + if (canvas->refresh > 1) { + canvas->refresh = 0; + } + + if (canvas->send_keyframe > 0) { + if (canvas->send_keyframe == 1 || (canvas->send_keyframe % 10) == 0) { + need_keyframe = SWITCH_TRUE; + need_refresh = SWITCH_TRUE; + } + canvas->send_keyframe--; + } + + if (video_key_freq && (now - last_key_time) > video_key_freq) { + need_keyframe = SWITCH_TRUE; + last_key_time = now; + } + + write_img = canvas->img; + timestamp = canvas->timer.samplecount; + + if (conference->playing_video_file) { + if (switch_core_file_read_video(&conference->fnode->fh, &write_frame, SVR_BLOCK | SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { + switch_img_free(&file_img); + + if (canvas->play_file) { + canvas->send_keyframe = 1; + canvas->play_file = 0; + + canvas->timer.interval = 1; + canvas->timer.samples = 90; + } + + write_img = file_img = write_frame.img; + + switch_core_timer_sync(&canvas->timer); + timestamp = canvas->timer.samplecount; + } + } else if (file_img) { + switch_img_free(&file_img); + } + + write_frame.img = write_img; + + if (conference->canvas_count == 1) { + check_video_recording(conference, &write_frame); + } + + if (conference->canvas_count > 1) { + switch_image_t *img_copy = NULL; + + switch_img_copy(write_img, &img_copy); + + if (switch_queue_trypush(canvas->video_queue, img_copy) != SWITCH_STATUS_SUCCESS) { + switch_img_free(&img_copy); + } + } + + if (min_members && conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) { + for (i = 0; write_codecs[i] && switch_core_codec_ready(&write_codecs[i]->codec) && i < MAX_MUX_CODECS; i++) { + write_codecs[i]->frame.img = write_img; + write_canvas_image_to_codec_group(conference, canvas, write_codecs[i], i, + timestamp, need_refresh, need_keyframe, need_reset); + + if (canvas->video_write_bandwidth) { + switch_core_codec_control(&write_codecs[i]->codec, SCC_VIDEO_BANDWIDTH, SCCT_INT, &canvas->video_write_bandwidth, NULL, NULL); + canvas->video_write_bandwidth = 0; + } + + } + } + + switch_mutex_lock(conference->member_mutex); + for (imember = conference->members; imember; imember = imember->next) { + switch_frame_t *dupframe; + + if (imember->watching_canvas_id != canvas->canvas_id) continue; + + if (conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING) && !member_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { + continue; + } + + if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO) || + switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { + continue; + } + + if (need_refresh) { + switch_core_session_request_video_refresh(imember->session); + } + + if (need_keyframe) { + switch_core_media_gen_key_frame(imember->session); + } + + switch_set_flag(&write_frame, SFF_RAW_RTP); + write_frame.img = write_img; + write_frame.packet = packet; + write_frame.data = ((uint8_t *)packet) + 12; + write_frame.datalen = 0; + write_frame.buflen = SWITCH_RTP_MAX_BUF_LEN - 12; + write_frame.packetlen = 0; + + //switch_core_session_write_video_frame(imember->session, &write_frame, SWITCH_IO_FLAG_NONE, 0); + + if (switch_frame_buffer_dup(imember->fb, &write_frame, &dupframe) == SWITCH_STATUS_SUCCESS) { + switch_queue_push(imember->mux_out_queue, dupframe); + dupframe = NULL; + } + + if (imember->session) { + switch_core_session_rwunlock(imember->session); + } + } + + switch_mutex_unlock(conference->member_mutex); + } // NOT PERSONAL + } + + switch_img_free(&file_img); + + for (i = 0; i < MCU_MAX_LAYERS; i++) { + layer = &canvas->layers[i]; + + switch_mutex_lock(canvas->mutex); + switch_img_free(&layer->cur_img); + switch_img_free(&layer->img); + layer->banner_patched = 0; + switch_img_free(&layer->banner_img); + switch_img_free(&layer->logo_img); + switch_img_free(&layer->logo_text_img); + switch_img_free(&layer->mute_img); + switch_mutex_unlock(canvas->mutex); + + if (layer->txthandle) { + switch_img_txt_handle_destroy(&layer->txthandle); + } + } + + for (i = 0; i < MAX_MUX_CODECS; i++) { + if (write_codecs[i] && switch_core_codec_ready(&write_codecs[i]->codec)) { + switch_core_codec_destroy(&write_codecs[i]->codec); + } + } + + switch_core_timer_destroy(&canvas->timer); + destroy_canvas(&canvas); + + return NULL; +} + +static void pop_next_canvas_image(mcu_canvas_t *canvas, switch_image_t **imgP) +{ + switch_image_t *img = *imgP; + int size = 0; + void *pop; + + switch_img_free(&img); + + do { + if (switch_queue_trypop(canvas->video_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) { + switch_img_free(&img); + img = (switch_image_t *)pop; + } else { + break; + } + size = switch_queue_size(canvas->video_queue); + } while(size > canvas->conference->video_fps.fps / 2); + + *imgP = img; +} + +static void *SWITCH_THREAD_FUNC conference_super_video_muxing_thread_run(switch_thread_t *thread, void *obj) +{ + mcu_canvas_t *canvas = (mcu_canvas_t *) obj; + conference_obj_t *conference = canvas->conference; + conference_member_t *imember; + switch_codec_t *check_codec = NULL; + codec_set_t *write_codecs[MAX_MUX_CODECS] = { 0 }; + int buflen = SWITCH_RTP_MAX_BUF_LEN; + int i = 0; + switch_time_t last_key_time = 0; + uint32_t video_key_freq = 10000000; + mcu_layer_t *layer = NULL; + switch_frame_t write_frame = { 0 }; + uint8_t *packet = NULL; + switch_image_t *write_img = NULL; + uint32_t timestamp = 0; + int last_used_canvases[MAX_CANVASES] = { 0 }; + + + canvas->video_timer_reset = 1; + + packet = switch_core_alloc(conference->pool, SWITCH_RTP_MAX_BUF_LEN); + + while (globals.running && !conference_test_flag(conference, CFLAG_DESTRUCT) && conference_test_flag(conference, CFLAG_VIDEO_MUXING)) { + switch_bool_t need_refresh = SWITCH_FALSE, need_keyframe = SWITCH_FALSE, need_reset = SWITCH_FALSE; + switch_time_t now; + int min_members = 0; + int count_changed = 0; + int layer_idx = 0, j = 0; + switch_image_t *img = NULL; + int used_canvases = 0; + + switch_mutex_lock(canvas->mutex); + if (canvas->new_vlayout) { + init_canvas_layers(conference, canvas, NULL); + } + switch_mutex_unlock(canvas->mutex); + + if (canvas->video_timer_reset) { + canvas->video_timer_reset = 0; + + if (canvas->timer.interval) { + switch_core_timer_destroy(&canvas->timer); + } + + switch_core_timer_init(&canvas->timer, "soft", conference->video_fps.ms, conference->video_fps.samples, NULL); + canvas->send_keyframe = 1; } - if (conference->canvas->refresh > 1) { - conference->canvas->refresh = 0; + if (!conference->playing_video_file) { + switch_core_timer_next(&canvas->timer); } - if (conference->canvas->send_keyframe) { - need_keyframe = SWITCH_TRUE; - need_refresh = SWITCH_TRUE; - conference->canvas->send_keyframe = 0; + now = switch_micro_time_now(); + + if (canvas->send_keyframe > 0) { + if (canvas->send_keyframe == 1 || (canvas->send_keyframe % 10) == 0) { + need_keyframe = SWITCH_TRUE; + need_refresh = SWITCH_TRUE; + } + canvas->send_keyframe--; } if (video_key_freq && (now - last_key_time) > video_key_freq) { need_keyframe = SWITCH_TRUE; last_key_time = now; } - - write_img = conference->canvas->img; - timestamp = conference->canvas->timer.samplecount; - if (conference->playing_video_file) { - if (switch_core_file_read_video(&conference->fnode->fh, &write_frame, SVR_BLOCK | SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { - switch_img_free(&file_img); + for (j = 0; j < conference->canvas_count; j++) { + mcu_canvas_t *jcanvas = (mcu_canvas_t *) conference->canvases[j]; - if (conference->canvas->play_file) { - conference->canvas->send_keyframe = 1; - conference->canvas->play_file = 0; - - conference->canvas->timer.interval = 1; - conference->canvas->timer.samples = 90; - } - - write_img = file_img = write_frame.img; - - switch_core_timer_sync(&conference->canvas->timer); - timestamp = conference->canvas->timer.samplecount; + if (jcanvas->layers_used > 0 || conference->super_canvas_show_all_layers) { + used_canvases++; } - } else if (file_img) { - switch_img_free(&file_img); + + if (jcanvas->layers_used != last_used_canvases[j]) { + count_changed++; + } + + last_used_canvases[j] = jcanvas->layers_used; } + + if (count_changed) { + int total = used_canvases; + layout_group_t *lg = NULL; + video_layout_t *vlayout = NULL; - write_frame.img = write_img; - check_video_recording(conference, &write_frame); + if (total < 1) total = 1; - if (min_members && switch_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) { - for (i = 0; write_codecs[i] && switch_core_codec_ready(&write_codecs[i]->codec) && i < MAX_MUX_CODECS; i++) { - write_codecs[i]->frame.img = write_img; - write_canvas_image_to_codec_group(conference, write_codecs[i], i, - timestamp, need_refresh, need_keyframe, need_reset); - - if (conference->video_write_bandwidth) { - switch_core_codec_control(&write_codecs[i]->codec, SCC_VIDEO_BANDWIDTH, SCCT_INT, &conference->video_write_bandwidth, NULL, NULL); - conference->video_write_bandwidth = 0; + if ((lg = switch_core_hash_find(conference->layout_group_hash, CONFERENCE_MUX_DEFAULT_SUPER_LAYOUT))) { + if ((vlayout = find_best_layout(conference, lg, total))) { + init_canvas_layers(conference, canvas, vlayout); } - } } + switch_mutex_lock(conference->member_mutex); + + for (imember = conference->members; imember; imember = imember->next) { + int i; + + if (!imember->session || (!switch_channel_test_flag(imember->channel, CF_VIDEO) && !imember->avatar_png_img) || + conference_test_flag(conference, CFLAG_PERSONAL_CANVAS) || switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { + continue; + } + + if (imember->watching_canvas_id == canvas->canvas_id && switch_channel_test_flag(imember->channel, CF_VIDEO_REFRESH_REQ)) { + switch_channel_clear_flag(imember->channel, CF_VIDEO_REFRESH_REQ); + need_keyframe = SWITCH_TRUE; + } + + if (conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING) && + imember->watching_canvas_id > -1 && imember->watching_canvas_id == canvas->canvas_id && + !member_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { + min_members++; + + if (switch_channel_test_flag(imember->channel, CF_VIDEO)) { + if (imember->video_codec_index < 0 && (check_codec = switch_core_session_get_video_write_codec(imember->session))) { + for (i = 0; write_codecs[i] && switch_core_codec_ready(&write_codecs[i]->codec) && i < MAX_MUX_CODECS; i++) { + if (check_codec->implementation->codec_id == write_codecs[i]->codec.implementation->codec_id) { + imember->video_codec_index = i; + imember->video_codec_id = check_codec->implementation->codec_id; + need_refresh = SWITCH_TRUE; + break; + } + } + + if (imember->video_codec_index < 0) { + write_codecs[i] = switch_core_alloc(conference->pool, sizeof(codec_set_t)); + + if (switch_core_codec_copy(check_codec, &write_codecs[i]->codec, + &conference->video_codec_settings, conference->pool) == SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Setting up video write codec %s at slot %d\n", write_codecs[i]->codec.implementation->iananame, i); + + imember->video_codec_index = i; + imember->video_codec_id = check_codec->implementation->codec_id; + need_refresh = SWITCH_TRUE; + write_codecs[i]->frame.packet = switch_core_alloc(conference->pool, buflen); + write_codecs[i]->frame.data = ((uint8_t *)write_codecs[i]->frame.packet) + 12; + write_codecs[i]->frame.packetlen = buflen; + write_codecs[i]->frame.buflen = buflen - 12; + switch_set_flag((&write_codecs[i]->frame), SFF_RAW_RTP); + + } + } + } + + if (imember->video_codec_index < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Write Codec Error\n"); + switch_core_session_rwunlock(imember->session); + continue; + } + } + } + + switch_core_session_rwunlock(imember->session); + } + + switch_mutex_unlock(conference->member_mutex); + + layer_idx = 0; + + for (j = 0; j < conference->canvas_count; j++) { + mcu_canvas_t *jcanvas = (mcu_canvas_t *) conference->canvases[j]; + + pop_next_canvas_image(jcanvas, &img); + + if (!jcanvas->layers_used && !conference->super_canvas_show_all_layers) { + switch_img_free(&img); + continue; + } + + if (layer_idx < canvas->total_layers) { + layer = &canvas->layers[layer_idx++]; + + if (layer->member_id != jcanvas->canvas_id) { + layer->member_id = jcanvas->canvas_id; + switch_img_free(&layer->cur_img); + } + + if (canvas->refresh) { + layer->refresh = 1; + canvas->refresh++; + } + + if (img) { + + if (conference->super_canvas_label_layers) { + char str[80] = ""; + switch_image_t *tmp; + const char *format = "#cccccc:#142e55:FreeSans.ttf:4%:"; + + switch_snprintf(str, sizeof(str), "%sCanvas %d", format, jcanvas->canvas_id + 1); + tmp = switch_img_write_text_img(img->d_w, img->d_h, SWITCH_TRUE, str); + switch_img_patch(img, tmp, 0, 0); + switch_img_free(&tmp); + } + + switch_img_free(&layer->cur_img); + layer->cur_img = img; + img = NULL; + } + + scale_and_patch(layer, NULL, SWITCH_FALSE); + } + + switch_img_free(&img); + } + + if (canvas->refresh > 1) { + canvas->refresh = 0; + } + + write_img = canvas->img; + timestamp = canvas->timer.samplecount; + + if (!write_img) continue; + + write_frame.img = write_img; + check_video_recording(conference, &write_frame); + + if (min_members && conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) { + for (i = 0; write_codecs[i] && switch_core_codec_ready(&write_codecs[i]->codec) && i < MAX_MUX_CODECS; i++) { + write_codecs[i]->frame.img = write_img; + write_canvas_image_to_codec_group(conference, canvas, write_codecs[i], i, timestamp, need_refresh, need_keyframe, need_reset); + + if (canvas->video_write_bandwidth) { + switch_core_codec_control(&write_codecs[i]->codec, SCC_VIDEO_BANDWIDTH, SCCT_INT, &canvas->video_write_bandwidth, NULL, NULL); + canvas->video_write_bandwidth = 0; + } + } + } + switch_mutex_lock(conference->member_mutex); for (imember = conference->members; imember; imember = imember->next) { switch_frame_t *dupframe; - if (switch_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING) && !switch_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { + if (imember->watching_canvas_id != canvas->canvas_id) continue; + + if (conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING) && !member_test_flag(imember, MFLAG_NO_MINIMIZE_ENCODING)) { continue; } @@ -2441,15 +3325,13 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread } } - switch_mutex_unlock(conference->member_mutex); + switch_mutex_unlock(conference->member_mutex); } - switch_img_free(&file_img); - for (i = 0; i < MCU_MAX_LAYERS; i++) { - layer = &conference->canvas->layers[i]; + layer = &canvas->layers[i]; - switch_mutex_lock(conference->canvas->mutex); + switch_mutex_lock(canvas->mutex); switch_img_free(&layer->cur_img); switch_img_free(&layer->img); layer->banner_patched = 0; @@ -2457,7 +3339,7 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread switch_img_free(&layer->logo_img); switch_img_free(&layer->logo_text_img); switch_img_free(&layer->mute_img); - switch_mutex_unlock(conference->canvas->mutex); + switch_mutex_unlock(canvas->mutex); if (layer->txthandle) { switch_img_txt_handle_destroy(&layer->txthandle); @@ -2470,8 +3352,8 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread } } - switch_core_timer_destroy(&conference->canvas->timer); - destroy_canvas(&conference->canvas); + switch_core_timer_destroy(&canvas->timer); + destroy_canvas(&canvas); return NULL; } @@ -2513,14 +3395,14 @@ static void gen_arc(conference_obj_t *conference, switch_stream_handle_t *stream switch_mutex_lock(conference->member_mutex); for (member = conference->members; member; member = member->next) { - if (member->channel && switch_test_flag(member, MFLAG_CAN_SPEAK) && !switch_test_flag(member, MFLAG_NO_POSITIONAL)) { + if (member->channel && member_test_flag(member, MFLAG_CAN_SPEAK) && !member_test_flag(member, MFLAG_NO_POSITIONAL)) { count++; } } if (count < 3) { for (member = conference->members; member; member = member->next) { - if (member->channel && !switch_test_flag(member, MFLAG_NO_POSITIONAL) && member->al) { + if (member->channel && !member_test_flag(member, MFLAG_NO_POSITIONAL) && member->al) { member->al->pos_x = 0; member->al->pos_y = 0; @@ -2547,14 +3429,14 @@ static void gen_arc(conference_obj_t *conference, switch_stream_handle_t *stream for (member = conference->members; member; member = member->next) { - if (!member->channel || switch_test_flag(member, MFLAG_NO_POSITIONAL) || !switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (!member->channel || member_test_flag(member, MFLAG_NO_POSITIONAL) || !member_test_flag(member, MFLAG_CAN_SPEAK)) { continue; } if (!member->al) { member->al = create_al(member->pool); } - switch_set_flag(member, MFLAG_POSITIONAL); + member_set_flag(member, MFLAG_POSITIONAL); if (pos == 0) { x = 0; @@ -2680,7 +3562,7 @@ static void conference_cdr_del(conference_member_t *member) } if (member->cdr_node) { member->cdr_node->leave_time = switch_epoch_time_now(NULL); - member->cdr_node->flags = member->flags; + memcpy(member->cdr_node->mflags, member->flags, sizeof(member->flags)); member->cdr_node->member = NULL; } } @@ -2740,12 +3622,12 @@ static const char *audio_flow(conference_member_t *member) { const char *flow = "sendrecv"; - if (!switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (!member_test_flag(member, MFLAG_CAN_SPEAK)) { flow = "recvonly"; } if (member->channel && switch_channel_test_flag(member->channel, CF_HOLD)) { - flow = switch_test_flag(member, MFLAG_CAN_SPEAK) ? "sendonly" : "inactive"; + flow = member_test_flag(member, MFLAG_CAN_SPEAK) ? "sendonly" : "inactive"; } return flow; @@ -3070,7 +3952,7 @@ static void conference_cdr_render(conference_obj_t *conference) if (!(x_ptr = switch_xml_add_child_d(x_conference, "end_time", conf_off++))) { abort(); } - switch_xml_set_attr_d(x_ptr, "endconf_forced", switch_test_flag(conference, CFLAG_ENDCONF_FORCED) ? "true" : "false"); + switch_xml_set_attr_d(x_ptr, "endconf_forced", conference_test_flag(conference, CFLAG_ENDCONF_FORCED) ? "true" : "false"); switch_xml_set_attr_d(x_ptr, "type", "UNIX-epoch"); switch_snprintf(str, sizeof(str), "%ld", (long)conference->end_time); switch_xml_set_txt_d(x_ptr, str); @@ -3112,16 +3994,16 @@ static void conference_cdr_render(conference_obj_t *conference) switch_assert(x_flags); x_tag = switch_xml_add_child_d(x_flags, "is_moderator", flag_off++); - switch_xml_set_txt_d(x_tag, switch_test_flag(np, MFLAG_MOD) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, cdr_test_mflag(np, MFLAG_MOD) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "end_conference", flag_off++); - switch_xml_set_txt_d(x_tag, switch_test_flag(np, MFLAG_ENDCONF) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, cdr_test_mflag(np, MFLAG_ENDCONF) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "was_kicked", flag_off++); - switch_xml_set_txt_d(x_tag, switch_test_flag(np, MFLAG_KICKED) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, cdr_test_mflag(np, MFLAG_KICKED) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "is_ghost", flag_off++); - switch_xml_set_txt_d(x_tag, switch_test_flag(np, MFLAG_GHOST) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, cdr_test_mflag(np, MFLAG_GHOST) ? "true" : "false"); if (!(x_cp = switch_xml_add_child_d(x_member, "caller_profile", member_off++))) { abort(); @@ -3429,7 +4311,7 @@ static void conference_mod_event_channel_handler(const char *event_channel, cJSO } } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ALERT, "conf %s CMD %s [%s] %d\n", conf_name, key, action, cid); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "conf %s CMD %s [%s] %d\n", conf_name, key, action, cid); if (zstr(action)) { goto end; @@ -3443,21 +4325,26 @@ static void conference_mod_event_channel_handler(const char *event_channel, cJSO !strcasecmp(action, "tmute") || !strcasecmp(action, "vmute") || !strcasecmp(action, "unvmute") || - !strcasecmp(action, "tvmute") + !strcasecmp(action, "tvmute") ) { exec = switch_mprintf("%s %s %d", conf_name, action, cid); } else if (!strcasecmp(action, "volume_in") || !strcasecmp(action, "volume_out") || !strcasecmp(action, "vid-res-id") || !strcasecmp(action, "vid-floor") || + !strcasecmp(action, "vid-layer") || + !strcasecmp(action, "vid-canvas") || + !strcasecmp(action, "vid-watching-canvas") || !strcasecmp(action, "vid-banner")) { exec = switch_mprintf("%s %s %d %s", conf_name, action, cid, argv[0]); } else if (!strcasecmp(action, "play") || !strcasecmp(action, "stop")) { exec = switch_mprintf("%s %s %s", conf_name, action, argv[0]); } else if (!strcasecmp(action, "recording") || !strcasecmp(action, "vid-layout") || !strcasecmp(action, "vid-write-png")) { + if (!argv[1]) { argv[1] = "all"; } + exec = switch_mprintf("%s %s %s %s", conf_name, action, argv[0], argv[1]); } else if (!strcasecmp(action, "transfer") && cid) { @@ -3624,14 +4511,14 @@ static switch_status_t conference_add_event_member_data(conference_member_t *mem } - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Hear", "%s", switch_test_flag(member, MFLAG_CAN_HEAR) ? "true" : "false" ); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "See", "%s", switch_test_flag(member, MFLAG_CAN_BE_SEEN) ? "true" : "false" ); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Speak", "%s", switch_test_flag(member, MFLAG_CAN_SPEAK) ? "true" : "false" ); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Talking", "%s", switch_test_flag(member, MFLAG_TALKING) ? "true" : "false" ); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Mute-Detect", "%s", switch_test_flag(member, MFLAG_MUTE_DETECT) ? "true" : "false" ); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Hear", "%s", member_test_flag(member, MFLAG_CAN_HEAR) ? "true" : "false" ); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "See", "%s", member_test_flag(member, MFLAG_CAN_BE_SEEN) ? "true" : "false" ); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Speak", "%s", member_test_flag(member, MFLAG_CAN_SPEAK) ? "true" : "false" ); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Talking", "%s", member_test_flag(member, MFLAG_TALKING) ? "true" : "false" ); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Mute-Detect", "%s", member_test_flag(member, MFLAG_MUTE_DETECT) ? "true" : "false" ); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-ID", "%u", member->id); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-Type", "%s", switch_test_flag(member, MFLAG_MOD) ? "moderator" : "member"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-Ghost", "%s", switch_test_flag(member, MFLAG_GHOST) ? "true" : "false"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-Type", "%s", member_test_flag(member, MFLAG_MOD) ? "moderator" : "member"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-Ghost", "%s", member_test_flag(member, MFLAG_GHOST) ? "true" : "false"); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Energy-Level", "%d", member->energy_level); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Current-Energy", "%d", member->score); @@ -3691,7 +4578,7 @@ static conference_member_t *conference_member_get(conference_obj_t *conference, switch_mutex_lock(conference->member_mutex); for (member = conference->members; member; member = member->next) { - if (switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (member_test_flag(member, MFLAG_NOCHANNEL)) { continue; } @@ -3701,8 +4588,8 @@ static conference_member_t *conference_member_get(conference_obj_t *conference, } if (member) { - if (!switch_test_flag(member, MFLAG_INTREE) || - switch_test_flag(member, MFLAG_KICKED) || + if (!member_test_flag(member, MFLAG_INTREE) || + member_test_flag(member, MFLAG_KICKED) || (member->session && !switch_channel_up(switch_core_session_get_channel(member->session)))) { /* member is kicked or hanging up so forget it */ @@ -3731,15 +4618,15 @@ static switch_status_t conference_record_stop(conference_obj_t *conference, swit switch_assert(conference != NULL); switch_mutex_lock(conference->member_mutex); for (member = conference->members; member; member = member->next) { - if (switch_test_flag(member, MFLAG_NOCHANNEL) && (!path || !strcmp(path, member->rec_path))) { - if (!switch_test_flag(conference, CFLAG_CONF_RESTART_AUTO_RECORD) && member->rec && member->rec->autorec) { + if (member_test_flag(member, MFLAG_NOCHANNEL) && (!path || !strcmp(path, member->rec_path))) { + if (!conference_test_flag(conference, CFLAG_CONF_RESTART_AUTO_RECORD) && member->rec && member->rec->autorec) { stream->write_function(stream, "Stopped AUTO recording file %s (Auto Recording Now Disabled)\n", member->rec_path); conference->auto_record = 0; } else { stream->write_function(stream, "Stopped recording file %s\n", member->rec_path); } - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_clear_flag_locked(member, MFLAG_RUNNING); count++; } @@ -3761,21 +4648,21 @@ static switch_status_t conference_record_action(conference_obj_t *conference, ch switch_mutex_lock(conference->member_mutex); for (member = conference->members; member; member = member->next) { - if (switch_test_flag(member, MFLAG_NOCHANNEL) && (!path || !strcmp(path, member->rec_path))) + if (member_test_flag(member, MFLAG_NOCHANNEL) && (!path || !strcmp(path, member->rec_path))) { //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Action: %d\n", action); switch (action) { case REC_ACTION_STOP: - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_clear_flag_locked(member, MFLAG_RUNNING); count++; break; case REC_ACTION_PAUSE: - switch_set_flag_locked(member, MFLAG_PAUSE_RECORDING); + member_set_flag_locked(member, MFLAG_PAUSE_RECORDING); count = 1; break; case REC_ACTION_RESUME: - switch_clear_flag_locked(member, MFLAG_PAUSE_RECORDING); + member_clear_flag_locked(member, MFLAG_PAUSE_RECORDING); count = 1; break; } @@ -3833,9 +4720,9 @@ static switch_status_t member_del_relationship(conference_member_t *member, uint } if ((rel->flags & RFLAG_CAN_SEND_VIDEO)) { - switch_clear_flag(member, MFLAG_RECEIVING_VIDEO); + member_clear_flag(member, MFLAG_RECEIVING_VIDEO); if ((omember = conference_member_get(member->conference, rel->id))) { - switch_clear_flag(omember, MFLAG_RECEIVING_VIDEO); + member_clear_flag(omember, MFLAG_RECEIVING_VIDEO); switch_thread_rwlock_unlock(omember->rwlock); } } @@ -3860,7 +4747,7 @@ static void send_json_event(conference_obj_t *conference) char *name = NULL, *domain = NULL, *dup_domain = NULL; char *event_channel = NULL; - if (!switch_test_flag(conference, CFLAG_JSON_EVENTS)) { + if (!conference_test_flag(conference, CFLAG_JSON_EVENTS)) { return; } @@ -3896,7 +4783,7 @@ static void send_rfc_event(conference_obj_t *conference) char *body; char *name = NULL, *domain = NULL, *dup_domain = NULL; - if (!switch_test_flag(conference, CFLAG_RFC4579)) { + if (!conference_test_flag(conference, CFLAG_RFC4579)) { return; } @@ -3935,7 +4822,7 @@ static void send_conference_notify(conference_obj_t *conference, const char *sta switch_event_t *event; char *name = NULL, *domain = NULL, *dup_domain = NULL; - if (!switch_test_flag(conference, CFLAG_RFC4579)) { + if (!conference_test_flag(conference, CFLAG_RFC4579)) { return; } @@ -3978,18 +4865,19 @@ static void member_update_status_field(conference_member_t *member) char *str, *vstr = "", display[128] = "", *json_display = NULL; cJSON *json, *audio, *video; - if (!member->conference->la || !member->json || !member->status_field || switch_channel_test_flag(member->channel, CF_VIDEO_ONLY)) { + if (!member->conference->la || !member->json || + !member->status_field || switch_channel_test_flag(member->channel, CF_VIDEO_ONLY) || member_test_flag(member, MFLAG_SECOND_SCREEN)) { return; } switch_live_array_lock(member->conference->la); - if (switch_test_flag(member->conference, CFLAG_JSON_STATUS)) { + if (conference_test_flag(member->conference, CFLAG_JSON_STATUS)) { json = cJSON_CreateObject(); audio = cJSON_CreateObject(); - cJSON_AddItemToObject(audio, "muted", cJSON_CreateBool(!switch_test_flag(member, MFLAG_CAN_SPEAK))); + cJSON_AddItemToObject(audio, "muted", cJSON_CreateBool(!member_test_flag(member, MFLAG_CAN_SPEAK))); cJSON_AddItemToObject(audio, "onHold", cJSON_CreateBool(switch_channel_test_flag(member->channel, CF_HOLD))); - cJSON_AddItemToObject(audio, "talking", cJSON_CreateBool(switch_test_flag(member, MFLAG_TALKING))); + cJSON_AddItemToObject(audio, "talking", cJSON_CreateBool(member_test_flag(member, MFLAG_TALKING))); cJSON_AddItemToObject(audio, "floor", cJSON_CreateBool(member == member->conference->floor_holder)); cJSON_AddItemToObject(audio, "energyScore", cJSON_CreateNumber(member->score)); cJSON_AddItemToObject(json, "audio", audio); @@ -3998,9 +4886,9 @@ static void member_update_status_field(conference_member_t *member) video = cJSON_CreateObject(); cJSON_AddItemToObject(video, "avatarPresented", cJSON_CreateBool(!!member->avatar_png_img)); cJSON_AddItemToObject(video, "mediaFlow", cJSON_CreateString(member->video_flow == SWITCH_MEDIA_FLOW_SENDONLY ? "sendOnly" : "sendRecv")); - cJSON_AddItemToObject(video, "muted", cJSON_CreateBool(!switch_test_flag(member, MFLAG_CAN_BE_SEEN))); + cJSON_AddItemToObject(video, "muted", cJSON_CreateBool(!member_test_flag(member, MFLAG_CAN_BE_SEEN))); cJSON_AddItemToObject(video, "floor", cJSON_CreateBool(member && member->id == member->conference->video_floor_holder)); - if (member && member->id == member->conference->video_floor_holder && switch_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK)) { + if (member && member->id == member->conference->video_floor_holder && conference_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK)) { cJSON_AddItemToObject(video, "floorLocked", cJSON_CreateTrue()); } cJSON_AddItemToObject(video, "reservationID", member->video_reservation_id ? @@ -4016,24 +4904,24 @@ static void member_update_status_field(conference_member_t *member) json_display = cJSON_PrintUnformatted(json); cJSON_Delete(json); } else { - if (!switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (!member_test_flag(member, MFLAG_CAN_SPEAK)) { str = "MUTE"; } else if (switch_channel_test_flag(member->channel, CF_HOLD)) { str = "HOLD"; } else if (member == member->conference->floor_holder) { - if (switch_test_flag(member, MFLAG_TALKING)) { + if (member_test_flag(member, MFLAG_TALKING)) { str = "TALKING (FLOOR)"; } else { str = "FLOOR"; } - } else if (switch_test_flag(member, MFLAG_TALKING)) { + } else if (member_test_flag(member, MFLAG_TALKING)) { str = "TALKING"; } else { str = "ACTIVE"; } if (switch_channel_test_flag(member->channel, CF_VIDEO)) { - if (!switch_test_flag(member, MFLAG_CAN_BE_SEEN)) { + if (!member_test_flag(member, MFLAG_CAN_BE_SEEN)) { vstr = " VIDEO (BLIND)"; } else { vstr = " VIDEO"; @@ -4059,11 +4947,20 @@ static void member_update_status_field(conference_member_t *member) static void adv_la(conference_obj_t *conference, conference_member_t *member, switch_bool_t join) { - if (conference && conference->la && member->session && !switch_channel_test_flag(member->channel, CF_VIDEO_ONLY)) { + + //if (member->video_flow == SWITCH_MEDIA_FLOW_SENDONLY) { + switch_channel_set_flag(member->channel, CF_VIDEO_REFRESH_REQ); + switch_core_media_gen_key_frame(member->session); + //} + + if (conference && conference->la && member->session && + !switch_channel_test_flag(member->channel, CF_VIDEO_ONLY)) { cJSON *msg, *data; const char *uuid = switch_core_session_get_uuid(member->session); const char *cookie = switch_channel_get_variable(member->channel, "event_channel_cookie"); const char *event_channel = cookie ? cookie : uuid; + switch_event_t *variables; + switch_event_header_t *hp; msg = cJSON_CreateObject(); data = json_add_child_obj(msg, "pvtData", NULL); @@ -4074,12 +4971,29 @@ static void adv_la(conference_obj_t *conference, conference_member_t *member, sw cJSON_AddItemToObject(data, "action", cJSON_CreateString(join ? "conference-liveArray-join" : "conference-liveArray-part")); cJSON_AddItemToObject(data, "laChannel", cJSON_CreateString(conference->la_event_channel)); cJSON_AddItemToObject(data, "laName", cJSON_CreateString(conference->la_name)); - cJSON_AddItemToObject(data, "role", cJSON_CreateString(switch_test_flag(member, MFLAG_MOD) ? "moderator" : "participant")); + cJSON_AddItemToObject(data, "role", cJSON_CreateString(member_test_flag(member, MFLAG_MOD) ? "moderator" : "participant")); cJSON_AddItemToObject(data, "chatID", cJSON_CreateString(conference->chat_id)); - if (switch_test_flag(member, MFLAG_MOD)) { + cJSON_AddItemToObject(data, "canvasCount", cJSON_CreateNumber(conference->canvas_count)); + + if (member_test_flag(member, MFLAG_SECOND_SCREEN)) { + cJSON_AddItemToObject(data, "secondScreen", cJSON_CreateTrue()); + } + + if (member_test_flag(member, MFLAG_MOD)) { cJSON_AddItemToObject(data, "modChannel", cJSON_CreateString(conference->mod_event_channel)); } + switch_core_get_variables(&variables); + for (hp = variables->headers; hp; hp = hp->next) { + if (!strncasecmp(hp->name, "conf_verto_", 11)) { + char *var = hp->name + 11; + if (var) { + cJSON_AddItemToObject(data, var, cJSON_CreateString(hp->value)); + } + } + } + switch_event_destroy(&variables); + switch_event_channel_broadcast(event_channel, &msg, modname, globals.event_channel_id); if (cookie) { @@ -4144,8 +5058,6 @@ static void find_video_floor(conference_member_t *member, switch_bool_t entering { conference_member_t *imember; conference_obj_t *conference = member->conference; - layout_group_t *lg = NULL; - video_layout_t *vlayout = NULL; if (!entering) { if (member->id == conference->video_floor_holder) { @@ -4196,17 +5108,14 @@ static void find_video_floor(conference_member_t *member, switch_bool_t entering if (conference->last_video_floor_holder == conference->video_floor_holder) { conference->last_video_floor_holder = 0; } - - if (conference->canvas && conference->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, conference->video_layout_group))) { - if ((vlayout = find_best_layout(conference, lg))) { - switch_mutex_lock(conference->member_mutex); - conference->canvas->new_vlayout = vlayout; - switch_mutex_unlock(conference->member_mutex); - } - } - } +static void reset_member_codec_index(conference_member_t *member) +{ + member->video_codec_index = -1; +} + + /* Gain exclusive access and add the member to the list */ static switch_status_t conference_add_member(conference_obj_t *conference, conference_member_t *member) { @@ -4238,24 +5147,39 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe member->score_iir = 0; member->verbose_events = conference->verbose_events; member->video_layer_id = -1; - member->video_codec_index = -1; + switch_queue_create(&member->dtmf_queue, 100, member->pool); + if (conference_test_flag(conference, CFLAG_PERSONAL_CANVAS)) { + video_layout_t *vlayout = NULL; + + switch_mutex_lock(conference->canvas_mutex); + if ((vlayout = get_layout(conference, conference->video_layout_name, conference->video_layout_group))) { + init_canvas(conference, vlayout, &member->canvas); + init_canvas_layers(conference, member->canvas, vlayout); + } + switch_mutex_unlock(conference->canvas_mutex); + } + + if (member->video_flow == SWITCH_MEDIA_FLOW_SENDONLY) { + member_clear_flag_locked(member, MFLAG_CAN_BE_SEEN); + } + conference->members = member; - switch_set_flag_locked(member, MFLAG_INTREE); + member_set_flag_locked(member, MFLAG_INTREE); switch_mutex_unlock(conference->member_mutex); conference_cdr_add(member); - if (!switch_test_flag(member, MFLAG_NOCHANNEL)) { - if (switch_test_flag(member, MFLAG_GHOST)) { + if (!member_test_flag(member, MFLAG_NOCHANNEL)) { + if (member_test_flag(member, MFLAG_GHOST)) { conference->count_ghosts++; } else { conference->count++; } - if (switch_test_flag(member, MFLAG_ENDCONF)) { + if (member_test_flag(member, MFLAG_ENDCONF)) { if (conference->end_count++) { conference->endconf_time = 0; } @@ -4268,6 +5192,27 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe check_avatar(member, SWITCH_FALSE); + if ((var = switch_channel_get_variable_dup(member->channel, "video_initial_canvas", SWITCH_FALSE, -1))) { + int id = atoi(var) - 1; + if (id < conference->canvas_count) { + member->canvas_id = id; + } + } + + if ((var = switch_channel_get_variable_dup(member->channel, "video_initial_watching_canvas", SWITCH_FALSE, -1))) { + int id = atoi(var) - 1; + + if (id == 0) { + id = conference->canvas_count; + } + + if (id <= conference->canvas_count && conference->canvases[id]) { + member->watching_canvas_id = id; + } + } + + reset_member_codec_index(member); + if ((var = switch_channel_get_variable_dup(member->channel, "video_mute_png", SWITCH_FALSE, -1))) { member->video_mute_png = switch_core_strdup(member->pool, var); member->video_mute_img = switch_img_read_png(member->video_mute_png, SWITCH_IMG_FMT_I420); @@ -4278,12 +5223,12 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe } if ((var = switch_channel_get_variable(channel, "video_use_dedicated_encoder")) && switch_true(var)) { - switch_set_flag_locked(member, MFLAG_NO_MINIMIZE_ENCODING); + member_set_flag_locked(member, MFLAG_NO_MINIMIZE_ENCODING); } switch_channel_set_variable_printf(channel, "conference_member_id", "%d", member->id); - switch_channel_set_variable_printf(channel, "conference_moderator", "%s", switch_test_flag(member, MFLAG_MOD) ? "true" : "false"); - switch_channel_set_variable_printf(channel, "conference_ghost", "%s", switch_test_flag(member, MFLAG_GHOST) ? "true" : "false"); + switch_channel_set_variable_printf(channel, "conference_moderator", "%s", member_test_flag(member, MFLAG_MOD) ? "true" : "false"); + switch_channel_set_variable_printf(channel, "conference_ghost", "%s", member_test_flag(member, MFLAG_GHOST) ? "true" : "false"); switch_channel_set_variable(channel, "conference_recording", conference->record_filename); switch_channel_set_variable(channel, CONFERENCE_UUID_VARIABLE, conference->uuid_str); @@ -4299,20 +5244,20 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe } - if (switch_test_flag(conference, CFLAG_WAIT_MOD) && switch_test_flag(member, MFLAG_MOD)) { - switch_clear_flag(conference, CFLAG_WAIT_MOD); + if (conference_test_flag(conference, CFLAG_WAIT_MOD) && member_test_flag(member, MFLAG_MOD)) { + conference_clear_flag(conference, CFLAG_WAIT_MOD); } if (conference->count > 1) { - if ((conference->moh_sound && !switch_test_flag(conference, CFLAG_WAIT_MOD)) || - (switch_test_flag(conference, CFLAG_WAIT_MOD) && !switch_true(switch_channel_get_variable(channel, "conference_permanent_wait_mod_moh")))) { + if ((conference->moh_sound && !conference_test_flag(conference, CFLAG_WAIT_MOD)) || + (conference_test_flag(conference, CFLAG_WAIT_MOD) && !switch_true(switch_channel_get_variable(channel, "conference_permanent_wait_mod_moh")))) { /* stop MoH if any */ conference_stop_file(conference, FILE_STOP_ASYNC); } if (!switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_REQ) && !zstr(conference->enter_sound)) { - const char * enter_sound = switch_channel_get_variable(channel, "conference_enter_sound"); - if (switch_test_flag(conference, CFLAG_ENTER_SOUND)) { + const char * enter_sound = switch_channel_get_variable(channel, "conference_enter_sound"); + if (conference_test_flag(conference, CFLAG_ENTER_SOUND) && !member_test_flag(member, MFLAG_SILENT)) { if (!zstr(enter_sound)) { conference_play_file(conference, (char *)enter_sound, CONF_DEFAULT_LEADIN, switch_core_session_get_channel(member->session), 0); @@ -4337,10 +5282,10 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe if (conference->count >= conference->announce_count && conference->announce_count > 1) { switch_snprintf(msg, sizeof(msg), "There are %d callers", conference->count); conference_member_say(member, msg, CONF_DEFAULT_LEADIN); - } else if (conference->count == 1 && !conference->perpetual_sound && !switch_test_flag(conference, CFLAG_WAIT_MOD)) { + } else if (conference->count == 1 && !conference->perpetual_sound && !conference_test_flag(conference, CFLAG_WAIT_MOD)) { /* as long as its not a bridge_to conference, announce if person is alone */ - if (!switch_test_flag(conference, CFLAG_BRIDGE_TO)) { - if (conference->alone_sound && !switch_test_flag(member, MFLAG_GHOST)) { + if (!conference_test_flag(conference, CFLAG_BRIDGE_TO)) { + if (conference->alone_sound && !member_test_flag(member, MFLAG_GHOST)) { conference_stop_file(conference, FILE_STOP_ASYNC); conference_play_file(conference, conference->alone_sound, CONF_DEFAULT_LEADIN, switch_core_session_get_channel(member->session), 0); @@ -4354,7 +5299,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe } if (conference->min && conference->count >= conference->min) { - switch_set_flag(conference, CFLAG_ENFORCE_MIN); + conference_set_flag(conference, CFLAG_ENFORCE_MIN); } if (!switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_REQ) && @@ -4371,7 +5316,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe if ((position = switch_channel_get_variable(channel, "conference_position"))) { if (conference->channels == 2) { - if (switch_test_flag(member, MFLAG_NO_POSITIONAL)) { + if (member_test_flag(member, MFLAG_NO_POSITIONAL)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s has positional audio blocked.\n", switch_channel_get_name(channel)); } else { @@ -4381,7 +5326,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s position data set\n", switch_channel_get_name(channel)); } - switch_set_flag(member, MFLAG_POSITIONAL); + member_set_flag(member, MFLAG_POSITIONAL); member->al = create_al(member->pool); } } else { @@ -4394,7 +5339,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe controls = switch_channel_get_variable(channel, "conference_controls"); if (zstr(controls)) { - if (!switch_test_flag(member, MFLAG_MOD) || !conference->moderator_controls) { + if (!member_test_flag(member, MFLAG_MOD) || !conference->moderator_controls) { controls = conference->caller_controls; } else { controls = conference->moderator_controls; @@ -4418,33 +5363,38 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe switch_mutex_unlock(member->audio_in_mutex); if (conference->la && member->channel && !switch_channel_test_flag(member->channel, CF_VIDEO_ONLY)) { - member->json = cJSON_CreateArray(); - cJSON_AddItemToArray(member->json, cJSON_CreateStringPrintf("%0.4d", member->id)); - cJSON_AddItemToArray(member->json, cJSON_CreateString(switch_channel_get_variable(member->channel, "caller_id_number"))); - cJSON_AddItemToArray(member->json, cJSON_CreateString(switch_channel_get_variable(member->channel, "caller_id_name"))); - - cJSON_AddItemToArray(member->json, cJSON_CreateStringPrintf("%s@%s", - switch_channel_get_variable(member->channel, "original_read_codec"), - switch_channel_get_variable(member->channel, "original_read_rate") - )); + if (!member_test_flag(member, MFLAG_SECOND_SCREEN)) { + member->json = cJSON_CreateArray(); + cJSON_AddItemToArray(member->json, cJSON_CreateStringPrintf("%0.4d", member->id)); + cJSON_AddItemToArray(member->json, cJSON_CreateString(switch_channel_get_variable(member->channel, "caller_id_number"))); + cJSON_AddItemToArray(member->json, cJSON_CreateString(switch_channel_get_variable(member->channel, "caller_id_name"))); + + cJSON_AddItemToArray(member->json, cJSON_CreateStringPrintf("%s@%s", + switch_channel_get_variable(member->channel, "original_read_codec"), + switch_channel_get_variable(member->channel, "original_read_rate") + )); + + member->status_field = cJSON_CreateString(""); + cJSON_AddItemToArray(member->json, member->status_field); + + cJSON_AddItemToArray(member->json, cJSON_CreateNull()); + + member_update_status_field(member); + //switch_live_array_add_alias(conference->la, switch_core_session_get_uuid(member->session), "conference"); + } - member->status_field = cJSON_CreateString(""); - cJSON_AddItemToArray(member->json, member->status_field); - - cJSON_AddItemToArray(member->json, cJSON_CreateNull()); - - member_update_status_field(member); - //switch_live_array_add_alias(conference->la, switch_core_session_get_uuid(member->session), "conference"); adv_la(conference, member, SWITCH_TRUE); - switch_live_array_add(conference->la, switch_core_session_get_uuid(member->session), -1, &member->json, SWITCH_FALSE); + if (!member_test_flag(member, MFLAG_SECOND_SCREEN)) { + switch_live_array_add(conference->la, switch_core_session_get_uuid(member->session), -1, &member->json, SWITCH_FALSE); + } } - if (switch_test_flag(conference, CFLAG_POSITIONAL)) { + if (conference_test_flag(conference, CFLAG_POSITIONAL)) { gen_arc(conference, NULL); } @@ -4458,9 +5408,9 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe find_video_floor(member, SWITCH_TRUE); - if (switch_test_flag(member, MFLAG_JOIN_VID_FLOOR)) { + if (member_test_flag(member, MFLAG_JOIN_VID_FLOOR)) { conference_set_video_floor_holder(conference, member, SWITCH_TRUE); - switch_set_flag(member->conference, CFLAG_VID_FLOOR_LOCK); + conference_set_flag(member->conference, CFLAG_VID_FLOOR_LOCK); if (test_eflag(conference, EFLAG_FLOOR_CHANGE)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "conference %s OK video floor %d %s\n", @@ -4479,10 +5429,10 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf uint32_t old_member = 0; if (!member) { - switch_clear_flag(conference, CFLAG_VID_FLOOR_LOCK); + conference_clear_flag(conference, CFLAG_VID_FLOOR_LOCK); } - if ((!force && switch_test_flag(conference, CFLAG_VID_FLOOR_LOCK))) { + if ((!force && conference_test_flag(conference, CFLAG_VID_FLOOR_LOCK))) { return; } @@ -4501,8 +5451,8 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf if (conference->last_video_floor_holder && (imember = conference_member_get(conference, conference->last_video_floor_holder))) { switch_core_session_request_video_refresh(imember->session); - if (switch_test_flag(imember, MFLAG_VIDEO_BRIDGE)) { - switch_set_flag(conference, CFLAG_VID_FLOOR_LOCK); + if (member_test_flag(imember, MFLAG_VIDEO_BRIDGE)) { + conference_set_flag(conference, CFLAG_VID_FLOOR_LOCK); } switch_thread_rwlock_unlock(imember->rwlock); imember = NULL; @@ -4525,8 +5475,9 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf switch_mutex_unlock(conference->member_mutex); } - if (member && conference->canvas && conference->canvas->layout_floor_id > -1) { - attach_video_layer(member, conference->canvas->layout_floor_id); + //VIDFLOOR + if (conference->canvas_count == 1 && member && conference->canvas && conference->canvas->layout_floor_id > -1) { + attach_video_layer(member, conference->canvas, conference->canvas->layout_floor_id); } if (member) { @@ -4564,7 +5515,7 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf } switch_mutex_unlock(conference->member_mutex); - switch_set_flag(conference, CFLAG_FLOOR_CHANGE); + conference_set_flag(conference, CFLAG_FLOOR_CHANGE); if (test_eflag(conference, EFLAG_FLOOR_CHANGE)) { switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT); @@ -4620,7 +5571,7 @@ static void conference_set_floor_holder(conference_obj_t *conference, conference old_member->floor_packets = 0; } - switch_set_flag(conference, CFLAG_FLOOR_CHANGE); + conference_set_flag(conference, CFLAG_FLOOR_CHANGE); switch_mutex_unlock(conference->mutex); if (test_eflag(conference, EFLAG_FLOOR_CHANGE)) { @@ -4762,6 +5713,10 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe } #endif + if (member->canvas) { + destroy_canvas(&member->canvas); + } + member_fnode = member->fnode; member_sh = member->sh; member->fnode = NULL; @@ -4775,13 +5730,13 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe member->avatar_patched = 0; switch_img_free(&member->avatar_png_img); switch_img_free(&member->video_mute_img); - + switch_img_free(&member->pcanvas_img); switch_mutex_lock(conference->mutex); switch_mutex_lock(conference->member_mutex); switch_mutex_lock(member->audio_in_mutex); switch_mutex_lock(member->audio_out_mutex); lock_member(member); - switch_clear_flag(member, MFLAG_INTREE); + member_clear_flag(member, MFLAG_INTREE); if (member->rec) { conference->recording_members--; @@ -4830,7 +5785,7 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe } if (member->id == member->conference->video_floor_holder) { - switch_clear_flag(member->conference, CFLAG_VID_FLOOR_LOCK); + conference_clear_flag(member->conference, CFLAG_VID_FLOOR_LOCK); if (member->conference->last_video_floor_holder) { member->conference->video_floor_holder = member->conference->last_video_floor_holder; member->conference->last_video_floor_holder = 0; @@ -4838,17 +5793,17 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe member->conference->video_floor_holder = 0; } - if (!switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (!member_test_flag(member, MFLAG_NOCHANNEL)) { switch_channel_t *channel = switch_core_session_get_channel(member->session); - if (switch_test_flag(member, MFLAG_GHOST)) { + if (member_test_flag(member, MFLAG_GHOST)) { conference->count_ghosts--; } else { conference->count--; } - if (switch_test_flag(member, MFLAG_ENDCONF)) { + if (member_test_flag(member, MFLAG_ENDCONF)) { if (!--conference->end_count) { - //switch_set_flag_locked(conference, CFLAG_DESTRUCT); + //conference_set_flag_locked(conference, CFLAG_DESTRUCT); conference->endconf_time = switch_epoch_time_now(NULL); } } @@ -4856,18 +5811,18 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe conference_send_presence(conference); switch_channel_set_variable(channel, "conference_call_key", NULL); - if ((conference->min && switch_test_flag(conference, CFLAG_ENFORCE_MIN) && (conference->count + conference->count_ghosts) < conference->min) - || (switch_test_flag(conference, CFLAG_DYNAMIC) && (conference->count + conference->count_ghosts == 0))) { - switch_set_flag(conference, CFLAG_DESTRUCT); + if ((conference->min && conference_test_flag(conference, CFLAG_ENFORCE_MIN) && (conference->count + conference->count_ghosts) < conference->min) + || (conference_test_flag(conference, CFLAG_DYNAMIC) && (conference->count + conference->count_ghosts == 0))) { + conference_set_flag(conference, CFLAG_DESTRUCT); } else { - if (!switch_true(switch_channel_get_variable(channel, "conference_permanent_wait_mod_moh")) && switch_test_flag(conference, CFLAG_WAIT_MOD)) { + if (!switch_true(switch_channel_get_variable(channel, "conference_permanent_wait_mod_moh")) && conference_test_flag(conference, CFLAG_WAIT_MOD)) { /* Stop MOH if any */ conference_stop_file(conference, FILE_STOP_ASYNC); } - if (!exit_sound && conference->exit_sound && switch_test_flag(conference, CFLAG_EXIT_SOUND)) { + if (!exit_sound && conference->exit_sound && conference_test_flag(conference, CFLAG_EXIT_SOUND) && !member_test_flag(member, MFLAG_SILENT)) { conference_play_file(conference, conference->exit_sound, 0, channel, 0); } - if (conference->count == 1 && conference->alone_sound && !switch_test_flag(conference, CFLAG_WAIT_MOD) && !switch_test_flag(member, MFLAG_GHOST)) { + if (conference->count == 1 && conference->alone_sound && !conference_test_flag(conference, CFLAG_WAIT_MOD) && !member_test_flag(member, MFLAG_GHOST)) { conference_stop_file(conference, FILE_STOP_ASYNC); conference_play_file(conference, conference->alone_sound, 0, channel, 0); } @@ -4902,7 +5857,7 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe send_rfc_event(conference); send_json_event(conference); - if (switch_test_flag(conference, CFLAG_POSITIONAL)) { + if (conference_test_flag(conference, CFLAG_POSITIONAL)) { gen_arc(conference, NULL); } @@ -4927,10 +5882,27 @@ static void conference_write_video_frame(conference_obj_t *conference, conferenc return; } - if (switch_test_flag(conference, CFLAG_FLOOR_CHANGE)) { - switch_clear_flag(conference, CFLAG_FLOOR_CHANGE); + if (conference_test_flag(conference, CFLAG_FLOOR_CHANGE)) { + conference_clear_flag(conference, CFLAG_FLOOR_CHANGE); } + if (vid_frame->img && conference->canvas) { + switch_image_t *frame_img = NULL, *tmp_img = NULL; + int x,y; + + switch_img_copy(vid_frame->img, &tmp_img); + switch_img_fit(&tmp_img, conference->canvas->width, conference->canvas->height); + frame_img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, conference->canvas->width, conference->canvas->height, 1); + reset_image(frame_img, &conference->canvas->bgcolor); + switch_img_find_position(POS_CENTER_MID, frame_img->d_w, frame_img->d_h, tmp_img->d_w, tmp_img->d_h, &x, &y); + switch_img_patch(frame_img, tmp_img, x, y); + tmp_frame.packet = buf; + tmp_frame.data = buf + 12; + tmp_frame.img = frame_img; + switch_img_free(&tmp_img); + } + + switch_mutex_lock(conference->member_mutex); for (imember = conference->members; imember; imember = imember->next) { switch_core_session_t *isession = imember->session; @@ -4945,12 +5917,28 @@ static void conference_write_video_frame(conference_obj_t *conference, conferenc } if (isession && switch_channel_test_flag(imember->channel, CF_VIDEO)) { - if (!switch_test_flag(imember, MFLAG_RECEIVING_VIDEO) && - (switch_test_flag(conference, CFLAG_VID_FLOOR_LOCK) || - !(imember->id == imember->conference->video_floor_holder && imember->conference->last_video_floor_holder))) { + int send_frame = 0; + if (conference->canvas && conference_test_flag(imember->conference, CFLAG_VIDEO_BRIDGE_FIRST_TWO)) { + if (switch_channel_test_flag(imember->channel, CF_VIDEO) && (conference->members_with_video == 1 || imember != floor_holder)) { + send_frame = 1; + } + } else if (!member_test_flag(imember, MFLAG_RECEIVING_VIDEO) && + (conference_test_flag(conference, CFLAG_VID_FLOOR_LOCK) || + !(imember->id == imember->conference->video_floor_holder && imember->conference->last_video_floor_holder))) { + send_frame = 1; + } + + if (send_frame) { if (vid_frame->img) { - switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0); + if (conference->canvas) { + tmp_frame.packet = buf; + tmp_frame.packetlen = sizeof(buf) - 12; + tmp_frame.data = buf + 12; + switch_core_session_write_video_frame(imember->session, &tmp_frame, SWITCH_IO_FLAG_NONE, 0); + } else { + switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0); + } } else { switch_assert(vid_frame->packetlen <= SWITCH_RTP_MAX_BUF_LEN); tmp_frame = *vid_frame; @@ -4968,6 +5956,8 @@ static void conference_write_video_frame(conference_obj_t *conference, conferenc } switch_mutex_unlock(conference->member_mutex); + switch_img_free(&tmp_frame.img); + if (want_refresh && floor_holder->session) { switch_core_session_request_video_refresh(floor_holder->session); } @@ -4991,10 +5981,21 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi return SWITCH_STATUS_FALSE; } - if (switch_test_flag(member->conference, CFLAG_VIDEO_MUXING)) { + + if (conference_test_flag(member->conference, CFLAG_VIDEO_BRIDGE_FIRST_TWO)) { + if (member->conference->members_with_video < 3) { + conference_write_video_frame(member->conference, member, frame); + check_video_recording(member->conference, frame); + switch_thread_rwlock_unlock(member->conference->rwlock); + return SWITCH_STATUS_SUCCESS; + } + } + + + if (conference_test_flag(member->conference, CFLAG_VIDEO_MUXING)) { switch_image_t *img_copy = NULL; - if (frame->img && member->video_layer_id > -1 && switch_test_flag(member, MFLAG_CAN_BE_SEEN) && + if (frame->img && (member->video_layer_id > -1 || member->canvas) && member_test_flag(member, MFLAG_CAN_BE_SEEN) && !member->conference->playing_video_file && switch_queue_size(member->video_queue) < member->conference->video_fps.fps) { switch_img_copy(frame->img, &img_copy); switch_queue_push(member->video_queue, img_copy); @@ -5008,7 +6009,7 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi conference_member_t *imember; if (!(rel->flags & RFLAG_CAN_SEND_VIDEO)) continue; - if ((imember = conference_member_get(member->conference, rel->id)) && switch_test_flag(imember, MFLAG_RECEIVING_VIDEO)) { + if ((imember = conference_member_get(member->conference, rel->id)) && member_test_flag(imember, MFLAG_RECEIVING_VIDEO)) { //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s %d->%d %d\n", name, member->id, imember->id, frame->datalen); switch_core_session_write_video_frame(imember->session, frame, SWITCH_IO_FLAG_NONE, 0); switch_thread_rwlock_unlock(imember->rwlock); @@ -5034,7 +6035,7 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi if (member->id == member->conference->video_floor_holder) { conference_write_video_frame(member->conference, member, frame); check_video_recording(member->conference, frame); - } else if (!switch_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK) && member->id == member->conference->last_video_floor_holder) { + } else if (!conference_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK) && member->id == member->conference->last_video_floor_holder) { conference_member_t *fmember; if ((fmember = conference_member_get(member->conference, member->conference->video_floor_holder))) { @@ -5100,7 +6101,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "conference-create"); switch_event_fire(&event); - if (switch_test_flag(conference, CFLAG_LIVEARRAY_SYNC)) { + if (conference_test_flag(conference, CFLAG_LIVEARRAY_SYNC)) { char *p; if (strchr(conference->name, '@')) { @@ -5122,17 +6123,17 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v } - while (globals.running && !switch_test_flag(conference, CFLAG_DESTRUCT)) { + while (globals.running && !conference_test_flag(conference, CFLAG_DESTRUCT)) { switch_size_t file_sample_len = samples; switch_size_t file_data_len = samples * 2 * conference->channels; - int has_file_data = 0, members_with_video = 0; + int has_file_data = 0, members_with_video = 0, members_with_avatar = 0; uint32_t conf_energy = 0; int nomoh = 0; conference_member_t *floor_holder; /* Sync the conference to a single timing source */ if (switch_core_timer_next(&timer) != SWITCH_STATUS_SUCCESS) { - switch_set_flag(conference, CFLAG_DESTRUCT); + conference_set_flag(conference, CFLAG_DESTRUCT); break; } @@ -5147,36 +6148,41 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v total++; imember->read = 0; - if (switch_test_flag(imember, MFLAG_RUNNING) && imember->session) { + if (member_test_flag(imember, MFLAG_RUNNING) && imember->session) { switch_channel_t *channel = switch_core_session_get_channel(imember->session); if ((!floor_holder || (imember->score_iir > SCORE_IIR_SPEAKING_MAX && (floor_holder->score_iir < SCORE_IIR_SPEAKING_MIN)))) {// && - //(!switch_test_flag(conference, CFLAG_VID_FLOOR) || switch_channel_test_flag(channel, CF_VIDEO))) { + //(!conference_test_flag(conference, CFLAG_VID_FLOOR) || switch_channel_test_flag(channel, CF_VIDEO))) { floor_holder = imember; } - if (switch_channel_ready(channel) && switch_channel_test_flag(channel, CF_VIDEO)) { + if (switch_channel_ready(channel) && switch_channel_test_flag(channel, CF_VIDEO) && imember->video_flow != SWITCH_MEDIA_FLOW_SENDONLY) { members_with_video++; } - if (switch_test_flag(imember, MFLAG_NOMOH)) { + if (imember->avatar_png_img && !switch_channel_test_flag(channel, CF_VIDEO)) { + members_with_avatar++; + } + + if (member_test_flag(imember, MFLAG_NOMOH)) { nomoh++; } } - switch_clear_flag_locked(imember, MFLAG_HAS_AUDIO); + member_clear_flag_locked(imember, MFLAG_HAS_AUDIO); switch_mutex_lock(imember->audio_in_mutex); if (switch_buffer_inuse(imember->audio_buffer) >= bytes && (buf_read = (uint32_t) switch_buffer_read(imember->audio_buffer, imember->frame, bytes))) { imember->read = buf_read; - switch_set_flag_locked(imember, MFLAG_HAS_AUDIO); + member_set_flag_locked(imember, MFLAG_HAS_AUDIO); ready++; } switch_mutex_unlock(imember->audio_in_mutex); } conference->members_with_video = members_with_video; + conference->members_with_avatar = members_with_avatar; if (floor_holder != conference->floor_holder) { conference_set_floor_holder(conference, floor_holder); @@ -5185,7 +6191,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v if (conference->perpetual_sound && !conference->async_fnode) { conference_play_file(conference, conference->perpetual_sound, CONF_DEFAULT_LEADIN, NULL, 1); } else if (conference->moh_sound && ((nomoh == 0 && conference->count == 1) - || switch_test_flag(conference, CFLAG_WAIT_MOD)) && !conference->async_fnode && !conference->fnode) { + || conference_test_flag(conference, CFLAG_WAIT_MOD)) && !conference->async_fnode && !conference->fnode) { conference_play_file(conference, conference->moh_sound, CONF_DEFAULT_LEADIN, NULL, 1); } @@ -5203,7 +6209,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v } if (is_talking == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Conference has been idle for over %d seconds, terminating\n", conference->terminate_on_silence); - switch_set_flag(conference, CFLAG_DESTRUCT); + conference_set_flag(conference, CFLAG_DESTRUCT); } } @@ -5343,12 +6349,12 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v for (omember = conference->members; omember; omember = omember->next) { conference->member_loop_count++; - if (!(switch_test_flag(omember, MFLAG_RUNNING) && switch_test_flag(omember, MFLAG_HAS_AUDIO))) { + if (!(member_test_flag(omember, MFLAG_RUNNING) && member_test_flag(omember, MFLAG_HAS_AUDIO))) { continue; } if (conference->agc_level) { - if (switch_test_flag(omember, MFLAG_TALKING) && switch_test_flag(omember, MFLAG_CAN_SPEAK)) { + if (member_test_flag(omember, MFLAG_TALKING) && member_test_flag(omember, MFLAG_CAN_SPEAK)) { member_score_sum += omember->score; conference->mux_loop_count++; } @@ -5384,11 +6390,11 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v for (omember = conference->members; omember; omember = omember->next) { switch_size_t ok = 1; - if (!switch_test_flag(omember, MFLAG_RUNNING)) { + if (!member_test_flag(omember, MFLAG_RUNNING)) { continue; } - if (!switch_test_flag(omember, MFLAG_CAN_HEAR)) { + if (!member_test_flag(omember, MFLAG_CAN_HEAR)) { switch_mutex_lock(omember->audio_out_mutex); memset(write_frame, 255, bytes); ok = switch_buffer_write(omember->mux_buffer, write_frame, bytes); @@ -5402,7 +6408,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v z = main_frame[x]; /* bptr[x] represents my own contribution to this audio sample */ - if (switch_test_flag(omember, MFLAG_HAS_AUDIO) && x <= omember->read / 2) { + if (member_test_flag(omember, MFLAG_HAS_AUDIO) && x <= omember->read / 2) { z -= (int32_t) bptr[x]; } @@ -5411,7 +6417,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v */ if (conference->relationship_total) { for (imember = conference->members; imember; imember = imember->next) { - if (imember != omember && switch_test_flag(imember, MFLAG_HAS_AUDIO)) { + if (imember != omember && member_test_flag(imember, MFLAG_HAS_AUDIO)) { conference_relationship_t *rel; switch_size_t found = 0; int16_t *rptr = (int16_t *) imember->frame; @@ -5461,7 +6467,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v for (omember = conference->members; omember; omember = omember->next) { switch_size_t ok = 1; - if (!switch_test_flag(omember, MFLAG_RUNNING)) { + if (!member_test_flag(omember, MFLAG_RUNNING)) { continue; } @@ -5505,7 +6511,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v conference->fnode = conference->fnode->next; if (conference->fnode) { - fnode_check_video(conference, conference->fnode); + fnode_check_video(conference->fnode); } @@ -5518,7 +6524,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v switch_epoch_time_now(NULL) - conference->endconf_time > conference->endconf_grace_time) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Conference %s: endconf grace time exceeded (%u)\n", conference->name, conference->endconf_grace_time); - switch_set_flag(conference, CFLAG_DESTRUCT | CFLAG_ENDCONF_FORCED); + conference_set_flag(conference, CFLAG_DESTRUCT | CFLAG_ENDCONF_FORCED); } switch_mutex_unlock(conference->mutex); @@ -5526,7 +6532,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v /* Rinse ... Repeat */ end: - if (switch_test_flag(conference, CFLAG_OUTCALL)) { + if (conference_test_flag(conference, CFLAG_OUTCALL)) { conference->cancel_cause = SWITCH_CAUSE_ORIGINATOR_CANCEL; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Ending pending outcall channels for Conference: '%s'\n", conference->name); while(conference->originating) { @@ -5579,13 +6585,13 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v for (imember = conference->members; imember; imember = imember->next) { switch_channel_t *channel; - if (!switch_test_flag(imember, MFLAG_NOCHANNEL)) { + if (!member_test_flag(imember, MFLAG_NOCHANNEL)) { channel = switch_core_session_get_channel(imember->session); if (!switch_false(switch_channel_get_variable(channel, "hangup_after_conference"))) { /* add this little bit to preserve the bridge cause code in case of an early media call that */ /* never answers */ - if (switch_test_flag(conference, CFLAG_ANSWERED)) { + if (conference_test_flag(conference, CFLAG_ANSWERED)) { switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); } else { /* put actual cause code from outbound channel hangup here */ @@ -5594,7 +6600,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v } } - switch_clear_flag_locked(imember, MFLAG_RUNNING); + member_clear_flag_locked(imember, MFLAG_RUNNING); } switch_mutex_unlock(conference->member_mutex); switch_mutex_unlock(conference->mutex); @@ -5618,21 +6624,24 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v switch_core_timer_destroy(&timer); switch_mutex_lock(globals.hash_mutex); - if (switch_test_flag(conference, CFLAG_INHASH)) { + if (conference_test_flag(conference, CFLAG_INHASH)) { switch_core_hash_delete(globals.conference_hash, conference->name); } switch_mutex_unlock(globals.hash_mutex); - switch_clear_flag(conference, CFLAG_VIDEO_MUXING); - if (conference->video_muxing_thread) { - switch_status_t st = 0; - switch_thread_join(&st, conference->video_muxing_thread); - conference->video_muxing_thread = NULL; + conference_clear_flag(conference, CFLAG_VIDEO_MUXING); + + for (x = 0; x <= conference->canvas_count; x++) { + if (conference->canvases[x] && conference->canvases[x]->video_muxing_thread) { + switch_status_t st = 0; + switch_thread_join(&st, conference->canvases[x]->video_muxing_thread); + conference->canvases[x]->video_muxing_thread = NULL; + } } /* Wait till everybody is out */ - switch_clear_flag_locked(conference, CFLAG_RUNNING); + conference_clear_flag_locked(conference, CFLAG_RUNNING); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write Lock ON\n"); switch_thread_rwlock_wrlock(conference->rwlock); switch_thread_rwlock_unlock(conference->rwlock); @@ -5700,11 +6709,11 @@ static void conference_loop_fn_mute_toggle(conference_member_t *member, caller_c if (member == NULL) return; - if (switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (member_test_flag(member, MFLAG_CAN_SPEAK)) { conf_api_sub_mute(member, NULL, NULL); } else { conf_api_sub_unmute(member, NULL, NULL); - if (!switch_test_flag(member, MFLAG_CAN_HEAR)) { + if (!member_test_flag(member, MFLAG_CAN_HEAR)) { conf_api_sub_undeaf(member, NULL, NULL); } } @@ -5712,16 +6721,16 @@ static void conference_loop_fn_mute_toggle(conference_member_t *member, caller_c static void conference_loop_fn_mute_on(conference_member_t *member, caller_control_action_t *action) { - if (switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (member_test_flag(member, MFLAG_CAN_SPEAK)) { conf_api_sub_mute(member, NULL, NULL); } } static void conference_loop_fn_mute_off(conference_member_t *member, caller_control_action_t *action) { - if (!switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (!member_test_flag(member, MFLAG_CAN_SPEAK)) { conf_api_sub_unmute(member, NULL, NULL); - if (!switch_test_flag(member, MFLAG_CAN_HEAR)) { + if (!member_test_flag(member, MFLAG_CAN_HEAR)) { conf_api_sub_undeaf(member, NULL, NULL); } } @@ -5742,7 +6751,7 @@ static void conference_loop_fn_vmute_toggle(conference_member_t *member, caller_ if (member == NULL) return; - if (switch_test_flag(member, MFLAG_CAN_BE_SEEN)) { + if (member_test_flag(member, MFLAG_CAN_BE_SEEN)) { conf_api_sub_vmute(member, NULL, NULL); } else { conf_api_sub_unvmute(member, NULL, NULL); @@ -5751,14 +6760,14 @@ static void conference_loop_fn_vmute_toggle(conference_member_t *member, caller_ static void conference_loop_fn_vmute_on(conference_member_t *member, caller_control_action_t *action) { - if (switch_test_flag(member, MFLAG_CAN_BE_SEEN)) { + if (member_test_flag(member, MFLAG_CAN_BE_SEEN)) { conf_api_sub_vmute(member, NULL, NULL); } } static void conference_loop_fn_vmute_off(conference_member_t *member, caller_control_action_t *action) { - if (!switch_test_flag(member, MFLAG_CAN_BE_SEEN)) { + if (!member_test_flag(member, MFLAG_CAN_BE_SEEN)) { conf_api_sub_unvmute(member, NULL, NULL); } } @@ -5770,15 +6779,15 @@ static void conference_loop_fn_lock_toggle(conference_member_t *member, caller_c if (member == NULL) return; - if (switch_test_flag(member->conference, CFLAG_WAIT_MOD) && !switch_test_flag(member, MFLAG_MOD) ) + if (conference_test_flag(member->conference, CFLAG_WAIT_MOD) && !member_test_flag(member, MFLAG_MOD) ) return; - if (!switch_test_flag(member->conference, CFLAG_LOCKED)) { + if (!conference_test_flag(member->conference, CFLAG_LOCKED)) { if (member->conference->is_locked_sound) { conference_play_file(member->conference, member->conference->is_locked_sound, CONF_DEFAULT_LEADIN, NULL, 0); } - switch_set_flag_locked(member->conference, CFLAG_LOCKED); + conference_set_flag_locked(member->conference, CFLAG_LOCKED); if (test_eflag(member->conference, EFLAG_LOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(member->conference, event); @@ -5790,7 +6799,7 @@ static void conference_loop_fn_lock_toggle(conference_member_t *member, caller_c conference_play_file(member->conference, member->conference->is_unlocked_sound, CONF_DEFAULT_LEADIN, NULL, 0); } - switch_clear_flag_locked(member->conference, CFLAG_LOCKED); + conference_clear_flag_locked(member->conference, CFLAG_LOCKED); if (test_eflag(member->conference, EFLAG_UNLOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(member->conference, event); @@ -5806,14 +6815,14 @@ static void conference_loop_fn_deafmute_toggle(conference_member_t *member, call if (member == NULL) return; - if (switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (member_test_flag(member, MFLAG_CAN_SPEAK)) { conf_api_sub_mute(member, NULL, NULL); - if (switch_test_flag(member, MFLAG_CAN_HEAR)) { + if (member_test_flag(member, MFLAG_CAN_HEAR)) { conf_api_sub_deaf(member, NULL, NULL); } } else { conf_api_sub_unmute(member, NULL, NULL); - if (!switch_test_flag(member, MFLAG_CAN_HEAR)) { + if (!member_test_flag(member, MFLAG_CAN_HEAR)) { conf_api_sub_undeaf(member, NULL, NULL); } } @@ -6134,7 +7143,7 @@ static void conference_loop_fn_transfer(conference_member_t *member, caller_cont switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Dialplan", action->expanded_data); switch_event_fire(&event); } - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_clear_flag_locked(member, MFLAG_RUNNING); if ((mydata = switch_core_session_strdup(member->session, action->expanded_data))) { if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) { @@ -6225,7 +7234,7 @@ static void conference_loop_fn_exec_app(conference_member_t *member, caller_cont static void conference_loop_fn_hangup(conference_member_t *member, caller_control_action_t *action) { - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_clear_flag_locked(member, MFLAG_RUNNING); } @@ -6288,7 +7297,7 @@ static void check_agc_levels(conference_member_t *member) static void member_check_channels(switch_frame_t *frame, conference_member_t *member, switch_bool_t in) { - if (member->conference->channels != member->read_impl.number_of_channels || switch_test_flag(member, MFLAG_POSITIONAL)) { + if (member->conference->channels != member->read_impl.number_of_channels || member_test_flag(member, MFLAG_POSITIONAL)) { uint32_t rlen; int from, to; @@ -6302,7 +7311,7 @@ static void member_check_channels(switch_frame_t *frame, conference_member_t *me rlen = frame->datalen / 2 / from; - if (in && frame->rate == 48000 && ((from == 1 && to == 2) || (from == 2 && to == 2)) && switch_test_flag(member, MFLAG_POSITIONAL)) { + if (in && frame->rate == 48000 && ((from == 1 && to == 2) || (from == 2 && to == 2)) && member_test_flag(member, MFLAG_POSITIONAL)) { if (from == 2 && to == 2) { switch_mux_channels((int16_t *) frame->data, rlen, 2, 1); frame->datalen /= 2; @@ -6338,7 +7347,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v switch_assert(member != NULL); - switch_clear_flag_locked(member, MFLAG_TALKING); + member_clear_flag_locked(member, MFLAG_TALKING); channel = switch_core_session_get_channel(session); @@ -6351,7 +7360,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v /* As long as we have a valid read, feed that data into an input buffer where the conference thread will take it and mux it with any audio from other channels. */ - while (switch_test_flag(member, MFLAG_RUNNING) && switch_channel_ready(channel)) { + while (member_test_flag(member, MFLAG_RUNNING) && switch_channel_ready(channel)) { if (switch_channel_ready(channel) && switch_channel_test_app_flag(channel, CF_APP_TAGGED)) { switch_yield(100000); @@ -6364,17 +7373,17 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v switch_mutex_lock(member->read_mutex); /* end the loop, if appropriate */ - if (!SWITCH_READ_ACCEPTABLE(status) || !switch_test_flag(member, MFLAG_RUNNING)) { + if (!SWITCH_READ_ACCEPTABLE(status) || !member_test_flag(member, MFLAG_RUNNING)) { switch_mutex_unlock(member->read_mutex); break; } - if (switch_channel_test_flag(channel, CF_VIDEO) && !switch_test_flag(member, MFLAG_ACK_VIDEO)) { - switch_set_flag_locked(member, MFLAG_ACK_VIDEO); + if (switch_channel_test_flag(channel, CF_VIDEO) && !member_test_flag(member, MFLAG_ACK_VIDEO)) { + member_set_flag_locked(member, MFLAG_ACK_VIDEO); check_avatar(member, SWITCH_FALSE); switch_core_session_video_reinit(member->session); conference_set_video_floor_holder(member->conference, member, SWITCH_FALSE); - } else if (switch_test_flag(member, MFLAG_ACK_VIDEO) && !switch_channel_test_flag(channel, CF_VIDEO)) { + } else if (member_test_flag(member, MFLAG_ACK_VIDEO) && !switch_channel_test_flag(channel, CF_VIDEO)) { check_avatar(member, SWITCH_FALSE); } @@ -6384,7 +7393,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v switch_channel_dequeue_dtmf_string(channel, dtmf, sizeof(dtmf)); - if (switch_test_flag(member, MFLAG_DIST_DTMF)) { + if (member_test_flag(member, MFLAG_DIST_DTMF)) { conference_send_all_dtmf(member, member->conference, dtmf); } else if (member->dmachine) { char *p; @@ -6417,10 +7426,10 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v if (hangunder_hits) { hangunder_hits--; } - if (switch_test_flag(member, MFLAG_TALKING)) { + if (member_test_flag(member, MFLAG_TALKING)) { if (++hangover_hits >= hangover) { hangover_hits = hangunder_hits = 0; - switch_clear_flag_locked(member, MFLAG_TALKING); + member_clear_flag_locked(member, MFLAG_TALKING); member_update_status_field(member); check_agc_levels(member); clear_avg(member); @@ -6453,7 +7462,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v /* if the member can speak, compute the audio energy level and */ /* generate events when the level crosses the threshold */ - if ((switch_test_flag(member, MFLAG_CAN_SPEAK) || switch_test_flag(member, MFLAG_MUTE_DETECT))) { + if ((member_test_flag(member, MFLAG_CAN_SPEAK) || member_test_flag(member, MFLAG_MUTE_DETECT))) { uint32_t energy = 0, i = 0, samples = 0, j = 0; int16_t *data; int agc_period = (member->read_impl.actual_samples_per_second / member->read_impl.samples_per_packet) / 4; @@ -6484,7 +7493,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v } if (member->conference->agc_level && member->score && - switch_test_flag(member, MFLAG_CAN_SPEAK) && + member_test_flag(member, MFLAG_CAN_SPEAK) && noise_gate_check(member) ) { int last_shift = abs((int)(member->last_score - member->score)); @@ -6543,22 +7552,22 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v hangover_hits = hangunder_hits = 0; member->last_talking = switch_epoch_time_now(NULL); - if (!switch_test_flag(member, MFLAG_TALKING)) { - switch_set_flag_locked(member, MFLAG_TALKING); + if (!member_test_flag(member, MFLAG_TALKING)) { + member_set_flag_locked(member, MFLAG_TALKING); member_update_status_field(member); member->floor_packets = 0; - if (test_eflag(member->conference, EFLAG_START_TALKING) && switch_test_flag(member, MFLAG_CAN_SPEAK) && + if (test_eflag(member->conference, EFLAG_START_TALKING) && member_test_flag(member, MFLAG_CAN_SPEAK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_member_data(member, event); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "start-talking"); switch_event_fire(&event); } - if (switch_test_flag(member, MFLAG_MUTE_DETECT) && !switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (member_test_flag(member, MFLAG_MUTE_DETECT) && !member_test_flag(member, MFLAG_CAN_SPEAK)) { if (!zstr(member->conference->mute_detect_sound)) { - switch_set_flag(member, MFLAG_INDICATE_MUTE_DETECT); + member_set_flag(member, MFLAG_INDICATE_MUTE_DETECT); } if (test_eflag(member->conference, EFLAG_MUTE_DETECT) && @@ -6579,11 +7588,11 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v member->nt_tally++; } - if (switch_test_flag(member, MFLAG_TALKING) && switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (member_test_flag(member, MFLAG_TALKING) && member_test_flag(member, MFLAG_CAN_SPEAK)) { switch_event_t *event; if (++hangover_hits >= hangover) { hangover_hits = hangunder_hits = 0; - switch_clear_flag_locked(member, MFLAG_TALKING); + member_clear_flag_locked(member, MFLAG_TALKING); member_update_status_field(member); check_agc_levels(member); clear_avg(member); @@ -6626,8 +7635,8 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v } /* skip frames that are not actual media or when we are muted or silent */ - if ((switch_test_flag(member, MFLAG_TALKING) || member->energy_level == 0 || switch_test_flag(member->conference, CFLAG_AUDIO_ALWAYS)) - && switch_test_flag(member, MFLAG_CAN_SPEAK) && !switch_test_flag(member->conference, CFLAG_WAIT_MOD) + if ((member_test_flag(member, MFLAG_TALKING) || member->energy_level == 0 || conference_test_flag(member->conference, CFLAG_AUDIO_ALWAYS)) + && member_test_flag(member, MFLAG_CAN_SPEAK) && !conference_test_flag(member->conference, CFLAG_WAIT_MOD) && (member->conference->count > 1 || (member->conference->record_count && member->conference->count >= member->conference->min_recording_participants))) { switch_audio_resampler_t *read_resampler = member->read_resampler; void *data; @@ -6692,7 +7701,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v end: - switch_clear_flag_locked(member, MFLAG_ITHREAD); + member_clear_flag_locked(member, MFLAG_ITHREAD); return NULL; } @@ -6796,9 +7805,9 @@ static void launch_conference_loop_input(conference_member_t *member, switch_mem switch_threadattr_create(&thd_attr, pool); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - switch_set_flag_locked(member, MFLAG_ITHREAD); + member_set_flag_locked(member, MFLAG_ITHREAD); if (switch_thread_create(&member->input_thread, thd_attr, conference_loop_input, member, pool) != SWITCH_STATUS_SUCCESS) { - switch_clear_flag_locked(member, MFLAG_ITHREAD); + member_clear_flag_locked(member, MFLAG_ITHREAD); } } @@ -6878,7 +7887,7 @@ static void conference_loop_output(conference_member_t *member) switch_channel_set_private(channel, "_conference_autocall_list_", NULL); - switch_set_flag(member->conference, CFLAG_OUTCALL); + conference_set_flag(member->conference, CFLAG_OUTCALL); if (toval) { to = atoi(toval); @@ -6934,20 +7943,20 @@ static void conference_loop_output(conference_member_t *member) conference_member_play_file(member, "tone_stream://%(500,0,640)", 0, SWITCH_TRUE); } - if (!switch_test_flag(member->conference, CFLAG_ANSWERED)) { + if (!conference_test_flag(member->conference, CFLAG_ANSWERED)) { switch_channel_answer(channel); } sanity = 2000; - while(!switch_test_flag(member, MFLAG_ITHREAD) && sanity > 0) { + while(!member_test_flag(member, MFLAG_ITHREAD) && sanity > 0) { switch_cond_next(); sanity--; } /* Fair WARNING, If you expect the caller to hear anything or for digit handling to be processed, */ /* you better not block this thread loop for more than the duration of member->conference->timer_name! */ - while (!member->loop_loop && switch_test_flag(member, MFLAG_RUNNING) && switch_test_flag(member, MFLAG_ITHREAD) + while (!member->loop_loop && member_test_flag(member, MFLAG_RUNNING) && member_test_flag(member, MFLAG_ITHREAD) && switch_channel_ready(channel)) { switch_event_t *event; int use_timer = 0; @@ -6988,13 +7997,13 @@ static void conference_loop_output(conference_member_t *member) if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { /* test to see if outbound channel has answered */ - if (switch_channel_test_flag(channel, CF_ANSWERED) && !switch_test_flag(member->conference, CFLAG_ANSWERED)) { + if (switch_channel_test_flag(channel, CF_ANSWERED) && !conference_test_flag(member->conference, CFLAG_ANSWERED)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_DEBUG, "Outbound conference channel answered, setting CFLAG_ANSWERED\n"); - switch_set_flag(member->conference, CFLAG_ANSWERED); + conference_set_flag(member->conference, CFLAG_ANSWERED); } } else { - if (switch_test_flag(member->conference, CFLAG_ANSWERED) && !switch_channel_test_flag(channel, CF_ANSWERED)) { + if (conference_test_flag(member->conference, CFLAG_ANSWERED) && !switch_channel_test_flag(channel, CF_ANSWERED)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_DEBUG, "CLFAG_ANSWERED set, answering inbound channel\n"); switch_channel_answer(channel); } @@ -7009,16 +8018,16 @@ static void conference_loop_output(conference_member_t *member) if (mux_used < bytes) { if (++low_count >= 5) { /* partial frame sitting around this long is useless and builds delay */ - switch_set_flag_locked(member, MFLAG_FLUSH_BUFFER); + member_set_flag_locked(member, MFLAG_FLUSH_BUFFER); } } else if (mux_used > flush_len) { /* getting behind, clear the buffer */ - switch_set_flag_locked(member, MFLAG_FLUSH_BUFFER); + member_set_flag_locked(member, MFLAG_FLUSH_BUFFER); } } if (switch_channel_test_app_flag(channel, CF_APP_TAGGED)) { - switch_set_flag_locked(member, MFLAG_FLUSH_BUFFER); + member_set_flag_locked(member, MFLAG_FLUSH_BUFFER); } else if (mux_used >= bytes) { /* Flush the output buffer and write all the data (presumably muxed) back to the channel */ switch_mutex_lock(member->audio_out_mutex); @@ -7030,7 +8039,7 @@ static void conference_loop_output(conference_member_t *member) if (write_frame.datalen) { write_frame.samples = write_frame.datalen / 2 / member->conference->channels; - if( !switch_test_flag(member, MFLAG_CAN_HEAR)) { + if( !member_test_flag(member, MFLAG_CAN_HEAR)) { memset(write_frame.data, 255, write_frame.datalen); } else if (member->volume_out_level) { /* Check for output volume adjustments */ switch_change_sln_volume(write_frame.data, write_frame.samples * member->conference->channels, member->volume_out_level); @@ -7054,19 +8063,19 @@ static void conference_loop_output(conference_member_t *member) switch_mutex_unlock(member->audio_out_mutex); } - if (switch_test_flag(member, MFLAG_FLUSH_BUFFER)) { + if (member_test_flag(member, MFLAG_FLUSH_BUFFER)) { if (switch_buffer_inuse(member->mux_buffer)) { switch_mutex_lock(member->audio_out_mutex); switch_buffer_zero(member->mux_buffer); switch_mutex_unlock(member->audio_out_mutex); } - switch_clear_flag_locked(member, MFLAG_FLUSH_BUFFER); + member_clear_flag_locked(member, MFLAG_FLUSH_BUFFER); } switch_mutex_unlock(member->write_mutex); - if (switch_test_flag(member, MFLAG_INDICATE_MUTE)) { + if (member_test_flag(member, MFLAG_INDICATE_MUTE)) { if (!zstr(member->conference->muted_sound)) { conference_member_play_file(member, member->conference->muted_sound, 0, SWITCH_TRUE); } else { @@ -7075,10 +8084,10 @@ static void conference_loop_output(conference_member_t *member) switch_snprintf(msg, sizeof(msg), "Muted"); conference_member_say(member, msg, 0); } - switch_clear_flag(member, MFLAG_INDICATE_MUTE); + member_clear_flag(member, MFLAG_INDICATE_MUTE); } - if (switch_test_flag(member, MFLAG_INDICATE_MUTE_DETECT)) { + if (member_test_flag(member, MFLAG_INDICATE_MUTE_DETECT)) { if (!zstr(member->conference->mute_detect_sound)) { conference_member_play_file(member, member->conference->mute_detect_sound, 0, SWITCH_TRUE); } else { @@ -7087,10 +8096,10 @@ static void conference_loop_output(conference_member_t *member) switch_snprintf(msg, sizeof(msg), "Currently Muted"); conference_member_say(member, msg, 0); } - switch_clear_flag(member, MFLAG_INDICATE_MUTE_DETECT); + member_clear_flag(member, MFLAG_INDICATE_MUTE_DETECT); } - if (switch_test_flag(member, MFLAG_INDICATE_UNMUTE)) { + if (member_test_flag(member, MFLAG_INDICATE_UNMUTE)) { if (!zstr(member->conference->unmuted_sound)) { conference_member_play_file(member, member->conference->unmuted_sound, 0, SWITCH_TRUE); } else { @@ -7099,14 +8108,14 @@ static void conference_loop_output(conference_member_t *member) switch_snprintf(msg, sizeof(msg), "Un-Muted"); conference_member_say(member, msg, 0); } - switch_clear_flag(member, MFLAG_INDICATE_UNMUTE); + member_clear_flag(member, MFLAG_INDICATE_UNMUTE); } if (switch_core_session_private_event_count(member->session)) { switch_channel_set_app_flag(channel, CF_APP_TAGGED); switch_ivr_parse_all_events(member->session); switch_channel_clear_app_flag(channel, CF_APP_TAGGED); - switch_set_flag_locked(member, MFLAG_FLUSH_BUFFER); + member_set_flag_locked(member, MFLAG_FLUSH_BUFFER); switch_core_session_set_read_codec(member->session, &member->read_codec); } else { switch_ivr_parse_all_messages(member->session); @@ -7123,7 +8132,7 @@ static void conference_loop_output(conference_member_t *member) end: if (!member->loop_loop) { - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_clear_flag_locked(member, MFLAG_RUNNING); /* Wait for the input thread to end */ if (member->input_thread) { @@ -7182,7 +8191,7 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th member = &smember; - member->flags = MFLAG_CAN_HEAR | MFLAG_NOCHANNEL | MFLAG_RUNNING; + member->flags[MFLAG_CAN_HEAR] = member->flags[MFLAG_NOCHANNEL] = member->flags[MFLAG_RUNNING] = 1; member->conference = conference; member->native_rate = conference->rate; @@ -7227,7 +8236,7 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th flags = SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT; - if (conference->members_with_video && switch_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { + if (conference->members_with_video && conference_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { flags |= SWITCH_FILE_FLAG_VIDEO; if (conference->canvas) { char *orig_path = rec->path; @@ -7295,26 +8304,26 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th goto end; } - while (switch_test_flag(member, MFLAG_RUNNING) && switch_test_flag(conference, CFLAG_RUNNING) && (conference->count + conference->count_ghosts)) { + while (member_test_flag(member, MFLAG_RUNNING) && conference_test_flag(conference, CFLAG_RUNNING) && (conference->count + conference->count_ghosts)) { len = 0; mux_used = (uint32_t) switch_buffer_inuse(member->mux_buffer); - if (switch_test_flag(member, MFLAG_FLUSH_BUFFER)) { + if (member_test_flag(member, MFLAG_FLUSH_BUFFER)) { if (mux_used) { switch_mutex_lock(member->audio_out_mutex); switch_buffer_zero(member->mux_buffer); switch_mutex_unlock(member->audio_out_mutex); mux_used = 0; } - switch_clear_flag_locked(member, MFLAG_FLUSH_BUFFER); + member_clear_flag_locked(member, MFLAG_FLUSH_BUFFER); } again: if (switch_test_flag((&member->rec->fh), SWITCH_FILE_PAUSE)) { - switch_set_flag_locked(member, MFLAG_FLUSH_BUFFER); + member_set_flag_locked(member, MFLAG_FLUSH_BUFFER); goto loop; } @@ -7340,10 +8349,10 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th len = (switch_size_t) samples; } - if (!switch_test_flag(member, MFLAG_PAUSE_RECORDING)) { + if (!member_test_flag(member, MFLAG_PAUSE_RECORDING)) { if (!len || switch_core_file_write(&member->rec->fh, data_buf, &len) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write Failed\n"); - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_clear_flag_locked(member, MFLAG_RUNNING); } } @@ -7377,7 +8386,7 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th switch_buffer_destroy(&member->audio_buffer); switch_buffer_destroy(&member->mux_buffer); - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_clear_flag_locked(member, MFLAG_RUNNING); if (switch_test_flag((&member->rec->fh), SWITCH_FILE_OPEN)) { switch_mutex_lock(conference->mutex); switch_mutex_unlock(conference->mutex); @@ -7521,31 +8530,33 @@ static void conference_send_all_dtmf(conference_member_t *member, conference_obj static void canvas_del_fnode_layer(conference_obj_t *conference, conference_file_node_t *fnode) { - - switch_mutex_lock(conference->canvas->mutex); + mcu_canvas_t *canvas = conference->canvases[fnode->canvas_id]; + + switch_mutex_lock(canvas->mutex); if (fnode->layer_id > -1) { - mcu_layer_t *xlayer = &conference->canvas->layers[fnode->layer_id]; + mcu_layer_t *xlayer = &canvas->layers[fnode->layer_id]; fnode->layer_id = -1; + fnode->canvas_id = -1; xlayer->fnode = NULL; - reset_layer(conference->canvas, xlayer); + reset_layer(xlayer); } - switch_mutex_unlock(conference->canvas->mutex); + switch_mutex_unlock(canvas->mutex); } -static void canvas_set_fnode_layer(conference_obj_t *conference, conference_file_node_t *fnode, int idx) +static void canvas_set_fnode_layer(mcu_canvas_t *canvas, conference_file_node_t *fnode, int idx) { mcu_layer_t *layer = NULL; mcu_layer_t *xlayer = NULL; - switch_mutex_lock(conference->canvas->mutex); + switch_mutex_lock(canvas->mutex); if (idx == -1) { int i; - if (conference->canvas->layout_floor_id > -1) { - idx = conference->canvas->layout_floor_id; - xlayer = &conference->canvas->layers[idx]; + if (canvas->layout_floor_id > -1) { + idx = canvas->layout_floor_id; + xlayer = &canvas->layers[idx]; if (xlayer->fnode) { idx = -1; @@ -7553,8 +8564,8 @@ static void canvas_set_fnode_layer(conference_obj_t *conference, conference_file } if (idx < 0) { - for (i = 0; i < conference->canvas->total_layers; i++) { - xlayer = &conference->canvas->layers[i]; + for (i = 0; i < canvas->total_layers; i++) { + xlayer = &canvas->layers[i]; if (xlayer->fnode || xlayer->geometry.res_id || xlayer->member_id) { continue; @@ -7566,23 +8577,26 @@ static void canvas_set_fnode_layer(conference_obj_t *conference, conference_file } } - if (idx < 0) return; + if (idx < 0) goto end; - layer = &conference->canvas->layers[idx]; + layer = &canvas->layers[idx]; layer->fnode = fnode; fnode->layer_id = idx; + fnode->canvas_id = canvas->canvas_id; if (layer->member_id > -1) { conference_member_t *member; - if ((member = conference_member_get(conference, layer->member_id))) { + if ((member = conference_member_get(canvas->conference, layer->member_id))) { detach_video_layer(member); switch_thread_rwlock_unlock(member->rwlock); } } - switch_mutex_unlock(conference->canvas->mutex); + end: + + switch_mutex_unlock(canvas->mutex); } /* Play a file in the conference room */ @@ -7670,6 +8684,7 @@ static switch_status_t conference_play_file(conference_obj_t *conference, char * goto done; } + fnode->conference = conference; fnode->layer_id = -1; fnode->type = NODE_TYPE_FILE; fnode->leadin = leadin; @@ -7683,7 +8698,7 @@ static switch_status_t conference_play_file(conference_obj_t *conference, char * flags = SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT; - if (conference->members_with_video && switch_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { + if (conference->members_with_video && conference_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { flags |= SWITCH_FILE_FLAG_VIDEO; } @@ -7739,7 +8754,7 @@ static switch_status_t conference_play_file(conference_obj_t *conference, char * fnode->file = switch_core_strdup(fnode->pool, file); if (!conference->fnode || (async && !conference->async_fnode)) { - fnode_check_video(conference, fnode); + fnode_check_video(fnode); } /* Queue the node */ @@ -7788,7 +8803,7 @@ static switch_status_t conference_member_play_file(conference_member_t *member, int channels = member->conference->channels; int bad_params = 0; - if (member == NULL || file == NULL || switch_test_flag(member, MFLAG_KICKED)) + if (member == NULL || file == NULL || member_test_flag(member, MFLAG_KICKED)) return status; if ((expanded = switch_channel_expand_variables(switch_core_session_get_channel(member->session), file)) != file) { @@ -7827,6 +8842,7 @@ static switch_status_t conference_member_play_file(conference_member_t *member, goto done; } + fnode->conference = member->conference; fnode->layer_id = -1; fnode->type = NODE_TYPE_FILE; fnode->leadin = leadin; @@ -7923,6 +8939,8 @@ static switch_status_t conference_member_say(conference_member_t *member, char * return SWITCH_STATUS_MEMERR; } + fnode->conference = conference; + fnode->layer_id = -1; if (*text == '{') { @@ -8065,6 +9083,7 @@ static switch_status_t conference_say(conference_obj_t *conference, const char * return SWITCH_STATUS_MEMERR; } + fnode->conference = conference; fnode->layer_id = -1; if (*text == '{') { @@ -8167,7 +9186,7 @@ static void chat_message_broadcast(conference_obj_t *conference, switch_event_t switch_mutex_lock(conference->member_mutex); for (member = conference->members; member; member = member->next) { - if (member->session && !switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (member->session && !member_test_flag(member, MFLAG_NOCHANNEL)) { const char *presence_id = switch_channel_get_variable(member->channel, "presence_id"); const char *chat_proto = switch_channel_get_variable(member->channel, "chat_proto"); switch_event_t *reply = NULL; @@ -8203,8 +9222,8 @@ static void conference_member_itterator(conference_obj_t *conference, switch_str switch_mutex_lock(conference->member_mutex); for (member = conference->members; member; member = member->next) { - if (!(non_mod && switch_test_flag(member, MFLAG_MOD))) { - if (member->session && !switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (!(non_mod && member_test_flag(member, MFLAG_MOD))) { + if (member->session && !member_test_flag(member, MFLAG_NOCHANNEL)) { pfncallback(member, stream, data); } } else { @@ -8251,7 +9270,7 @@ static void conference_list_pretty(conference_obj_t *conference, switch_stream_h switch_channel_t *channel; switch_caller_profile_t *profile; - if (switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (member_test_flag(member, MFLAG_NOCHANNEL)) { continue; } channel = switch_core_session_get_channel(member->session); @@ -8280,7 +9299,7 @@ static void conference_list(conference_obj_t *conference, switch_stream_handle_t char *name; uint32_t count = 0; - if (switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (member_test_flag(member, MFLAG_NOCHANNEL)) { continue; } @@ -8292,17 +9311,17 @@ static void conference_list(conference_obj_t *conference, switch_stream_handle_t stream->write_function(stream, "%u%s%s%s%s%s%s%s%s%s", member->id, delim, name, delim, uuid, delim, profile->caller_id_name, delim, profile->caller_id_number, delim); - if (switch_test_flag(member, MFLAG_CAN_HEAR)) { + if (member_test_flag(member, MFLAG_CAN_HEAR)) { stream->write_function(stream, "hear"); count++; } - if (switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (member_test_flag(member, MFLAG_CAN_SPEAK)) { stream->write_function(stream, "%s%s", count ? "|" : "", "speak"); count++; } - if (switch_test_flag(member, MFLAG_TALKING)) { + if (member_test_flag(member, MFLAG_TALKING)) { stream->write_function(stream, "%s%s", count ? "|" : "", "talking"); count++; } @@ -8322,12 +9341,12 @@ static void conference_list(conference_obj_t *conference, switch_stream_handle_t count++; } - if (switch_test_flag(member, MFLAG_MOD)) { + if (member_test_flag(member, MFLAG_MOD)) { stream->write_function(stream, "%s%s", count ? "|" : "", "moderator"); count++; } - if (switch_test_flag(member, MFLAG_GHOST)) { + if (member_test_flag(member, MFLAG_GHOST)) { stream->write_function(stream, "%s%s", count ? "|" : "", "ghost"); count++; } @@ -8403,15 +9422,15 @@ static switch_status_t conf_api_sub_mute(conference_member_t *member, switch_str if (member == NULL) return SWITCH_STATUS_GENERR; - switch_clear_flag_locked(member, MFLAG_CAN_SPEAK); - switch_clear_flag_locked(member, MFLAG_TALKING); + member_clear_flag_locked(member, MFLAG_CAN_SPEAK); + member_clear_flag_locked(member, MFLAG_TALKING); - if (member->session && !switch_test_flag(member, MFLAG_MUTE_DETECT)) { + if (member->session && !member_test_flag(member, MFLAG_MUTE_DETECT)) { switch_core_media_hard_mute(member->session, SWITCH_TRUE); } if (!(data) || !strstr((char *) data, "quiet")) { - switch_set_flag(member, MFLAG_INDICATE_MUTE); + member_set_flag(member, MFLAG_INDICATE_MUTE); } member->score_iir = 0; @@ -8426,7 +9445,7 @@ static switch_status_t conf_api_sub_mute(conference_member_t *member, switch_str switch_event_fire(&event); } - if (switch_test_flag(member->conference, CFLAG_POSITIONAL)) { + if (conference_test_flag(member->conference, CFLAG_POSITIONAL)) { gen_arc(member->conference, NULL); } @@ -8442,7 +9461,7 @@ static switch_status_t conf_api_sub_tmute(conference_member_t *member, switch_st if (member == NULL) return SWITCH_STATUS_GENERR; - if (switch_test_flag(member, MFLAG_CAN_SPEAK)) { + if (member_test_flag(member, MFLAG_CAN_SPEAK)) { return conf_api_sub_mute(member, stream, data); } @@ -8457,14 +9476,14 @@ static switch_status_t conf_api_sub_unmute(conference_member_t *member, switch_s if (member == NULL) return SWITCH_STATUS_GENERR; - switch_set_flag_locked(member, MFLAG_CAN_SPEAK); + member_set_flag_locked(member, MFLAG_CAN_SPEAK); - if (member->session && !switch_test_flag(member, MFLAG_MUTE_DETECT)) { + if (member->session && !member_test_flag(member, MFLAG_MUTE_DETECT)) { switch_core_media_hard_mute(member->session, SWITCH_FALSE); } if (!(data) || !strstr((char *) data, "quiet")) { - switch_set_flag(member, MFLAG_INDICATE_UNMUTE); + member_set_flag(member, MFLAG_INDICATE_UNMUTE); } if (stream != NULL) { @@ -8478,7 +9497,7 @@ static switch_status_t conf_api_sub_unmute(conference_member_t *member, switch_s switch_event_fire(&event); } - if (switch_test_flag(member->conference, CFLAG_POSITIONAL)) { + if (conference_test_flag(member->conference, CFLAG_POSITIONAL)) { gen_arc(member->conference, NULL); } @@ -8494,6 +9513,10 @@ static switch_status_t conf_api_sub_vmute_snap(conference_member_t *member, swit if (member == NULL) return SWITCH_STATUS_GENERR; + if (member->video_flow == SWITCH_MEDIA_FLOW_SENDONLY) { + return SWITCH_STATUS_SUCCESS; + } + if (!member->conference->canvas) { stream->write_function(stream, "Conference is not in mixing mode\n"); return SWITCH_STATUS_SUCCESS; @@ -8519,7 +9542,11 @@ static switch_status_t conf_api_sub_vmute(conference_member_t *member, switch_st if (member == NULL) return SWITCH_STATUS_GENERR; - switch_clear_flag_locked(member, MFLAG_CAN_BE_SEEN); + if (member->video_flow == SWITCH_MEDIA_FLOW_SENDONLY) { + return SWITCH_STATUS_SUCCESS; + } + + member_clear_flag_locked(member, MFLAG_CAN_BE_SEEN); reset_video_bitrate_counters(member); if (member->channel) { @@ -8529,7 +9556,7 @@ static switch_status_t conf_api_sub_vmute(conference_member_t *member, switch_st } if (!(data) || !strstr((char *) data, "quiet")) { - switch_set_flag(member, MFLAG_INDICATE_MUTE); + member_set_flag(member, MFLAG_INDICATE_MUTE); } if (stream != NULL) { @@ -8555,7 +9582,7 @@ static switch_status_t conf_api_sub_tvmute(conference_member_t *member, switch_s if (member == NULL) return SWITCH_STATUS_GENERR; - if (switch_test_flag(member, MFLAG_CAN_BE_SEEN)) { + if (member_test_flag(member, MFLAG_CAN_BE_SEEN)) { return conf_api_sub_vmute(member, stream, data); } @@ -8570,15 +9597,19 @@ static switch_status_t conf_api_sub_unvmute(conference_member_t *member, switch_ if (member == NULL) return SWITCH_STATUS_GENERR; + + if (member->video_flow == SWITCH_MEDIA_FLOW_SENDONLY) { + return SWITCH_STATUS_SUCCESS; + } if (member->conference->canvas) { switch_mutex_lock(member->conference->canvas->mutex); layer = &member->conference->canvas->layers[member->video_layer_id]; - clear_layer(member->conference->canvas, layer); + clear_layer(layer); switch_mutex_unlock(member->conference->canvas->mutex); } - switch_set_flag_locked(member, MFLAG_CAN_BE_SEEN); + member_set_flag_locked(member, MFLAG_CAN_BE_SEEN); reset_video_bitrate_counters(member); if (member->channel) { @@ -8587,7 +9618,7 @@ static switch_status_t conf_api_sub_unvmute(conference_member_t *member, switch_ } if (!(data) || !strstr((char *) data, "quiet")) { - switch_set_flag(member, MFLAG_INDICATE_UNMUTE); + member_set_flag(member, MFLAG_INDICATE_UNMUTE); } if (stream != NULL) { @@ -8614,7 +9645,7 @@ static switch_status_t conf_api_sub_deaf(conference_member_t *member, switch_str if (member == NULL) return SWITCH_STATUS_GENERR; - switch_clear_flag_locked(member, MFLAG_CAN_HEAR); + member_clear_flag_locked(member, MFLAG_CAN_HEAR); if (stream != NULL) { stream->write_function(stream, "OK deaf %u\n", member->id); } @@ -8624,7 +9655,7 @@ static switch_status_t conf_api_sub_deaf(conference_member_t *member, switch_str switch_event_fire(&event); } - if (switch_test_flag(member->conference, CFLAG_POSITIONAL)) { + if (conference_test_flag(member->conference, CFLAG_POSITIONAL)) { gen_arc(member->conference, NULL); } @@ -8638,7 +9669,7 @@ static switch_status_t conf_api_sub_undeaf(conference_member_t *member, switch_s if (member == NULL) return SWITCH_STATUS_GENERR; - switch_set_flag_locked(member, MFLAG_CAN_HEAR); + member_set_flag_locked(member, MFLAG_CAN_HEAR); if (stream != NULL) { stream->write_function(stream, "OK undeaf %u\n", member->id); } @@ -8648,7 +9679,7 @@ static switch_status_t conf_api_sub_undeaf(conference_member_t *member, switch_s switch_event_fire(&event); } - if (switch_test_flag(member->conference, CFLAG_POSITIONAL)) { + if (conference_test_flag(member->conference, CFLAG_POSITIONAL)) { gen_arc(member->conference, NULL); } @@ -8663,7 +9694,7 @@ static switch_status_t conf_api_sub_hup(conference_member_t *member, switch_stre return SWITCH_STATUS_GENERR; } - switch_clear_flag(member, MFLAG_RUNNING); + member_clear_flag(member, MFLAG_RUNNING); if (member->conference && test_eflag(member->conference, EFLAG_HUP_MEMBER)) { if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { @@ -8684,8 +9715,8 @@ static switch_status_t conf_api_sub_kick(conference_member_t *member, switch_str return SWITCH_STATUS_GENERR; } - switch_clear_flag(member, MFLAG_RUNNING); - switch_set_flag_locked(member, MFLAG_KICKED); + member_clear_flag(member, MFLAG_RUNNING); + member_set_flag_locked(member, MFLAG_KICKED); switch_core_session_kill_channel(member->session, SWITCH_SIG_BREAK); if (data && member->session) { @@ -8750,6 +9781,196 @@ static switch_status_t conf_api_sub_dtmf(conference_member_t *member, switch_str return SWITCH_STATUS_SUCCESS; } +static int get_canvas_id(conference_member_t *member, const char *val, switch_bool_t watching) +{ + int index = -1; + int cur; + + if (watching) { + cur = member->watching_canvas_id; + } else { + cur = member->canvas_id; + } + + if (!val) { + return -1; + } + + if (switch_is_number(val)) { + index = atoi(val) - 1; + + if (index < 0) { + index = 0; + } + } else { + index = cur; + + if (!strcasecmp(val, "next")) { + index++; + } else if (!strcasecmp(val, "prev")) { + index--; + } + } + + if (watching) { + if (index > member->conference->canvas_count || !member->conference->canvases[index]) { + index = 0; + } else if (index < 0) { + index = member->conference->canvas_count; + } + } else { + if (index >= member->conference->canvas_count || !member->conference->canvases[index]) { + index = 0; + } else if (index < 0) { + index = member->conference->canvas_count; + } + } + + if (index > MAX_CANVASES || index < 0) { + return -1; + } + + if (member->conference->canvas_count > 1) { + if (index > member->conference->canvas_count) { + return -1; + } + } else { + if (index >= member->conference->canvas_count) { + return -1; + } + } + + return index; +} + +static switch_status_t conf_api_sub_watching_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data) +{ + int index; + char *val = (char *) data; + + if (member->conference->canvas_count == 1) { + stream->write_function(stream, "-ERR Only 1 Canvas\n"); + return SWITCH_STATUS_SUCCESS; + } + + index = get_canvas_id(member, val, SWITCH_TRUE); + + if (index < 0) { + stream->write_function(stream, "-ERR Invalid DATA\n"); + return SWITCH_STATUS_SUCCESS; + } + + member->watching_canvas_id = index; + reset_member_codec_index(member); + switch_core_session_request_video_refresh(member->session); + switch_core_media_gen_key_frame(member->session); + member->conference->canvases[index]->send_keyframe = 10; + member->conference->canvases[index]->refresh = 1; + stream->write_function(stream, "+OK watching canvas %d\n", index + 1); + + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t conf_api_sub_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data) +{ + int index; + char *val = (char *) data; + mcu_canvas_t *canvas = NULL; + + if (member->conference->canvas_count == 1) { + stream->write_function(stream, "-ERR Only 1 Canvas\n"); + return SWITCH_STATUS_SUCCESS; + } + + switch_mutex_lock(member->conference->canvas_mutex); + + index = get_canvas_id(member, val, SWITCH_FALSE); + + if (index < 0) { + stream->write_function(stream, "-ERR Invalid DATA\n"); + switch_mutex_unlock(member->conference->canvas_mutex); + return SWITCH_STATUS_SUCCESS; + } + + detach_video_layer(member); + member->canvas_id = index; + + canvas = member->conference->canvases[member->canvas_id]; + attach_video_layer(member, canvas, index); + reset_member_codec_index(member); + switch_mutex_unlock(member->conference->canvas_mutex); + + switch_core_session_request_video_refresh(member->session); + switch_core_media_gen_key_frame(member->session); + member->conference->canvases[index]->send_keyframe = 10; + member->conference->canvases[index]->refresh = 1; + stream->write_function(stream, "+OK canvas %d\n", member->canvas_id + 1); + + return SWITCH_STATUS_SUCCESS; +} + + + +static switch_status_t conf_api_sub_layer(conference_member_t *member, switch_stream_handle_t *stream, void *data) +{ + int index = -1; + mcu_canvas_t *canvas = NULL; + char *val = (char *) data; + + if (!val) { + stream->write_function(stream, "-ERR Invalid DATA\n"); + return SWITCH_STATUS_SUCCESS; + } + + if (member->canvas_id < 0) { + stream->write_function(stream, "-ERR Invalid Canvas\n"); + return SWITCH_STATUS_FALSE; + } + + + switch_mutex_lock(member->conference->canvas_mutex); + + if (switch_is_number(val)) { + index = atoi(val) - 1; + + if (index < 0) { + index = 0; + } + } else { + index = member->video_layer_id; + + if (index < 0) index = 0; + + if (!strcasecmp(val, "next")) { + index++; + } else if (!strcasecmp(val, "prev")) { + index--; + } + } + + canvas = member->conference->canvases[member->canvas_id]; + + if (index >= canvas->total_layers) { + index = 0; + } + + if (index < 0) { + index = canvas->total_layers - 1; + } + + attach_video_layer(member, canvas, index); + switch_mutex_unlock(member->conference->canvas_mutex); + + switch_core_session_request_video_refresh(member->session); + switch_core_media_gen_key_frame(member->session); + canvas->send_keyframe = 10; + canvas->refresh = 1; + stream->write_function(stream, "+OK layer %d\n", member->video_layer_id + 1); + + return SWITCH_STATUS_SUCCESS; +} + + static switch_status_t conf_api_sub_energy(conference_member_t *member, switch_stream_handle_t *stream, void *data) { switch_event_t *event; @@ -8802,18 +10023,18 @@ static switch_status_t conf_api_sub_auto_position(conference_obj_t *conference, if (!zstr(arg)) { if (!strcasecmp(arg, "on")) { - switch_set_flag(conference, CFLAG_POSITIONAL); + conference_set_flag(conference, CFLAG_POSITIONAL); set = 1; } else if (!strcasecmp(arg, "off")) { - switch_clear_flag(conference, CFLAG_POSITIONAL); + conference_clear_flag(conference, CFLAG_POSITIONAL); } } - if (set && switch_test_flag(conference, CFLAG_POSITIONAL)) { + if (set && conference_test_flag(conference, CFLAG_POSITIONAL)) { gen_arc(conference, stream); } - stream->write_function(stream, "+OK positioning %s\n", switch_test_flag(conference, CFLAG_POSITIONAL) ? "on" : "off"); + stream->write_function(stream, "+OK positioning %s\n", conference_test_flag(conference, CFLAG_POSITIONAL) ? "on" : "off"); #else stream->write_function(stream, "-ERR not supported\n"); @@ -8834,15 +10055,15 @@ static switch_status_t conf_api_sub_position(conference_member_t *member, switch return SWITCH_STATUS_GENERR; } - if (switch_test_flag(member, MFLAG_NO_POSITIONAL)) { + if (member_test_flag(member, MFLAG_NO_POSITIONAL)) { if (stream) stream->write_function(stream, "%s has positional audio blocked.\n", switch_channel_get_name(member->channel)); return SWITCH_STATUS_SUCCESS; } if (!member->al) { - if (!switch_test_flag(member, MFLAG_POSITIONAL) && member->conference->channels == 2) { - switch_set_flag(member, MFLAG_POSITIONAL); + if (!member_test_flag(member, MFLAG_POSITIONAL) && member->conference->channels == 2) { + member_set_flag(member, MFLAG_POSITIONAL); member->al = create_al(member->pool); } else { @@ -8954,7 +10175,9 @@ static switch_status_t conf_api_sub_volume_out(conference_member_t *member, swit static switch_status_t conf_api_sub_vid_bandwidth(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) { - if (!switch_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) { + int32_t i, video_write_bandwidth; + + if (!conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) { stream->write_function(stream, "Bandwidth control not available.\n"); return SWITCH_STATUS_SUCCESS; } @@ -8964,8 +10187,14 @@ static switch_status_t conf_api_sub_vid_bandwidth(conference_obj_t *conference, return SWITCH_STATUS_SUCCESS; } - conference->video_write_bandwidth = switch_parse_bandwidth_string(argv[2]); - stream->write_function(stream, "Set Bandwidth %d\n", conference->video_write_bandwidth); + video_write_bandwidth = switch_parse_bandwidth_string(argv[2]); + for (i = 0; i >= conference->canvas_count; i++) { + if (conference->canvases[i]) { + conference->canvases[i]->video_write_bandwidth = video_write_bandwidth; + } + } + + stream->write_function(stream, "Set Bandwidth %d\n", video_write_bandwidth); return SWITCH_STATUS_SUCCESS; } @@ -8999,20 +10228,28 @@ static switch_status_t conf_api_sub_vid_fps(conference_obj_t *conference, switch static switch_status_t conf_api_sub_write_png(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) { switch_status_t status = SWITCH_STATUS_FALSE; + mcu_canvas_t *canvas = NULL; if (!argv[2]) { stream->write_function(stream, "Invalid input\n"); return SWITCH_STATUS_SUCCESS; } - if (!conference->canvas) { + if (!conference->canvas_count) { stream->write_function(stream, "Conference is not in mixing mode\n"); return SWITCH_STATUS_SUCCESS; } - switch_mutex_lock(conference->canvas->mutex); - status = switch_img_write_png(conference->canvas->img, argv[2]); - switch_mutex_unlock(conference->canvas->mutex); + if (conference->canvas_count > 1) { + /* pick super canvas */ + canvas = conference->canvases[conference->canvas_count]; + } else { + canvas = conference->canvases[0]; + } + + switch_mutex_lock(canvas->mutex); + status = switch_img_write_png(canvas->img, argv[2]); + switch_mutex_unlock(canvas->mutex); stream->write_function(stream, "%s\n", status == SWITCH_STATUS_SUCCESS ? "+OK" : "-ERR"); @@ -9022,6 +10259,7 @@ static switch_status_t conf_api_sub_write_png(conference_obj_t *conference, swit static switch_status_t conf_api_sub_vid_layout(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) { video_layout_t *vlayout = NULL; + int idx = 0; if (!argv[2]) { stream->write_function(stream, "Invalid input\n"); @@ -9052,21 +10290,28 @@ static switch_status_t conf_api_sub_vid_layout(conference_obj_t *conference, swi return SWITCH_STATUS_SUCCESS; } else { if (((lg = switch_core_hash_find(conference->layout_group_hash, argv[3])))) { - vlayout = find_best_layout(conference, lg); + vlayout = find_best_layout(conference, lg, 0); } if (!vlayout) { stream->write_function(stream, "Invalid group layout [%s]\n", argv[3]); return SWITCH_STATUS_SUCCESS; } - + stream->write_function(stream, "Change to layout group [%s]\n", argv[3]); conference->video_layout_group = switch_core_strdup(conference->pool, argv[3]); + + if (argv[4]) { + idx = atoi(argv[4]); + } } } if (!vlayout && (vlayout = switch_core_hash_find(conference->layout_hash, argv[2]))) { conference->video_layout_group = NULL; + if (argv[3]) { + idx = atoi(argv[3]); + } } if (!vlayout) { @@ -9074,10 +10319,12 @@ static switch_status_t conf_api_sub_vid_layout(conference_obj_t *conference, swi return SWITCH_STATUS_SUCCESS; } - stream->write_function(stream, "Change to layout [%s]\n", vlayout->name); + if (idx < 0 || idx > conference->canvas_count - 1) idx = 0; + + stream->write_function(stream, "Change canvas %d to layout [%s]\n", idx, vlayout->name); switch_mutex_lock(conference->member_mutex); - conference->canvas->new_vlayout = vlayout; + conference->canvases[idx]->new_vlayout = vlayout; switch_mutex_unlock(conference->member_mutex); return SWITCH_STATUS_SUCCESS; @@ -9128,59 +10375,59 @@ static switch_status_t conf_api_sub_list(conference_obj_t *conference, switch_st stream->write_function(stream, "Conference %s (%u member%s rate: %u%s flags: ", conference->name, conference->count, - conference->count == 1 ? "" : "s", conference->rate, switch_test_flag(conference, CFLAG_LOCKED) ? " locked" : ""); + conference->count == 1 ? "" : "s", conference->rate, conference_test_flag(conference, CFLAG_LOCKED) ? " locked" : ""); - if (switch_test_flag(conference, CFLAG_LOCKED)) { + if (conference_test_flag(conference, CFLAG_LOCKED)) { stream->write_function(stream, "%slocked", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_DESTRUCT)) { + if (conference_test_flag(conference, CFLAG_DESTRUCT)) { stream->write_function(stream, "%sdestruct", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_WAIT_MOD)) { + if (conference_test_flag(conference, CFLAG_WAIT_MOD)) { stream->write_function(stream, "%swait_mod", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_AUDIO_ALWAYS)) { + if (conference_test_flag(conference, CFLAG_AUDIO_ALWAYS)) { stream->write_function(stream, "%saudio_always", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_RUNNING)) { + if (conference_test_flag(conference, CFLAG_RUNNING)) { stream->write_function(stream, "%srunning", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_ANSWERED)) { + if (conference_test_flag(conference, CFLAG_ANSWERED)) { stream->write_function(stream, "%sanswered", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_ENFORCE_MIN)) { + if (conference_test_flag(conference, CFLAG_ENFORCE_MIN)) { stream->write_function(stream, "%senforce_min", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_BRIDGE_TO)) { + if (conference_test_flag(conference, CFLAG_BRIDGE_TO)) { stream->write_function(stream, "%sbridge_to", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_DYNAMIC)) { + if (conference_test_flag(conference, CFLAG_DYNAMIC)) { stream->write_function(stream, "%sdynamic", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_EXIT_SOUND)) { + if (conference_test_flag(conference, CFLAG_EXIT_SOUND)) { stream->write_function(stream, "%sexit_sound", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_ENTER_SOUND)) { + if (conference_test_flag(conference, CFLAG_ENTER_SOUND)) { stream->write_function(stream, "%senter_sound", fcount ? "|" : ""); fcount++; } @@ -9190,16 +10437,66 @@ static switch_status_t conf_api_sub_list(conference_obj_t *conference, switch_st fcount++; } - if (switch_test_flag(conference, CFLAG_VID_FLOOR)) { + if (conference_test_flag(conference, CFLAG_VID_FLOOR)) { stream->write_function(stream, "%svideo_floor_only", fcount ? "|" : ""); fcount++; } - if (switch_test_flag(conference, CFLAG_RFC4579)) { + if (conference_test_flag(conference, CFLAG_RFC4579)) { stream->write_function(stream, "%svideo_rfc4579", fcount ? "|" : ""); fcount++; } + if (conference_test_flag(conference, CFLAG_LIVEARRAY_SYNC)) { + stream->write_function(stream, "%slivearray_sync", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_VID_FLOOR_LOCK)) { + stream->write_function(stream, "%svideo_floor_lock", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { + stream->write_function(stream, "%stranscode_video", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_VIDEO_MUXING)) { + stream->write_function(stream, "%svideo_muxing", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) { + stream->write_function(stream, "%sminimize_video_encoding", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE)) { + stream->write_function(stream, "%smanage_inbound_bitrate", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_JSON_STATUS)) { + stream->write_function(stream, "%sjson_status", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_VIDEO_BRIDGE_FIRST_TWO)) { + stream->write_function(stream, "%svideo_bridge_first_two", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS)) { + stream->write_function(stream, "%svideo_required_for_canvas", fcount ? "|" : ""); + fcount++; + } + + if (conference_test_flag(conference, CFLAG_PERSONAL_CANVAS)) { + stream->write_function(stream, "%spersonal_canvas", fcount ? "|" : ""); + fcount++; + } + if (!fcount) { stream->write_function(stream, "none"); } @@ -9269,7 +10566,7 @@ static switch_status_t conf_api_sub_clear_vid_floor(conference_obj_t *conference { switch_mutex_lock(conference->mutex); - switch_clear_flag(conference, CFLAG_VID_FLOOR_LOCK); + conference_clear_flag(conference, CFLAG_VID_FLOOR_LOCK); //conference_set_video_floor_holder(conference, NULL); switch_mutex_unlock(conference->mutex); @@ -9288,14 +10585,14 @@ static switch_status_t conf_api_sub_vid_mute_img(conference_member_t *member, sw return SWITCH_STATUS_FALSE; } - switch_mutex_lock(member->conference->canvas->mutex); + switch_mutex_lock(layer->canvas->mutex); - if (member->video_layer_id == -1 || !member->conference->canvas) { + if (member->video_layer_id == -1 || !layer->canvas) { goto end; } member->video_mute_png = NULL; - layer = &member->conference->canvas->layers[member->video_layer_id]; + layer = &layer->canvas->layers[member->video_layer_id]; if (text) { switch_img_free(&layer->mute_img); @@ -9309,7 +10606,7 @@ static switch_status_t conf_api_sub_vid_mute_img(conference_member_t *member, sw stream->write_function(stream, "%s\n", member->video_mute_png ? member->video_mute_png : "_undef_"); - switch_mutex_unlock(member->conference->canvas->mutex); + switch_mutex_unlock(layer->canvas->mutex); return SWITCH_STATUS_SUCCESS; @@ -9332,9 +10629,11 @@ static switch_status_t conf_api_sub_vid_logo_img(conference_member_t *member, sw goto end; } - switch_mutex_lock(member->conference->canvas->mutex); + layer = &member->conference->canvas->layers[member->video_layer_id]; + + switch_mutex_lock(layer->canvas->mutex); if (strcasecmp(text, "clear")) { member->video_logo = switch_core_strdup(member->pool, text); @@ -9346,7 +10645,7 @@ static switch_status_t conf_api_sub_vid_logo_img(conference_member_t *member, sw stream->write_function(stream, "+OK\n"); - switch_mutex_unlock(member->conference->canvas->mutex); + switch_mutex_unlock(layer->canvas->mutex); return SWITCH_STATUS_SUCCESS; @@ -9454,8 +10753,8 @@ static switch_status_t conf_api_sub_vid_floor(conference_member_t *member, switc force = 1; } - if (member->conference->video_floor_holder == member->id && switch_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK)) { - switch_clear_flag(member->conference, CFLAG_VID_FLOOR_LOCK); + if (member->conference->video_floor_holder == member->id && conference_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK)) { + conference_clear_flag(member->conference, CFLAG_VID_FLOOR_LOCK); conference_set_floor_holder(member->conference, member); if (stream == NULL) { @@ -9465,7 +10764,7 @@ static switch_status_t conf_api_sub_vid_floor(conference_member_t *member, switc } } else if (force || member->conference->video_floor_holder == 0) { - switch_set_flag(member->conference, CFLAG_VID_FLOOR_LOCK); + conference_set_flag(member->conference, CFLAG_VID_FLOOR_LOCK); conference_set_video_floor_holder(member->conference, member, SWITCH_TRUE); if (test_eflag(member->conference, EFLAG_FLOOR_CHANGE)) { if (stream == NULL) { @@ -9532,47 +10831,47 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer switch_xml_set_attr_d(x_conference, "rate", ival); switch_xml_set_attr_d(x_conference, "uuid", conference->uuid_str); - if (switch_test_flag(conference, CFLAG_LOCKED)) { + if (conference_test_flag(conference, CFLAG_LOCKED)) { switch_xml_set_attr_d(x_conference, "locked", "true"); } - if (switch_test_flag(conference, CFLAG_DESTRUCT)) { + if (conference_test_flag(conference, CFLAG_DESTRUCT)) { switch_xml_set_attr_d(x_conference, "destruct", "true"); } - if (switch_test_flag(conference, CFLAG_WAIT_MOD)) { + if (conference_test_flag(conference, CFLAG_WAIT_MOD)) { switch_xml_set_attr_d(x_conference, "wait_mod", "true"); } - if (switch_test_flag(conference, CFLAG_AUDIO_ALWAYS)) { + if (conference_test_flag(conference, CFLAG_AUDIO_ALWAYS)) { switch_xml_set_attr_d(x_conference, "audio_always", "true"); } - if (switch_test_flag(conference, CFLAG_RUNNING)) { + if (conference_test_flag(conference, CFLAG_RUNNING)) { switch_xml_set_attr_d(x_conference, "running", "true"); } - if (switch_test_flag(conference, CFLAG_ANSWERED)) { + if (conference_test_flag(conference, CFLAG_ANSWERED)) { switch_xml_set_attr_d(x_conference, "answered", "true"); } - if (switch_test_flag(conference, CFLAG_ENFORCE_MIN)) { + if (conference_test_flag(conference, CFLAG_ENFORCE_MIN)) { switch_xml_set_attr_d(x_conference, "enforce_min", "true"); } - if (switch_test_flag(conference, CFLAG_BRIDGE_TO)) { + if (conference_test_flag(conference, CFLAG_BRIDGE_TO)) { switch_xml_set_attr_d(x_conference, "bridge_to", "true"); } - if (switch_test_flag(conference, CFLAG_DYNAMIC)) { + if (conference_test_flag(conference, CFLAG_DYNAMIC)) { switch_xml_set_attr_d(x_conference, "dynamic", "true"); } - if (switch_test_flag(conference, CFLAG_EXIT_SOUND)) { + if (conference_test_flag(conference, CFLAG_EXIT_SOUND)) { switch_xml_set_attr_d(x_conference, "exit_sound", "true"); } - if (switch_test_flag(conference, CFLAG_ENTER_SOUND)) { + if (conference_test_flag(conference, CFLAG_ENTER_SOUND)) { switch_xml_set_attr_d(x_conference, "enter_sound", "true"); } @@ -9590,11 +10889,11 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer switch_xml_set_attr_d(x_conference, "endconf_grace_time", ival); } - if (switch_test_flag(conference, CFLAG_VID_FLOOR)) { + if (conference_test_flag(conference, CFLAG_VID_FLOOR)) { switch_xml_set_attr_d(x_conference, "video_floor_only", "true"); } - if (switch_test_flag(conference, CFLAG_RFC4579)) { + if (conference_test_flag(conference, CFLAG_RFC4579)) { switch_xml_set_attr_d(x_conference, "video_rfc4579", "true"); } @@ -9622,7 +10921,7 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer int toff = 0; char tmp[50] = ""; - if (switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (member_test_flag(member, MFLAG_NOCHANNEL)) { if (member->rec_path) { x_member = switch_xml_add_child_d(x_members, "member", moff++); switch_assert(x_member); @@ -9632,7 +10931,7 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer */ x_tag = switch_xml_add_child_d(x_member, "record_path", count++); - if (switch_test_flag(member, MFLAG_PAUSE_RECORDING)) { + if (member_test_flag(member, MFLAG_PAUSE_RECORDING)) { switch_xml_set_attr_d(x_tag, "status", "paused"); } switch_xml_set_txt_d(x_tag, member->rec_path); @@ -9682,34 +10981,34 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer switch_assert(x_flags); x_tag = switch_xml_add_child_d(x_flags, "can_hear", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_CAN_HEAR) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_CAN_HEAR) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "can_speak", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_CAN_SPEAK) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_CAN_SPEAK) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "mute_detect", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_MUTE_DETECT) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_MUTE_DETECT) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "talking", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_TALKING) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_TALKING) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "has_video", count++); switch_xml_set_txt_d(x_tag, switch_channel_test_flag(switch_core_session_get_channel(member->session), CF_VIDEO) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "video_bridge", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_VIDEO_BRIDGE) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_VIDEO_BRIDGE) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "has_floor", count++); switch_xml_set_txt_d(x_tag, (member == member->conference->floor_holder) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "is_moderator", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_MOD) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_MOD) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "end_conference", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_ENDCONF) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_ENDCONF) ? "true" : "false"); x_tag = switch_xml_add_child_d(x_flags, "is_ghost", count++); - switch_xml_set_txt_d(x_tag, switch_test_flag(member, MFLAG_GHOST) ? "true" : "false"); + switch_xml_set_txt_d(x_tag, member_test_flag(member, MFLAG_GHOST) ? "true" : "false"); switch_snprintf(tmp, sizeof(tmp), "%d", member->volume_out_level); add_x_tag(x_member, "output-volume", tmp, toff++); @@ -10129,8 +11428,8 @@ static switch_status_t conf_api_sub_relate(conference_obj_t *conference, switch_ other_member = conference_member_get(conference, oid); if (other_member) { - if (switch_test_flag(other_member, MFLAG_RECEIVING_VIDEO)) { - switch_clear_flag(other_member, MFLAG_RECEIVING_VIDEO); + if (member_test_flag(other_member, MFLAG_RECEIVING_VIDEO)) { + member_clear_flag(other_member, MFLAG_RECEIVING_VIDEO); if (conference->floor_holder) { switch_core_session_request_video_refresh(conference->floor_holder->session); } @@ -10158,7 +11457,7 @@ static switch_status_t conf_api_sub_relate(conference_obj_t *conference, switch_ if (member && other_member) { conference_relationship_t *rel = NULL; - if (sendvideo && switch_test_flag(other_member, MFLAG_RECEIVING_VIDEO) && (! (nospeak || nohear))) { + if (sendvideo && member_test_flag(other_member, MFLAG_RECEIVING_VIDEO) && (! (nospeak || nohear))) { stream->write_function(stream, "member %d already receiving video", oid); goto skip; } @@ -10173,14 +11472,14 @@ static switch_status_t conf_api_sub_relate(conference_obj_t *conference, switch_ switch_set_flag(rel, RFLAG_CAN_SPEAK | RFLAG_CAN_HEAR); if (nospeak) { switch_clear_flag(rel, RFLAG_CAN_SPEAK); - switch_clear_flag_locked(member, MFLAG_TALKING); + member_clear_flag_locked(member, MFLAG_TALKING); } if (nohear) { switch_clear_flag(rel, RFLAG_CAN_HEAR); } if (sendvideo) { switch_set_flag(rel, RFLAG_CAN_SEND_VIDEO); - switch_set_flag(other_member, MFLAG_RECEIVING_VIDEO); + member_set_flag(other_member, MFLAG_RECEIVING_VIDEO); switch_core_session_request_video_refresh(member->session); } @@ -10216,7 +11515,7 @@ static switch_status_t conf_api_sub_lock(conference_obj_t *conference, switch_st conference_play_file(conference, conference->is_locked_sound, CONF_DEFAULT_LEADIN, NULL, 0); } - switch_set_flag_locked(conference, CFLAG_LOCKED); + conference_set_flag_locked(conference, CFLAG_LOCKED); stream->write_function(stream, "OK %s locked\n", argv[0]); if (test_eflag(conference, EFLAG_LOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); @@ -10238,7 +11537,7 @@ static switch_status_t conf_api_sub_unlock(conference_obj_t *conference, switch_ conference_play_file(conference, conference->is_unlocked_sound, CONF_DEFAULT_LEADIN, NULL, 0); } - switch_clear_flag_locked(conference, CFLAG_LOCKED); + conference_clear_flag_locked(conference, CFLAG_LOCKED); stream->write_function(stream, "OK %s unlocked\n", argv[0]); if (test_eflag(conference, EFLAG_UNLOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); @@ -10262,7 +11561,7 @@ static switch_status_t conf_api_sub_exit_sound(conference_obj_t *conference, swi } if ( !strcasecmp(argv[2], "on") ) { - switch_set_flag_locked(conference, CFLAG_EXIT_SOUND); + conference_set_flag_locked(conference, CFLAG_EXIT_SOUND); stream->write_function(stream, "OK %s exit sounds on (%s)\n", argv[0], conference->exit_sound); if (test_eflag(conference, EFLAG_LOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); @@ -10270,7 +11569,7 @@ static switch_status_t conf_api_sub_exit_sound(conference_obj_t *conference, swi switch_event_fire(&event); } } else if ( !strcasecmp(argv[2], "off") || !strcasecmp(argv[2], "none") ) { - switch_clear_flag_locked(conference, CFLAG_EXIT_SOUND); + conference_clear_flag_locked(conference, CFLAG_EXIT_SOUND); stream->write_function(stream, "OK %s exit sounds off (%s)\n", argv[0], conference->exit_sound); if (test_eflag(conference, EFLAG_LOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); @@ -10313,7 +11612,7 @@ static switch_status_t conf_api_sub_enter_sound(conference_obj_t *conference, sw } if ( !strcasecmp(argv[2], "on") ) { - switch_set_flag_locked(conference, CFLAG_ENTER_SOUND); + conference_set_flag_locked(conference, CFLAG_ENTER_SOUND); stream->write_function(stream, "OK %s enter sounds on (%s)\n", argv[0], conference->enter_sound); if (test_eflag(conference, EFLAG_LOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); @@ -10321,7 +11620,7 @@ static switch_status_t conf_api_sub_enter_sound(conference_obj_t *conference, sw switch_event_fire(&event); } } else if ( !strcasecmp(argv[2], "off") || !strcasecmp(argv[2], "none") ) { - switch_clear_flag_locked(conference, CFLAG_ENTER_SOUND); + conference_clear_flag_locked(conference, CFLAG_ENTER_SOUND); stream->write_function(stream, "OK %s enter sounds off (%s)\n", argv[0], conference->enter_sound); if (test_eflag(conference, EFLAG_LOCK) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { conference_add_event_data(conference, event); @@ -10730,7 +12029,7 @@ static switch_status_t conf_api_sub_get(conference_obj_t *conference, conference->caller_id_number); } else if (strcasecmp(argv[2], "is_locked") == 0) { stream->write_function(stream, "%s", - switch_test_flag(conference, CFLAG_LOCKED) ? "locked" : ""); + conference_test_flag(conference, CFLAG_LOCKED) ? "locked" : ""); } else if (strcasecmp(argv[2], "endconf_grace_time") == 0) { stream->write_function(stream, "%d", conference->endconf_grace_time); @@ -10739,7 +12038,7 @@ static switch_status_t conf_api_sub_get(conference_obj_t *conference, conference->uuid_str); } else if (strcasecmp(argv[2], "wait_mod") == 0) { stream->write_function(stream, "%s", - switch_test_flag(conference, CFLAG_WAIT_MOD) ? "true" : ""); + conference_test_flag(conference, CFLAG_WAIT_MOD) ? "true" : ""); } else { ret_status = SWITCH_STATUS_FALSE; } @@ -10826,6 +12125,9 @@ static api_command_t conf_api_sub_commands[] = { {"list", (void_fn_t) & conf_api_sub_list, CONF_API_SUB_ARGS_SPLIT, "list", "[delim ]|[count]"}, {"xml_list", (void_fn_t) & conf_api_sub_xml_list, CONF_API_SUB_ARGS_SPLIT, "xml_list", ""}, {"energy", (void_fn_t) & conf_api_sub_energy, CONF_API_SUB_MEMBER_TARGET, "energy", " []"}, + {"vid-canvas", (void_fn_t) & conf_api_sub_canvas, CONF_API_SUB_MEMBER_TARGET, "vid-canvas", " []"}, + {"vid-watching-canvas", (void_fn_t) & conf_api_sub_watching_canvas, CONF_API_SUB_MEMBER_TARGET, "vid-watching-canvas", " []"}, + {"vid-layer", (void_fn_t) & conf_api_sub_layer, CONF_API_SUB_MEMBER_TARGET, "vid-layer", " []"}, {"volume_in", (void_fn_t) & conf_api_sub_volume_in, CONF_API_SUB_MEMBER_TARGET, "volume_in", " []"}, {"volume_out", (void_fn_t) & conf_api_sub_volume_out, CONF_API_SUB_MEMBER_TARGET, "volume_out", " []"}, {"position", (void_fn_t) & conf_api_sub_position, CONF_API_SUB_MEMBER_TARGET, "position", " ::"}, @@ -10875,7 +12177,7 @@ static api_command_t conf_api_sub_commands[] = { {"vid-logo-img", (void_fn_t) & conf_api_sub_vid_logo_img, CONF_API_SUB_MEMBER_TARGET, "vid-logo-img", " [|clear]"}, {"vid-res-id", (void_fn_t) & conf_api_sub_vid_res_id, CONF_API_SUB_MEMBER_TARGET, "vid-res-id", " |clear"}, {"clear-vid-floor", (void_fn_t) & conf_api_sub_clear_vid_floor, CONF_API_SUB_ARGS_AS_ONE, "clear-vid-floor", ""}, - {"vid-layout", (void_fn_t) & conf_api_sub_vid_layout, CONF_API_SUB_ARGS_SPLIT, "vid-layout", ""}, + {"vid-layout", (void_fn_t) & conf_api_sub_vid_layout, CONF_API_SUB_ARGS_SPLIT, "vid-layout", "|group []"}, {"vid-write-png", (void_fn_t) & conf_api_sub_write_png, CONF_API_SUB_ARGS_SPLIT, "vid-write-png", ""}, {"vid-fps", (void_fn_t) & conf_api_sub_vid_fps, CONF_API_SUB_ARGS_SPLIT, "vid-fps", ""}, {"vid-bandwidth", (void_fn_t) & conf_api_sub_vid_bandwidth, CONF_API_SUB_ARGS_SPLIT, "vid-bandwidth", ""} @@ -10942,7 +12244,7 @@ switch_status_t conf_api_dispatch(conference_obj_t *conference, switch_stream_ha } /* exec functio on last (oldest) member */ - if (last_member != NULL && last_member->session && !switch_test_flag(last_member, MFLAG_NOCHANNEL)) { + if (last_member != NULL && last_member->session && !member_test_flag(last_member, MFLAG_NOCHANNEL)) { conf_api_member_cmd_t pfn = (conf_api_member_cmd_t) conf_api_sub_commands[i].pfnapicmd; pfn(last_member, stream, argv[argn + 2]); } @@ -11181,7 +12483,7 @@ static switch_status_t conference_outcall(conference_obj_t *conference, peer_channel = switch_core_session_get_channel(peer_session); /* make sure the conference still exists */ - if (!switch_test_flag(conference, CFLAG_RUNNING)) { + if (!conference_test_flag(conference, CFLAG_RUNNING)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Conference is gone now, nevermind..\n"); if (caller_channel) { switch_channel_hangup(caller_channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); @@ -11438,7 +12740,7 @@ static void set_mflags(const char *flags, member_flag_t *f) char *argv[10] = { 0 }; int i, argc = 0; - *f |= MFLAG_CAN_SPEAK | MFLAG_CAN_HEAR | MFLAG_CAN_BE_SEEN; + f[MFLAG_CAN_SPEAK] = f[MFLAG_CAN_HEAR] = f[MFLAG_CAN_BE_SEEN] = 1; for (p = dup; p && *p; p++) { if (*p == ',') { @@ -11450,36 +12752,42 @@ static void set_mflags(const char *flags, member_flag_t *f) for (i = 0; i < argc && argv[i]; i++) { if (!strcasecmp(argv[i], "mute")) { - *f &= ~MFLAG_CAN_SPEAK; - *f &= ~MFLAG_TALKING; + f[MFLAG_CAN_SPEAK] = 0; + f[MFLAG_TALKING] = 0; } else if (!strcasecmp(argv[i], "deaf")) { - *f &= ~MFLAG_CAN_HEAR; + f[MFLAG_CAN_HEAR] = 0; } else if (!strcasecmp(argv[i], "mute-detect")) { - *f |= MFLAG_MUTE_DETECT; + f[MFLAG_MUTE_DETECT] = 1; } else if (!strcasecmp(argv[i], "dist-dtmf")) { - *f |= MFLAG_DIST_DTMF; + f[MFLAG_DIST_DTMF] = 1; } else if (!strcasecmp(argv[i], "moderator")) { - *f |= MFLAG_MOD; + f[MFLAG_MOD] = 1; } else if (!strcasecmp(argv[i], "nomoh")) { - *f |= MFLAG_NOMOH; + f[MFLAG_NOMOH] = 1; } else if (!strcasecmp(argv[i], "endconf")) { - *f |= MFLAG_ENDCONF; + f[MFLAG_ENDCONF] = 1; } else if (!strcasecmp(argv[i], "mintwo")) { - *f |= MFLAG_MINTWO; + f[MFLAG_MINTWO] = 1; } else if (!strcasecmp(argv[i], "video-bridge")) { - *f |= MFLAG_VIDEO_BRIDGE; + f[MFLAG_VIDEO_BRIDGE] = 1; } else if (!strcasecmp(argv[i], "ghost")) { - *f |= MFLAG_GHOST; + f[MFLAG_GHOST] = 1; } else if (!strcasecmp(argv[i], "join-only")) { - *f |= MFLAG_JOIN_ONLY; + f[MFLAG_JOIN_ONLY] = 1; } else if (!strcasecmp(argv[i], "positional")) { - *f |= MFLAG_POSITIONAL; + f[MFLAG_POSITIONAL] = 1; } else if (!strcasecmp(argv[i], "no-positional")) { - *f |= MFLAG_NO_POSITIONAL; + f[MFLAG_NO_POSITIONAL] = 1; } else if (!strcasecmp(argv[i], "join-vid-floor")) { - *f |= MFLAG_JOIN_VID_FLOOR; + f[MFLAG_JOIN_VID_FLOOR] = 1; } else if (!strcasecmp(argv[i], "no-minimize-encoding")) { - *f |= MFLAG_NO_MINIMIZE_ENCODING; + f[MFLAG_NO_MINIMIZE_ENCODING] = 1; + } else if (!strcasecmp(argv[i], "second-screen")) { + f[MFLAG_SECOND_SCREEN] = 1; + f[MFLAG_CAN_SPEAK] = 0; + f[MFLAG_TALKING] = 0; + f[MFLAG_CAN_HEAR] = 0; + f[MFLAG_SILENT] = 1; } } @@ -11489,7 +12797,7 @@ static void set_mflags(const char *flags, member_flag_t *f) -static void set_cflags(const char *flags, uint32_t *f) +static void set_cflags(const char *flags, conference_flag_t *f) { if (flags) { char *dup = strdup(flags); @@ -11507,30 +12815,34 @@ static void set_cflags(const char *flags, uint32_t *f) for (i = 0; i < argc && argv[i]; i++) { if (!strcasecmp(argv[i], "wait-mod")) { - *f |= CFLAG_WAIT_MOD; + f[CFLAG_WAIT_MOD] = 1; } else if (!strcasecmp(argv[i], "video-floor-only")) { - *f |= CFLAG_VID_FLOOR; + f[CFLAG_VID_FLOOR] = 1; } else if (!strcasecmp(argv[i], "audio-always")) { - *f |= CFLAG_AUDIO_ALWAYS; + f[CFLAG_AUDIO_ALWAYS] = 1; } else if (!strcasecmp(argv[i], "restart-auto-record")) { - *f |= CFLAG_CONF_RESTART_AUTO_RECORD; + f[CFLAG_CONF_RESTART_AUTO_RECORD] = 1; } else if (!strcasecmp(argv[i], "json-events")) { - *f |= CFLAG_JSON_EVENTS; + f[CFLAG_JSON_EVENTS] = 1; } else if (!strcasecmp(argv[i], "livearray-sync")) { - *f |= CFLAG_LIVEARRAY_SYNC; + f[CFLAG_LIVEARRAY_SYNC] = 1; } else if (!strcasecmp(argv[i], "livearray-json-status")) { - *f |= CFLAG_JSON_STATUS; + f[CFLAG_JSON_STATUS] = 1; } else if (!strcasecmp(argv[i], "rfc-4579")) { - *f |= CFLAG_RFC4579; + f[CFLAG_RFC4579] = 1; } else if (!strcasecmp(argv[i], "auto-3d-position")) { - *f |= CFLAG_POSITIONAL; + f[CFLAG_POSITIONAL] = 1; } else if (!strcasecmp(argv[i], "minimize-video-encoding")) { - *f |= CFLAG_MINIMIZE_VIDEO_ENCODING; + f[CFLAG_MINIMIZE_VIDEO_ENCODING] = 1; + } else if (!strcasecmp(argv[i], "video-bridge-first-two")) { + f[CFLAG_VIDEO_BRIDGE_FIRST_TWO] = 1; + } else if (!strcasecmp(argv[i], "video-required-for-canvas")) { + f[CFLAG_VIDEO_REQUIRED_FOR_CANVAS] = 1; } else if (!strcasecmp(argv[i], "manage-inbound-video-bitrate")) { - *f |= CFLAG_MANAGE_INBOUND_VIDEO_BITRATE; + f[CFLAG_MANAGE_INBOUND_VIDEO_BITRATE] = 1; + } else if (!strcasecmp(argv[i], "video-muxing-personal-canvas")) { + f[CFLAG_PERSONAL_CANVAS] = 1; } - - } free(dup); @@ -11756,6 +13068,60 @@ static int setup_media(conference_member_t *member, conference_obj_t *conference } +static void merge_mflags(member_flag_t *a, member_flag_t *b) +{ + int x; + + for (x = 0; x < MFLAG_MAX; x++) { + if (b[x]) a[x] = 1; + } +} + + +static const char *combine_flag_var(switch_core_session_t *session, const char *var_name) +{ + switch_event_header_t *hp; + switch_event_t *event, *cevent; + char *ret = NULL; + switch_channel_t *channel = switch_core_session_get_channel(session); + + switch_core_get_variables(&event); + switch_channel_get_variables(channel, &cevent); + switch_event_merge(event, cevent); + + + for (hp = event->headers; hp; hp = hp->next) { + char *var = hp->name; + char *val = hp->value; + + if (!strcasecmp(var, var_name)) { + if (hp->idx) { + int i; + for (i = 0; i < hp->idx; i++) { + if (zstr(ret)) { + ret = switch_core_session_sprintf(session, "%s", hp->array[i]); + } else { + ret = switch_core_session_sprintf(session, "%s|%s", ret, hp->array[i]); + } + } + } else { + if (zstr(ret)) { + ret = switch_core_session_sprintf(session, "%s", val); + } else { + ret = switch_core_session_sprintf(session, "%s|%s", ret, val); + } + } + } + } + + + switch_event_destroy(&event); + switch_event_destroy(&cevent); + + return ret; + +} + #define validate_pin(buf, pin, mpin) \ pin_valid = (!zstr(pin) && strcmp(buf, pin) == 0); \ if (!pin_valid && !zstr(mpin) && strcmp(buf, mpin) == 0) { \ @@ -11780,7 +13146,7 @@ SWITCH_STANDARD_APP(conference_function) switch_xml_t cxml = NULL, cfg = NULL, profiles = NULL; const char *flags_str, *v_flags_str; const char *cflags_str, *v_cflags_str; - member_flag_t mflags = 0; + member_flag_t mflags[MFLAG_MAX] = { 0 }; switch_core_session_message_t msg = { 0 }; uint8_t rl = 0, isbr = 0; char *dpin = ""; @@ -11832,8 +13198,9 @@ SWITCH_STANDARD_APP(conference_function) *p = '\0'; } } - - if ((v_flags_str = switch_channel_get_variable(channel, "conference_member_flags"))) { + + //if ((v_flags_str = switch_channel_get_variable(channel, "conference_member_flags"))) { + if ((v_flags_str = combine_flag_var(session, "conference_member_flags"))) { if (zstr(flags_str)) { flags_str = v_flags_str; } else { @@ -11843,7 +13210,8 @@ SWITCH_STANDARD_APP(conference_function) cflags_str = flags_str; - if ((v_cflags_str = switch_channel_get_variable(channel, "conference_flags"))) { + //if ((v_cflags_str = switch_channel_get_variable(channel, "conference_flags"))) { + if ((v_cflags_str = combine_flag_var(session, "conference_flags"))) { if (zstr(cflags_str)) { cflags_str = v_cflags_str; } else { @@ -11941,7 +13309,7 @@ SWITCH_STANDARD_APP(conference_function) goto done; } - set_cflags(cflags_str, &conference->flags); + set_cflags(cflags_str, conference->flags); if (locked) { switch_mutex_unlock(globals.setup_mutex); @@ -11954,10 +13322,10 @@ SWITCH_STANDARD_APP(conference_function) conference->min = 2; /* Indicate the conference is dynamic */ - switch_set_flag_locked(conference, CFLAG_DYNAMIC); + conference_set_flag_locked(conference, CFLAG_DYNAMIC); /* Indicate the conference has a bridgeto party */ - switch_set_flag_locked(conference, CFLAG_BRIDGE_TO); + conference_set_flag_locked(conference, CFLAG_BRIDGE_TO); /* Start the conference thread for this conference */ launch_conference_thread(conference); @@ -11985,15 +13353,15 @@ SWITCH_STANDARD_APP(conference_function) /* no conference yet, so check for join-only flag */ if (flags_str) { - set_mflags(flags_str, &mflags); + set_mflags(flags_str, mflags); - if (!(mflags & MFLAG_CAN_SPEAK)) { - if (!(mflags & MFLAG_MUTE_DETECT)) { + if (!(mflags[MFLAG_CAN_SPEAK])) { + if (!(mflags[MFLAG_MUTE_DETECT])) { switch_core_media_hard_mute(session, SWITCH_TRUE); } } - if (mflags & MFLAG_JOIN_ONLY) { + if (mflags[MFLAG_JOIN_ONLY]) { switch_event_t *event; switch_xml_t jos_xml; char *val; @@ -12025,7 +13393,7 @@ SWITCH_STANDARD_APP(conference_function) goto done; } - set_cflags(cflags_str, &conference->flags); + set_cflags(cflags_str, conference->flags); if (locked) { switch_mutex_unlock(globals.setup_mutex); @@ -12083,7 +13451,7 @@ SWITCH_STANDARD_APP(conference_function) } /* Indicate the conference is dynamic */ - switch_set_flag_locked(conference, CFLAG_DYNAMIC); + conference_set_flag_locked(conference, CFLAG_DYNAMIC); /* acquire a read lock on the thread so it can't leave without us */ if (switch_thread_rwlock_tryrdlock(conference->rwlock) != SWITCH_STATUS_SUCCESS) { @@ -12209,7 +13577,7 @@ SWITCH_STANDARD_APP(conference_function) } /* don't allow more callers if the conference is locked, unless we invited them */ - if (switch_test_flag(conference, CFLAG_LOCKED) && enforce_security) { + if (conference_test_flag(conference, CFLAG_LOCKED) && enforce_security) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Conference %s is locked.\n", conf_name); conference_cdr_rejected(conference, channel, CDRR_LOCKED); if (conference->locked_sound) { @@ -12253,7 +13621,7 @@ SWITCH_STANDARD_APP(conference_function) /* if we're not using "bridge:" set the conference answered flag */ /* and this isn't an outbound channel, answer the call */ if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND) - switch_set_flag(conference, CFLAG_ANSWERED); + conference_set_flag(conference, CFLAG_ANSWERED); } member.session = session; @@ -12288,29 +13656,33 @@ SWITCH_STANDARD_APP(conference_function) /* Install our Signed Linear codec so we get the audio in that format */ switch_core_session_set_read_codec(member.session, &member.read_codec); + + memcpy(mflags, conference->mflags, sizeof(mflags)); + + set_mflags(flags_str, mflags); + mflags[MFLAG_RUNNING] = 1; - mflags = conference->mflags; - set_mflags(flags_str, &mflags); - mflags |= MFLAG_RUNNING; - - if (!(mflags & MFLAG_CAN_SPEAK)) { - if (!(mflags & MFLAG_MUTE_DETECT)) { + if (!(mflags[MFLAG_CAN_SPEAK])) { + if (!(mflags[MFLAG_MUTE_DETECT])) { switch_core_media_hard_mute(member.session, SWITCH_TRUE); } } if (mpin_matched) { - mflags |= MFLAG_MOD; + mflags[MFLAG_MOD] = 1; } - switch_set_flag_locked((&member), mflags); - if (mflags & MFLAG_MINTWO) { + merge_mflags(member.flags, mflags); + + + if (mflags[MFLAG_MINTWO]) { conference->min = 2; } + if (conference->conf_video_mode == CONF_VIDEO_MODE_MUX) { - switch_queue_create(&member.video_queue, 2000, member.pool); - switch_queue_create(&member.mux_out_queue, 2000, member.pool); + switch_queue_create(&member.video_queue, 200, member.pool); + switch_queue_create(&member.mux_out_queue, 200, member.pool); switch_frame_buffer_create(&member.fb); } @@ -12330,7 +13702,7 @@ SWITCH_STANDARD_APP(conference_function) msg.message_id = SWITCH_MESSAGE_INDICATE_BRIDGE; switch_core_session_receive_message(session, &msg); - if (switch_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { + if (conference_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) { switch_channel_set_flag(channel, CF_VIDEO_DECODED_READ); switch_core_media_gen_key_frame(session); } @@ -12339,7 +13711,7 @@ SWITCH_STANDARD_APP(conference_function) switch_core_session_set_video_read_callback(session, video_thread_callback, (void *)&member); if (switch_channel_test_flag(channel, CF_VIDEO_ONLY)) { - while(switch_test_flag((&member), MFLAG_RUNNING) && switch_channel_ready(channel)) { + while(member_test_flag((&member), MFLAG_RUNNING) && switch_channel_ready(channel)) { switch_yield(100000); } } else { @@ -12395,8 +13767,8 @@ SWITCH_STANDARD_APP(conference_function) if (conference) { switch_mutex_lock(conference->mutex); - if (switch_test_flag(conference, CFLAG_DYNAMIC) && conference->count == 0) { - switch_set_flag_locked(conference, CFLAG_DESTRUCT); + if (conference_test_flag(conference, CFLAG_DYNAMIC) && conference->count == 0) { + conference_set_flag_locked(conference, CFLAG_DESTRUCT); } switch_mutex_unlock(conference->mutex); } @@ -12406,7 +13778,7 @@ SWITCH_STANDARD_APP(conference_function) switch_xml_free(cxml); } - if (conference && switch_test_flag(&member, MFLAG_KICKED) && conference->kicked_sound) { + if (conference && member_test_flag(&member, MFLAG_KICKED) && conference->kicked_sound) { char *toplay = NULL; char *dfile = NULL; char *expanded = NULL; @@ -12466,17 +13838,18 @@ static void launch_conference_video_muxing_write_thread(conference_member_t *mem } switch_mutex_unlock(globals.hash_mutex); } -static void launch_conference_video_muxing_thread(conference_obj_t *conference) +static void launch_conference_video_muxing_thread(conference_obj_t *conference, mcu_canvas_t *canvas, int super) { switch_threadattr_t *thd_attr = NULL; + switch_mutex_lock(globals.hash_mutex); - if (!conference->video_muxing_thread) { - switch_set_flag_locked(conference, CFLAG_RUNNING); + if (!canvas->video_muxing_thread) { switch_threadattr_create(&thd_attr, conference->pool); switch_threadattr_priority_set(thd_attr, SWITCH_PRI_REALTIME); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - switch_set_flag(conference, CFLAG_VIDEO_MUXING); - switch_thread_create(&conference->video_muxing_thread, thd_attr, conference_video_muxing_thread_run, conference, conference->pool); + conference_set_flag(conference, CFLAG_VIDEO_MUXING); + switch_thread_create(&canvas->video_muxing_thread, thd_attr, + super ? conference_super_video_muxing_thread_run : conference_video_muxing_thread_run, canvas, conference->pool); } switch_mutex_unlock(globals.hash_mutex); } @@ -12487,7 +13860,7 @@ static void launch_conference_thread(conference_obj_t *conference) switch_thread_t *thread; switch_threadattr_t *thd_attr = NULL; - switch_set_flag_locked(conference, CFLAG_RUNNING); + conference_set_flag_locked(conference, CFLAG_RUNNING); switch_threadattr_create(&thd_attr, conference->pool); switch_threadattr_detach_set(thd_attr, 1); switch_threadattr_priority_set(thd_attr, SWITCH_PRI_REALTIME); @@ -12604,9 +13977,9 @@ static conference_obj_t *conference_find(char *name, char *domain) switch_mutex_lock(globals.hash_mutex); if ((conference = switch_core_hash_find(globals.conference_hash, name))) { - if (switch_test_flag(conference, CFLAG_DESTRUCT)) { + if (conference_test_flag(conference, CFLAG_DESTRUCT)) { switch_core_hash_delete(globals.conference_hash, conference->name); - switch_clear_flag(conference, CFLAG_INHASH); + conference_clear_flag(conference, CFLAG_INHASH); conference = NULL; } else if (!zstr(domain) && conference->domain && strcasecmp(domain, conference->domain)) { conference = NULL; @@ -12665,6 +14038,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c char *video_layout_group = NULL; char *video_canvas_size = NULL; char *video_canvas_bgcolor = NULL; + char *video_super_canvas_bgcolor = NULL; char *video_letterbox_bgcolor = NULL; char *video_codec_bandwidth = NULL; char *no_video_avatar = NULL; @@ -12680,6 +14054,9 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c int pin_retries = 3; int ivr_dtmf_timeout = 500; int ivr_input_timeout = 0; + int video_canvas_count = 0; + int video_super_canvas_label_layers = 0; + int video_super_canvas_show_all_layers = 0; char *suppress_events = NULL; char *verbose_events = NULL; char *auto_record = NULL; @@ -12819,8 +14196,16 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c outcall_templ = val; } else if (!strcasecmp(var, "video-layout-name") && !zstr(val)) { video_layout_name = val; + } else if (!strcasecmp(var, "video-canvas-count") && !zstr(val)) { + video_canvas_count = atoi(val); + } else if (!strcasecmp(var, "video-super-canvas-label-layers") && !zstr(val)) { + video_super_canvas_label_layers = atoi(val); + } else if (!strcasecmp(var, "video-super-canvas-show-all-layers") && !zstr(val)) { + video_super_canvas_show_all_layers = atoi(val); } else if (!strcasecmp(var, "video-canvas-bgcolor") && !zstr(val)) { video_canvas_bgcolor= val; + } else if (!strcasecmp(var, "video-super-canvas-bgcolor") && !zstr(val)) { + video_super_canvas_bgcolor= val; } else if (!strcasecmp(var, "video-letterbox-bgcolor") && !zstr(val)) { video_letterbox_bgcolor= val; } else if (!strcasecmp(var, "video-canvas-size") && !zstr(val)) { @@ -13063,6 +14448,10 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c video_canvas_bgcolor = "#333333"; } + if (!video_super_canvas_bgcolor) { + video_super_canvas_bgcolor = "#068df3"; + } + if (!video_letterbox_bgcolor) { video_letterbox_bgcolor = "#000000"; } @@ -13072,6 +14461,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c } conference->video_canvas_bgcolor = switch_core_strdup(conference->pool, video_canvas_bgcolor); + conference->video_super_canvas_bgcolor = switch_core_strdup(conference->pool, video_super_canvas_bgcolor); conference->video_letterbox_bgcolor = switch_core_strdup(conference->pool, video_letterbox_bgcolor); if (fps) { @@ -13101,11 +14491,12 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c if (video_layout_name) { conference->video_layout_name = switch_core_strdup(conference->pool, video_layout_name); } + if (video_layout_group) { conference->video_layout_group = switch_core_strdup(conference->pool, video_layout_group); } - if (!get_layout(conference)) { + if (!get_layout(conference, video_layout_name, video_layout_group)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid video-layout-name specified, using " CONFERENCE_MUX_DEFAULT_LAYOUT "\n"); video_layout_name = CONFERENCE_MUX_DEFAULT_LAYOUT; video_layout_group = video_layout_name + 6; @@ -13113,7 +14504,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c conference->video_layout_group = switch_core_strdup(conference->pool, video_layout_group); } - if (!get_layout(conference)) { + if (!get_layout(conference, video_layout_name, video_layout_group)) { conference->video_layout_name = conference->video_layout_group = video_layout_group = video_layout_name = NULL; conference->conf_video_mode = CONF_VIDEO_MODE_TRANSCODE; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid conference layout settings, falling back to transcode mode\n"); @@ -13124,7 +14515,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c } if (conference->conf_video_mode == CONF_VIDEO_MODE_TRANSCODE || conference->conf_video_mode == CONF_VIDEO_MODE_MUX) { - switch_set_flag(conference, CFLAG_TRANSCODE_VIDEO); + conference_set_flag(conference, CFLAG_TRANSCODE_VIDEO); } if (outcall_templ) { @@ -13167,18 +14558,18 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c conference->perpetual_sound = switch_core_strdup(conference->pool, perpetual_sound); } - conference->mflags = MFLAG_CAN_SPEAK | MFLAG_CAN_HEAR | MFLAG_CAN_BE_SEEN; + conference->mflags[MFLAG_CAN_SPEAK] = conference->mflags[MFLAG_CAN_HEAR] = conference->mflags[MFLAG_CAN_BE_SEEN] = 1; if (!zstr(moh_sound) && switch_is_moh(moh_sound)) { conference->moh_sound = switch_core_strdup(conference->pool, moh_sound); } if (member_flags) { - set_mflags(member_flags, &conference->mflags); + set_mflags(member_flags, conference->mflags); } if (conference_flags) { - set_cflags(conference_flags, &conference->flags); + set_cflags(conference_flags, conference->flags); } if (!zstr(sound_prefix)) { @@ -13343,22 +14734,60 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c conference->uuid_str = switch_core_strdup(conference->pool, uuid_str); /* Set enter sound and exit sound flags so that default is on */ - switch_set_flag(conference, CFLAG_ENTER_SOUND); - switch_set_flag(conference, CFLAG_EXIT_SOUND); + conference_set_flag(conference, CFLAG_ENTER_SOUND); + conference_set_flag(conference, CFLAG_EXIT_SOUND); /* Activate the conference mutex for exclusivity */ switch_mutex_init(&conference->mutex, SWITCH_MUTEX_NESTED, conference->pool); switch_mutex_init(&conference->flag_mutex, SWITCH_MUTEX_NESTED, conference->pool); switch_thread_rwlock_create(&conference->rwlock, conference->pool); switch_mutex_init(&conference->member_mutex, SWITCH_MUTEX_NESTED, conference->pool); + switch_mutex_init(&conference->canvas_mutex, SWITCH_MUTEX_NESTED, conference->pool); switch_mutex_lock(globals.hash_mutex); - switch_set_flag(conference, CFLAG_INHASH); + conference_set_flag(conference, CFLAG_INHASH); switch_core_hash_insert(globals.conference_hash, conference->name, conference); switch_mutex_unlock(globals.hash_mutex); - if (conference->conf_video_mode == CONF_VIDEO_MODE_MUX && !conference->video_muxing_thread) { - launch_conference_video_muxing_thread(conference); + conference->super_canvas_label_layers = video_super_canvas_label_layers; + conference->super_canvas_show_all_layers = video_super_canvas_show_all_layers; + + if (video_canvas_count < 1) video_canvas_count = 1; + + if (conference->conf_video_mode == CONF_VIDEO_MODE_MUX) { + video_layout_t *vlayout = get_layout(conference, conference->video_layout_name, conference->video_layout_group); + + if (!vlayout) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot find layout\n"); + conference->video_layout_name = conference->video_layout_group = NULL; + conference_clear_flag(conference, CFLAG_VIDEO_MUXING); + } else { + int j; + + for (j = 0; j < video_canvas_count; j++) { + mcu_canvas_t *canvas = NULL; + + switch_mutex_lock(conference->canvas_mutex); + init_canvas(conference, vlayout, &canvas); + attach_canvas(conference, canvas, 0); + launch_conference_video_muxing_thread(conference, canvas, 0); + switch_mutex_unlock(conference->canvas_mutex); + } + + if (conference->canvas_count > 1) { + video_layout_t *svlayout = get_layout(conference, NULL, CONFERENCE_MUX_DEFAULT_SUPER_LAYOUT); + mcu_canvas_t *canvas = NULL; + + if (svlayout) { + switch_mutex_lock(conference->canvas_mutex); + init_canvas(conference, svlayout, &canvas); + set_canvas_bgcolor(canvas, conference->video_super_canvas_bgcolor); + attach_canvas(conference, canvas, 1); + launch_conference_video_muxing_thread(conference, canvas, 1); + switch_mutex_unlock(conference->canvas_mutex); + } + } + } } end: @@ -13417,7 +14846,7 @@ static uint32_t kickall_matching_var(conference_obj_t *conference, const char *v for (member = conference->members; member; member = member->next) { switch_channel_t *channel = NULL; - if (switch_test_flag(member, MFLAG_NOCHANNEL)) { + if (member_test_flag(member, MFLAG_NOCHANNEL)) { continue; } @@ -13425,8 +14854,8 @@ static uint32_t kickall_matching_var(conference_obj_t *conference, const char *v vval = switch_channel_get_variable(channel, var); if (vval && !strcmp(vval, val)) { - switch_set_flag_locked(member, MFLAG_KICKED); - switch_clear_flag_locked(member, MFLAG_RUNNING); + member_set_flag_locked(member, MFLAG_KICKED); + member_clear_flag_locked(member, MFLAG_RUNNING); switch_core_session_kill_channel(member->session, SWITCH_SIG_BREAK); r++; } @@ -13460,7 +14889,7 @@ static void call_setup_event_handler(switch_event_t *event) switch_event_t *var_event; switch_event_header_t *hp; - if (switch_test_flag(conference, CFLAG_RFC4579)) { + if (conference_test_flag(conference, CFLAG_RFC4579)) { char *key = switch_mprintf("conf_%s_%s_%s_%s", conference->name, conference->domain, ext, ext_domain); char *expanded = NULL, *ostr = dial_str;; @@ -13550,7 +14979,7 @@ static void conf_data_event_handler(switch_event_t *event) char *body = NULL; if (!zstr(name) && (conference = conference_find(name, domain))) { - if (switch_test_flag(conference, CFLAG_RFC4579)) { + if (conference_test_flag(conference, CFLAG_RFC4579)) { switch_event_dup(&revent, event); revent->event_id = SWITCH_EVENT_CONFERENCE_DATA; revent->flags |= EF_UNIQ_HEADERS; @@ -13703,7 +15132,7 @@ static switch_status_t dmachine_dispatcher(switch_ivr_dmachine_match_t *match) binding->action.expanded_data = NULL; } - switch_set_flag_locked(binding->member, MFLAG_FLUSH_BUFFER); + member_set_flag_locked(binding->member, MFLAG_FLUSH_BUFFER); return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 0f6c8f606d..1aad6e73cd 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -1450,6 +1450,18 @@ SWITCH_STANDARD_APP(sched_cancel_function) static void base_set (switch_core_session_t *session, const char *data, switch_stack_t stack) { char *var, *val = NULL; + const char *what = "SET"; + + switch (stack) { + case SWITCH_STACK_PUSH: + what = "PUSH"; + break; + case SWITCH_STACK_UNSHIFT: + what = "UNSHIFT"; + break; + default: + break; + } if (zstr(data)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "No variable name specified.\n"); @@ -1474,8 +1486,9 @@ static void base_set (switch_core_session_t *session, const char *data, switch_s expanded = switch_channel_expand_variables(channel, val); } - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s SET [%s]=[%s]\n", switch_channel_get_name(channel), var, - expanded ? expanded : "UNDEF"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s %s [%s]=[%s]\n", + what, switch_channel_get_name(channel), var, expanded ? expanded : "UNDEF"); + switch_channel_add_variable_var_check(channel, var, expanded, SWITCH_FALSE, stack); if (expanded && expanded != val) { diff --git a/src/mod/endpoints/mod_verto/mod_verto.c b/src/mod/endpoints/mod_verto/mod_verto.c index 075b9e26d2..15d6bd473a 100644 --- a/src/mod/endpoints/mod_verto/mod_verto.c +++ b/src/mod/endpoints/mod_verto/mod_verto.c @@ -3259,7 +3259,7 @@ static switch_bool_t verto__info_func(const char *method, cJSON *params, jsock_t static switch_bool_t verto__invite_func(const char *method, cJSON *params, jsock_t *jsock, cJSON **response) { - cJSON *obj = cJSON_CreateObject(), *screenShare = NULL, *dedEnc = NULL, *mirrorInput; + cJSON *obj = cJSON_CreateObject(), *screenShare = NULL, *dedEnc = NULL, *mirrorInput, *json_ptr = NULL; switch_core_session_t *session = NULL; switch_channel_t *channel; switch_event_t *var_event; @@ -3351,6 +3351,22 @@ static switch_bool_t verto__invite_func(const char *method, cJSON *params, jsock } } + if ((json_ptr = cJSON_GetObjectItem(dialog, "userVariables"))) { + cJSON * i; + + for(i = json_ptr->child; i; i = i->next) { + char *varname = switch_core_session_sprintf(session, "verto_dvar_%s", i->string); + + if (i->type == cJSON_True) { + switch_channel_set_variable(channel, varname, "true"); + } else if (i->type == cJSON_False) { + switch_channel_set_variable(channel, varname, "false"); + } else if (!zstr(i->string) && !zstr(i->valuestring)) { + switch_channel_set_variable(channel, varname, i->valuestring); + } + } + } + switch_snprintf(name, sizeof(name), "verto.rtc/%s", destination_number); switch_channel_set_name(channel, name); switch_channel_set_variable(channel, "jsock_uuid_str", jsock->uuid_str); diff --git a/src/switch_core_media.c b/src/switch_core_media.c index d9e6865b71..f015575533 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -4907,7 +4907,6 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi switch_core_session_request_video_refresh(session); while (switch_channel_up_nosig(channel)) { - int do_sleep = 0; int send_blank = 0; if (!switch_channel_test_flag(channel, CF_VIDEO)) { @@ -4916,15 +4915,11 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi continue; } - if (!smh->video_write_fh && !smh->video_read_fh && switch_core_session_media_flow(session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY) { - do_sleep = 1; - } - if (!switch_channel_test_flag(channel, CF_VIDEO_DECODED_READ) && (++xloops > 20 || switch_channel_test_flag(channel, CF_VIDEO_PASSIVE))) { switch_channel_set_flag(channel, CF_VIDEO_READY); } - if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE) || do_sleep) { + if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Video thread paused. Echo is %s\n", switch_channel_get_name(session->channel), switch_channel_test_flag(channel, CF_VIDEO_ECHO) ? "on" : "off"); switch_thread_cond_wait(mh->cond, mh->cond_mutex); @@ -4933,7 +4928,7 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi switch_core_session_request_video_refresh(session); } - if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE) || do_sleep) { + if (switch_channel_test_flag(channel, CF_VIDEO_PASSIVE)) { continue; } @@ -4964,27 +4959,25 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi if (v_engine->smode == SWITCH_MEDIA_FLOW_SENDONLY) { switch_channel_set_flag(channel, CF_VIDEO_READY); - } else { - - //if (!smh->video_write_fh || !switch_channel_test_flag(channel, CF_VIDEO_READY)) { - status = switch_core_session_read_video_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); - - if (!SWITCH_READ_ACCEPTABLE(status)) { - switch_cond_next(); - continue; - } - - //if (switch_test_flag(read_frame, SFF_CNG)) { - // continue; - //} - //} - - //if (vloops < 300 && (vloops % 100) == 0) { - // switch_core_media_gen_key_frame(session); - //switch_core_session_request_video_refresh(session); - //} - } + + //if (!smh->video_write_fh || !switch_channel_test_flag(channel, CF_VIDEO_READY)) { + status = switch_core_session_read_video_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); + + if (!SWITCH_READ_ACCEPTABLE(status)) { + switch_cond_next(); + continue; + } + + //if (switch_test_flag(read_frame, SFF_CNG)) { + // continue; + //} + //} + + //if (vloops < 300 && (vloops % 100) == 0) { + // switch_core_media_gen_key_frame(session); + //switch_core_session_request_video_refresh(session); + //} vloops++; @@ -4998,6 +4991,10 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi switch_core_media_gen_key_frame(session); } + if (v_engine->smode == SWITCH_MEDIA_FLOW_SENDONLY) { + send_blank = 1; + } + if (switch_channel_test_flag(channel, CF_VIDEO_READY)) { switch_mutex_lock(mh->file_mutex); if (smh->video_write_fh && switch_channel_ready(session->channel) && switch_test_flag(smh->video_write_fh, SWITCH_FILE_OPEN)) { @@ -5008,8 +5005,10 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi } else if (wstatus != SWITCH_STATUS_BREAK && wstatus != SWITCH_STATUS_IGNORE) { smh->video_write_fh = NULL; } + send_blank = 0; } else if (smh->video_read_fh && switch_test_flag(smh->video_read_fh, SWITCH_FILE_OPEN) && read_frame->img) { switch_core_file_write_video(smh->video_read_fh, read_frame); + send_blank = 0; } switch_mutex_unlock(mh->file_mutex); } else if (switch_channel_test_flag(channel, CF_VIDEO_DECODED_READ)) {