diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index 8bcd9a42e0..071a4da715 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -43,6 +43,7 @@ api_command_t conference_api_sub_commands[] = { + {"canvas-auto-clear", (void_fn_t) & conference_api_sub_canvas_auto_clear, CONF_API_SUB_ARGS_SPLIT, "canvas-auto-clear", " "}, {"count", (void_fn_t) & conference_api_sub_count, CONF_API_SUB_ARGS_SPLIT, "count", ""}, {"list", (void_fn_t) & conference_api_sub_list, CONF_API_SUB_ARGS_SPLIT, "list", "[delim ]|[count]"}, {"xml_list", (void_fn_t) & conference_api_sub_xml_list, CONF_API_SUB_ARGS_SPLIT, "xml_list", ""}, @@ -534,6 +535,48 @@ switch_status_t conference_api_sub_conference_video_vmute_snap(conference_member return SWITCH_STATUS_SUCCESS; } +switch_status_t conference_api_sub_canvas_auto_clear(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) +{ + int canvas_id_start = 0; + int canvas_id_end = 0; + int i = 0; + + if (argc < 3) { + stream->write_function(stream, "+OK"); + + for (i = 0; i < conference->canvas_count; i++) { + stream->write_function(stream, " canvas %d auto_clear=%s", i + 1, conference->canvases[i]->disable_auto_clear ? "false" : "true"); + } + + stream->write_function(stream, "\n"); + return SWITCH_STATUS_SUCCESS; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s\n", argv[1]); + + canvas_id_start = atoi(argv[2]); + + if (canvas_id_start == 0) { + canvas_id_end = conference->canvas_count - 1; + } else { + canvas_id_start--; + canvas_id_end = canvas_id_start; + } + + stream->write_function(stream, "+OK"); + switch_mutex_lock(conference->canvas_mutex); + + for (i = canvas_id_start; i<= canvas_id_end; i++) { + conference->canvases[i]->disable_auto_clear = !switch_true(argv[3]); + stream->write_function(stream, " canvas %d auto_clear=%s", i + 1, argv[3]); + } + + switch_mutex_unlock(conference->canvas_mutex); + stream->write_function(stream, "\n"); + + return SWITCH_STATUS_SUCCESS; +} + switch_status_t conference_api_sub_vmute(conference_member_t *member, switch_stream_handle_t *stream, void *data) { switch_event_t *event; diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c index aae9d393e6..022596a97c 100644 --- a/src/mod/applications/mod_conference/conference_video.c +++ b/src/mod/applications/mod_conference/conference_video.c @@ -431,7 +431,10 @@ void conference_video_reset_layer(mcu_layer_t *layer) switch_assert(layer->img); } - conference_video_clear_layer(layer); + if (layer->canvas && !layer->canvas->disable_auto_clear) { + conference_video_clear_layer(layer); + } + switch_img_free(&layer->cur_img); switch_img_free(&layer->overlay_img); @@ -1084,7 +1087,7 @@ void conference_video_detach_video_layer(conference_member_t *member) conference_member_update_status_field(member); } - if (canvas->bgimg) { + if (canvas->bgimg && !canvas->disable_auto_clear) { conference_video_set_canvas_bgimg(canvas, NULL); } @@ -1521,7 +1524,10 @@ switch_status_t conference_video_attach_video_layer(conference_member_t *member, conference_api_sub_position(member, NULL, layer->geometry.audio_position); } - switch_img_fill(canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &canvas->letterbox_bgcolor); + if (!canvas->disable_auto_clear) { + switch_img_fill(canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &canvas->letterbox_bgcolor); + } + conference_video_reset_video_bitrate_counters(member); conference_video_clear_managed_kps(member); diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index 16d959061d..76b2b97b72 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -570,6 +570,7 @@ typedef struct mcu_canvas_s { int overlay_video_file; codec_set_t *write_codecs[MAX_MUX_CODECS]; int write_codecs_count; + switch_bool_t disable_auto_clear; } mcu_canvas_t; /* Record Node */ @@ -1173,6 +1174,7 @@ void conference_event_chat_channel_handler(const char *event_channel, cJSON *jso void conference_member_itterator(conference_obj_t *conference, switch_stream_handle_t *stream, uint8_t non_mod, conference_api_member_cmd_t pfncallback, void *data); int conference_video_flush_queue(switch_queue_t *q, int min); +switch_status_t conference_api_sub_canvas_auto_clear(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_mute(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_tmute(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_unmute(conference_member_t *member, switch_stream_handle_t *stream, void *data);