]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10379: [mod_conference] Set canvas size based on a variable #resolve
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 7 Jun 2017 23:07:00 +0000 (18:07 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 7 Jun 2017 23:07:00 +0000 (18:07 -0500)
src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/conference_video.c
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_conference/mod_conference.h

index fa0f353270d1db295e721be30c51a0e6abef7dc0..24f4d09b9514fb708174d331eb343fca3859d441 100644 (file)
@@ -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-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-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-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>"},
@@ -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;
index 128cba5055ce42a56150870f3a05ad0401b111ea..76a9eb2448e01a89e697e15c436594f26c8369d9 100644 (file)
@@ -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)
 {
index cf55e67ff744920c72464f6250959add33a0c4d6..8a3c59a2bdf924ca903388c2c07187129495b261 100644 (file)
@@ -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);
index f189c235ed1cbe61bec6181d258fc854b1f62677..e5eefd451ee641bc68c78d4455802989a3ce606d 100644 (file)
@@ -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);