diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index fa0f353270..24f4d09b95 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -112,6 +112,7 @@ api_command_t conference_api_sub_commands[] = { {"vid-layout", (void_fn_t) & conference_api_sub_vid_layout, CONF_API_SUB_ARGS_SPLIT, "vid-layout", "|group []"}, {"vid-write-png", (void_fn_t) & conference_api_sub_write_png, CONF_API_SUB_ARGS_SPLIT, "vid-write-png", ""}, {"vid-fps", (void_fn_t) & conference_api_sub_vid_fps, CONF_API_SUB_ARGS_SPLIT, "vid-fps", ""}, + {"vid-res", (void_fn_t) & conference_api_sub_vid_res, CONF_API_SUB_ARGS_SPLIT, "vid-res", ""}, {"vid-fgimg", (void_fn_t) & conference_api_sub_canvas_fgimg, CONF_API_SUB_ARGS_SPLIT, "vid-fgimg", " | clear []"}, {"vid-bgimg", (void_fn_t) & conference_api_sub_canvas_bgimg, CONF_API_SUB_ARGS_SPLIT, "vid-bgimg", " | clear []"}, {"vid-bandwidth", (void_fn_t) & conference_api_sub_vid_bandwidth, CONF_API_SUB_ARGS_SPLIT, "vid-bandwidth", ""}, @@ -1510,6 +1511,64 @@ switch_status_t conference_api_sub_canvas_fgimg(conference_obj_t *conference, sw return SWITCH_STATUS_SUCCESS; } +switch_status_t conference_api_sub_vid_res(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) +{ + int canvas_w = 0, canvas_h = 0, id = 0; + char *video_canvas_size = argv[2]; + + + if (!conference->canvases[0]) { + stream->write_function(stream, "Conference is not in mixing mode\n"); + return SWITCH_STATUS_SUCCESS; + } + + if (zstr(video_canvas_size)) { + stream->write_function(stream, "Invalid size\n"); + return SWITCH_STATUS_SUCCESS; + } else { + char *p; + + if ((canvas_w = atoi(video_canvas_size))) { + if ((p = strchr(video_canvas_size, 'x'))) { + p++; + if (*p) { + canvas_h = atoi(p); + } + } + } + } + + if (canvas_w < 320 || canvas_h < 180) { + stream->write_function(stream, "Invalid size\n"); + return SWITCH_STATUS_SUCCESS; + } + + + if (argv[3]) { + + id = atoi(argv[3]); + + if (id < 1 || id > MAX_CANVASES+1) { + id = -1; + } + + if (id < 1) { + stream->write_function(stream, "-ERR Invalid canvas\n"); + } + + } + + if (id == 0 && conference->canvases[0]) id = 1; + + if (id > conference->canvas_count + 1) { + id = 1; + } + + conference_video_change_res(conference, canvas_w, canvas_h, id - 1); + + return SWITCH_STATUS_SUCCESS; +} + switch_status_t conference_api_sub_vid_fps(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv) { float fps = 0; @@ -3211,9 +3270,7 @@ switch_status_t conference_api_sub_record(conference_obj_t *conference, switch_s if (argv[3]) { - if (argv[3]) { - id = atoi(argv[3]); - } + id = atoi(argv[3]); if (id < 1 || id > MAX_CANVASES+1) { id = -1; @@ -3231,6 +3288,7 @@ switch_status_t conference_api_sub_record(conference_obj_t *conference, switch_s id = 1; } + switch_mutex_lock(conference->flag_mutex); for (rec = conference->rec_node_head; rec; rec = rec->next) { char *path_a, *path_b; diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c index 128cba5055..76a9eb2448 100644 --- a/src/mod/applications/mod_conference/conference_video.c +++ b/src/mod/applications/mod_conference/conference_video.c @@ -2874,6 +2874,24 @@ static void personal_attach(mcu_layer_t *layer, conference_member_t *member) layer->member_id = member->id; } +switch_status_t conference_video_change_res(conference_obj_t *conference, int w, int h, int id) +{ + mcu_canvas_t *canvas = NULL; + + switch_mutex_lock(conference->canvas_mutex); + canvas = conference->canvases[id]; + switch_mutex_lock(canvas->mutex); + canvas->width = w; + canvas->height = h; + switch_img_free(&canvas->img); + canvas->img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, canvas->width, canvas->height, 0); + conference_video_init_canvas_layers(conference, canvas, canvas->vlayout); + switch_mutex_unlock(canvas->mutex); + switch_mutex_unlock(conference->canvas_mutex); + + return SWITCH_STATUS_SUCCESS; +} + void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thread, void *obj) { diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index cf55e67ff7..8a3c59a2bd 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -2671,7 +2671,7 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co switch_uuid_t uuid; switch_codec_implementation_t read_impl = { 0 }; switch_channel_t *channel = NULL; - const char *force_rate = NULL, *force_interval = NULL, *force_channels = NULL, *presence_id = NULL; + const char *force_rate = NULL, *force_interval = NULL, *force_channels = NULL, *presence_id = NULL, *force_canvas_size = NULL; uint32_t force_rate_i = 0, force_interval_i = 0, force_channels_i = 0, video_auto_floor_msec = 0; switch_event_t *event; @@ -2730,6 +2730,11 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co } } } + + + if ((force_canvas_size = switch_channel_get_variable(channel, "conference_force_canvas_size"))) { + video_canvas_size = (char *)force_canvas_size; + } } switch_mutex_lock(conference_globals.hash_mutex); diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index f189c235ed..e5eefd451e 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -1014,6 +1014,7 @@ mcu_layer_t *conference_video_get_layer_locked(conference_member_t *member); void conference_video_release_layer(mcu_layer_t **layer); mcu_canvas_t *conference_video_get_canvas_locked(conference_member_t *member); void conference_video_release_canvas(mcu_canvas_t **canvasP); +switch_status_t conference_video_change_res(conference_obj_t *conference, int w, int h, int id); int conference_member_setup_media(conference_member_t *member, conference_obj_t *conference); al_handle_t *conference_al_create(switch_memory_pool_t *pool); @@ -1209,6 +1210,7 @@ switch_status_t conference_api_sub_vid_mute_img(conference_member_t *member, swi switch_status_t conference_api_sub_vid_codec_group(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_vid_logo_img(conference_member_t *member, switch_stream_handle_t *stream, void *data); switch_status_t conference_api_sub_vid_fps(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); +switch_status_t conference_api_sub_vid_res(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_canvas_fgimg(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_canvas_bgimg(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv); switch_status_t conference_api_sub_write_png(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);