mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-27 20:59:50 +00:00
FS-10379: [mod_conference] Set canvas size based on a variable #resolve
This commit is contained in:
parent
d16a0677a9
commit
73adcdb3d8
@ -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", "<layout name>|group <group name> [<canvas id>]"},
|
{"vid-layout", (void_fn_t) & conference_api_sub_vid_layout, CONF_API_SUB_ARGS_SPLIT, "vid-layout", "<layout name>|group <group name> [<canvas id>]"},
|
||||||
{"vid-write-png", (void_fn_t) & conference_api_sub_write_png, CONF_API_SUB_ARGS_SPLIT, "vid-write-png", "<path>"},
|
{"vid-write-png", (void_fn_t) & conference_api_sub_write_png, CONF_API_SUB_ARGS_SPLIT, "vid-write-png", "<path>"},
|
||||||
{"vid-fps", (void_fn_t) & conference_api_sub_vid_fps, CONF_API_SUB_ARGS_SPLIT, "vid-fps", "<fps>"},
|
{"vid-fps", (void_fn_t) & conference_api_sub_vid_fps, CONF_API_SUB_ARGS_SPLIT, "vid-fps", "<fps>"},
|
||||||
|
{"vid-res", (void_fn_t) & conference_api_sub_vid_res, CONF_API_SUB_ARGS_SPLIT, "vid-res", "<WxH>"},
|
||||||
{"vid-fgimg", (void_fn_t) & conference_api_sub_canvas_fgimg, CONF_API_SUB_ARGS_SPLIT, "vid-fgimg", "<file> | clear [<canvas-id>]"},
|
{"vid-fgimg", (void_fn_t) & conference_api_sub_canvas_fgimg, CONF_API_SUB_ARGS_SPLIT, "vid-fgimg", "<file> | clear [<canvas-id>]"},
|
||||||
{"vid-bgimg", (void_fn_t) & conference_api_sub_canvas_bgimg, CONF_API_SUB_ARGS_SPLIT, "vid-bgimg", "<file> | clear [<canvas-id>]"},
|
{"vid-bgimg", (void_fn_t) & conference_api_sub_canvas_bgimg, CONF_API_SUB_ARGS_SPLIT, "vid-bgimg", "<file> | clear [<canvas-id>]"},
|
||||||
{"vid-bandwidth", (void_fn_t) & conference_api_sub_vid_bandwidth, CONF_API_SUB_ARGS_SPLIT, "vid-bandwidth", "<BW>"},
|
{"vid-bandwidth", (void_fn_t) & conference_api_sub_vid_bandwidth, CONF_API_SUB_ARGS_SPLIT, "vid-bandwidth", "<BW>"},
|
||||||
@ -1510,6 +1511,64 @@ switch_status_t conference_api_sub_canvas_fgimg(conference_obj_t *conference, sw
|
|||||||
return SWITCH_STATUS_SUCCESS;
|
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)
|
switch_status_t conference_api_sub_vid_fps(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
|
||||||
{
|
{
|
||||||
float fps = 0;
|
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]) {
|
||||||
|
|
||||||
if (argv[3]) {
|
id = atoi(argv[3]);
|
||||||
id = atoi(argv[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id < 1 || id > MAX_CANVASES+1) {
|
if (id < 1 || id > MAX_CANVASES+1) {
|
||||||
id = -1;
|
id = -1;
|
||||||
@ -3231,6 +3288,7 @@ switch_status_t conference_api_sub_record(conference_obj_t *conference, switch_s
|
|||||||
id = 1;
|
id = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
switch_mutex_lock(conference->flag_mutex);
|
switch_mutex_lock(conference->flag_mutex);
|
||||||
for (rec = conference->rec_node_head; rec; rec = rec->next) {
|
for (rec = conference->rec_node_head; rec; rec = rec->next) {
|
||||||
char *path_a, *path_b;
|
char *path_a, *path_b;
|
||||||
|
@ -2874,6 +2874,24 @@ static void personal_attach(mcu_layer_t *layer, conference_member_t *member)
|
|||||||
layer->member_id = member->id;
|
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)
|
void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thread, void *obj)
|
||||||
{
|
{
|
||||||
|
@ -2671,7 +2671,7 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
|||||||
switch_uuid_t uuid;
|
switch_uuid_t uuid;
|
||||||
switch_codec_implementation_t read_impl = { 0 };
|
switch_codec_implementation_t read_impl = { 0 };
|
||||||
switch_channel_t *channel = NULL;
|
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;
|
uint32_t force_rate_i = 0, force_interval_i = 0, force_channels_i = 0, video_auto_floor_msec = 0;
|
||||||
switch_event_t *event;
|
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);
|
switch_mutex_lock(conference_globals.hash_mutex);
|
||||||
|
@ -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);
|
void conference_video_release_layer(mcu_layer_t **layer);
|
||||||
mcu_canvas_t *conference_video_get_canvas_locked(conference_member_t *member);
|
mcu_canvas_t *conference_video_get_canvas_locked(conference_member_t *member);
|
||||||
void conference_video_release_canvas(mcu_canvas_t **canvasP);
|
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);
|
int conference_member_setup_media(conference_member_t *member, conference_obj_t *conference);
|
||||||
|
|
||||||
al_handle_t *conference_al_create(switch_memory_pool_t *pool);
|
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_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_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_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_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_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);
|
switch_status_t conference_api_sub_write_png(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user