diff --git a/html5/verto/video_demo/index.html b/html5/verto/video_demo/index.html
index fc04d7bd93..12dcd026c1 100644
--- a/html5/verto/video_demo/index.html
+++ b/html5/verto/video_demo/index.html
@@ -115,8 +115,7 @@
-
-
+
@@ -418,6 +417,8 @@ if ($('#devices').is(':visible')) {
+
+
diff --git a/html5/verto/video_demo/verto.js b/html5/verto/video_demo/verto.js
index bccf167eb6..b08651c617 100644
--- a/html5/verto/video_demo/verto.js
+++ b/html5/verto/video_demo/verto.js
@@ -521,17 +521,6 @@ var is_full = false;
var usrto;
function noop() { return; }
-$("#nofullbtn").click(function() {
-
- if (document.webkitFullscreenEnabled) {
- document.webkitExitFullscreen();
- } else if (document.mozFullScreenEnabled) {
- document.mozExitFullScreen();
- }
-
-
-});
-
function on_full(which)
{
is_full = which;
@@ -558,7 +547,18 @@ $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange MSFu
$("#fullbtn").click(function() {
- full_screen("fs");
+ if (!is_full) {
+ full_screen("fs");
+ $("#fullbtn").text("Exit Full Screen");
+ } else {
+ $("#fullbtn").text("Enter Full Screen");
+ if (document.webkitFullscreenEnabled) {
+ document.webkitExitFullscreen();
+ } else if (document.mozFullScreenEnabled) {
+ document.mozExitFullScreen();
+ }
+
+ }
// $("#mod1").css("position", "absolute").css("z-index", "2");
@@ -597,7 +597,9 @@ function docall() {
useVideo: check_vid(),
useStereo: $("#use_stereo").is(':checked'),
useCamera: $("#usecamera").find(":selected").val(),
- useMic: $("#usemic").find(":selected").val()
+ useMic: $("#usemic").find(":selected").val(),
+ dedEnc: $("#use_dedenc").is(':checked'),
+ mirrorInput: $("#mirror_input").is(':checked')
});
}
@@ -630,7 +632,9 @@ function doshare(on) {
incomingBandwidth: incomingBandwidth,
useCamera: sharedev,
useVideo: true,
- screenShare: true
+ screenShare: true,
+ dedEnc: $("#use_dedenc").is(':checked'),
+ mirrorInput: $("#mirror_input").is(':checked')
});
return;
@@ -650,7 +654,9 @@ function doshare(on) {
incomingBandwidth: incomingBandwidth,
videoParams: screen_constraints.video.mandatory,
useVideo: true,
- screenShare: true
+ screenShare: true,
+ dedEnc: $("#use_dedenc").is(':checked'),
+ mirrorInput: $("#mirror_input").is(':checked')
});
});
@@ -805,6 +811,40 @@ function init() {
});
});
+
+ tmp = $.cookie("verto_demo_dedenc_checked") || "false";
+ $.cookie("verto_demo_dedenc_checked", tmp, {
+ expires: 365
+ });
+
+ $("#use_dedenc").prop("checked", tmp === "true").change(function(e) {
+ tmp = $("#use_dedenc").is(':checked');
+
+ if (!tmp && $("#mirror_input").is(':checked')) {
+ $("#mirror_input").click();
+ }
+
+ $.cookie("verto_demo_dedenc_checked", tmp ? "true" : "false", {
+ expires: 365
+ });
+ });
+
+
+ tmp = $.cookie("verto_demo_mirror_input_checked") || "false";
+ $.cookie("verto_demo_mirror_input_checked", tmp, {
+ expires: 365
+ });
+
+ $("#mirror_input").prop("checked", tmp === "true").change(function(e) {
+ tmp = $("#mirror_input").is(':checked');
+ if (tmp && !$("#use_dedenc").is(':checked')) {
+ $("#use_dedenc").click();
+ }
+ $.cookie("verto_demo_mirror_input_checked", tmp ? "true" : "false", {
+ expires: 365
+ });
+ });
+
//
outgoingBandwidth = $.cookie("verto_demo_outgoingBandwidth") || "default";
$.cookie("verto_demo_outgoingBandwidth", outgoingBandwidth, {
diff --git a/src/include/switch_types.h b/src/include/switch_types.h
index adabb8464c..e82fbe2c2d 100644
--- a/src/include/switch_types.h
+++ b/src/include/switch_types.h
@@ -1471,6 +1471,7 @@ typedef enum {
CF_VIDEO_DEBUG_WRITE,
CF_VIDEO_ONLY,
CF_VIDEO_READY,
+ CF_VIDEO_MIRROR_INPUT,
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
/* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */
CF_FLAG_MAX
diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c
index 0704076dff..d4a01ae368 100644
--- a/src/mod/applications/mod_conference/mod_conference.c
+++ b/src/mod/applications/mod_conference/mod_conference.c
@@ -3771,6 +3771,10 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
member->video_reservation_id = switch_core_strdup(member->pool, var);
}
+ if ((var = switch_channel_get_variable(channel, "video_use_dedicated_encoder")) && switch_true(var)) {
+ switch_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");
diff --git a/src/mod/endpoints/mod_verto/mod_verto.c b/src/mod/endpoints/mod_verto/mod_verto.c
index 813fa58129..51174899b9 100644
--- a/src/mod/endpoints/mod_verto/mod_verto.c
+++ b/src/mod/endpoints/mod_verto/mod_verto.c
@@ -3204,7 +3204,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;
+ cJSON *obj = cJSON_CreateObject(), *screenShare = NULL, *dedEnc = NULL, *mirrorInput;
switch_core_session_t *session = NULL;
switch_channel_t *channel;
switch_event_t *var_event;
@@ -3274,6 +3274,15 @@ static switch_bool_t verto__invite_func(const char *method, cJSON *params, jsock
switch_channel_set_flag(channel, CF_VIDEO_ONLY);
}
+ if ((dedEnc = cJSON_GetObjectItem(dialog, "dedEnc")) && dedEnc->type == cJSON_True) {
+ switch_channel_set_variable(channel, "video_use_dedicated_encoder", "true");
+ }
+
+ if ((mirrorInput = cJSON_GetObjectItem(dialog, "mirrorInput")) && mirrorInput->type == cJSON_True) {
+ switch_channel_set_variable(channel, "video_mirror_input", "true");
+ switch_channel_set_flag(channel, CF_VIDEO_MIRROR_INPUT);
+ }
+
if ((bandwidth = cJSON_GetObjectCstr(dialog, "outgoingBandwidth"))) {
if (strcasecmp(bandwidth, "default")) {
switch_channel_set_variable(channel, "rtp_video_max_bandwidth_in", bandwidth);
diff --git a/src/switch_core_media.c b/src/switch_core_media.c
index 92b502d959..2464127f2b 100644
--- a/src/switch_core_media.c
+++ b/src/switch_core_media.c
@@ -10029,7 +10029,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_video_frame(switch_cor
switch_codec_t *codec = switch_core_session_get_video_write_codec(session);
switch_timer_t *timer;
switch_media_handle_t *smh;
- switch_image_t *img = frame->img;
+ switch_image_t *dup_img = NULL, *img = frame->img;
switch_status_t encode_status;
switch_frame_t write_frame = {0};
//switch_rtp_engine_t *v_engine;
@@ -10085,6 +10085,14 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_video_frame(switch_cor
switch_goto_status(vstatus, done);
}
+ /* When desired, scale video to match the input signal (if output is bigger) */
+ if (switch_channel_test_flag(session->channel, CF_VIDEO_READY) && smh->vid_params.width &&
+ switch_channel_test_flag(session->channel, CF_VIDEO_MIRROR_INPUT) &&
+ (smh->vid_params.width * smh->vid_params.height) < (img->d_w * img->d_h)) {
+ switch_img_scale(img, &dup_img, smh->vid_params.width, smh->vid_params.height);
+ img = dup_img;
+ }
+
write_frame = *frame;
frame = &write_frame;
frame->img = img;
@@ -10131,6 +10139,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_video_frame(switch_cor
switch_mutex_unlock(smh->write_mutex[SWITCH_MEDIA_TYPE_VIDEO]);
}
+ switch_img_free(&dup_img);
+
return status;
}