]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: fix placement of overlay banner on letterbox callers change config option...
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 23 Apr 2015 19:50:40 +0000 (14:50 -0500)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:47:25 +0000 (12:47 -0500)
src/mod/applications/mod_conference/mod_conference.c
src/switch_core_video.c

index 8c2c9f6dfd83c44dfbbcb1fd9125424adc2d88ba..fa17ba8a1db7df05eb118106b9ba4b13452253d8 100644 (file)
@@ -439,6 +439,7 @@ typedef struct mcu_canvas_s {
        int send_keyframe;
        int play_file;
        switch_rgb_color_t bgcolor;
+       switch_rgb_color_t letterbox_bgcolor;
        switch_mutex_t *mutex;
        switch_timer_t timer;
        switch_memory_pool_t *pool;
@@ -497,7 +498,7 @@ typedef struct conference_obj {
        char *video_layout_name;
        char *video_layout_group;
        char *video_canvas_bgcolor;
-       char *video_layout_bgcolor;
+       char *video_letterbox_bgcolor;
        char *no_video_avatar;
        conf_video_mode_t conf_video_mode;
        int members_with_video;
@@ -1013,6 +1014,7 @@ static void clear_layer(mcu_canvas_t *canvas, mcu_layer_t *layer)
 {
        switch_img_fill(canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &canvas->bgcolor);
        layer->banner_patched = 0;
+       layer->refresh = 1;
 }
 
 static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer)
@@ -1050,9 +1052,7 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, sw
        switch_assert(IMG && img);
 
        if (layer->refresh) {
-               switch_rgb_color_t color;
-               switch_color_set_rgb(&color, conference->video_layout_bgcolor);
-               switch_img_fill(conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &color);
+               switch_img_fill(conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &conference->canvas->letterbox_bgcolor);
                layer->refresh = 0;
        }
 
@@ -1091,10 +1091,13 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, sw
                }
                
                if (layer->banner_img && !layer->banner_patched) {
+                       switch_img_fill(conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &conference->canvas->letterbox_bgcolor);
                        switch_img_patch(IMG, layer->banner_img, layer->x_pos, layer->y_pos + (layer->screen_h - layer->banner_img->d_h));
+
                        if (!freeze) {
                                switch_img_set_rect(layer->img, 0, 0, layer->img->d_w, layer->img->d_h - layer->banner_img->d_h);
                        }
+
                        layer->banner_patched = 1;
                }
 
@@ -1119,12 +1122,12 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer, sw
 
                        switch_img_fit(&layer->logo_img, ew, eh);
                        switch_img_find_position(layer->logo_pos, ew, eh, layer->logo_img->d_w, layer->logo_img->d_h, &ex, &ey);
-                       switch_img_patch(IMG, layer->logo_img, x_pos + ex, y_pos + ey);
+                       switch_img_patch(IMG, layer->logo_img, layer->x_pos + ex, layer->y_pos + ey);
                        if (layer->logo_text_img) {
                                int tx = 0, ty = 0;
                                switch_img_find_position(POS_LEFT_BOT, 
                                                                                 layer->logo_img->d_w, layer->logo_img->d_h, layer->logo_text_img->d_w, layer->logo_text_img->d_h, &tx, &ty);
-                               switch_img_patch(IMG, layer->logo_text_img, x_pos + ex + tx, y_pos + ey + ty);
+                               switch_img_patch(IMG, layer->logo_text_img, layer->x_pos + ex + tx, layer->y_pos + ey + ty);
                        }
 
                }
@@ -1143,6 +1146,11 @@ static void set_canvas_bgcolor(mcu_canvas_t *canvas, char *color)
        reset_image(canvas->img, &canvas->bgcolor);
 }
 
+static void set_canvas_letterbox_bgcolor(mcu_canvas_t *canvas, char *color)
+{
+       switch_color_set_rgb(&canvas->letterbox_bgcolor, color);
+}
+
 static void check_used_layers(conference_obj_t *conference)
 {
        int i;
@@ -1226,13 +1234,11 @@ static void layer_set_logo(conference_member_t *member, mcu_layer_t *layer, cons
        }
        
        if (zstr(path) || !strcasecmp(path, "clear")) {
-               switch_rgb_color_t color;
-
                switch_img_free(&layer->banner_img);
                layer->banner_patched = 0;
                
-               switch_color_set_rgb(&color, member->conference->video_layout_bgcolor);
-               switch_img_fill(member->conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &color);
+               switch_img_fill(member->conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, 
+                                               &member->conference->canvas->letterbox_bgcolor);
 
                goto end;
        }
@@ -1310,13 +1316,11 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
        }
        
        if (zstr(text) || !strcasecmp(text, "clear")) {
-               switch_rgb_color_t color;
-
                switch_img_free(&layer->banner_img);
                layer->banner_patched = 0;
                
-               switch_color_set_rgb(&color, member->conference->video_layout_bgcolor);
-               switch_img_fill(member->conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &color);
+               switch_img_fill(member->conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, 
+                                               &member->conference->canvas->letterbox_bgcolor);
 
                goto end;
        }
@@ -1384,7 +1388,6 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx)
        switch_channel_t *channel = NULL;
        switch_status_t status = SWITCH_STATUS_SUCCESS;
        const char *var = NULL;
-       switch_rgb_color_t color;
        
        if (!member->session) abort();
 
@@ -1460,9 +1463,8 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx)
        }
 
 
-       switch_color_set_rgb(&color, member->conference->video_layout_bgcolor);
-       switch_img_fill(member->conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &color);
-
+       switch_img_fill(member->conference->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, 
+                                       &member->conference->canvas->letterbox_bgcolor);
 
  end:
 
@@ -1500,7 +1502,7 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla
                layer->geometry.floor = vlayout->images[i].floor;
                layer->geometry.overlap = vlayout->images[i].overlap;
                layer->idx = i;
-
+               layer->refresh = 1;
 
                layer->screen_w = conference->canvas->img->d_w * layer->geometry.scale / VIDEO_LAYOUT_SCALE;
                layer->screen_h = conference->canvas->img->d_h * layer->geometry.scale / VIDEO_LAYOUT_SCALE;
@@ -1522,12 +1524,15 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla
                layer->geometry.audio_position = vlayout->images[i].audio_position;
        }
 
+       reset_image(conference->canvas->img, &conference->canvas->bgcolor);
+
        for (i = 0; i < MCU_MAX_LAYERS; i++) {
                mcu_layer_t *layer = &conference->canvas->layers[i];
 
                layer->member_id = 0;
                layer->tagged = 0;
                layer->banner_patched = 0;
+               layer->refresh = 1;
                reset_layer(conference->canvas, layer);
 
        }
@@ -1535,7 +1540,7 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla
        conference->canvas->layers_used = 0;
        conference->canvas->total_layers = vlayout->layers;
        conference->canvas->send_keyframe = 1;
-       reset_image(conference->canvas->img, &conference->canvas->bgcolor);
+
        switch_mutex_unlock(conference->canvas->mutex); 
 
 }
@@ -1560,6 +1565,7 @@ static void init_canvas(conference_obj_t *conference, video_layout_t *vlayout)
 
        switch_mutex_lock(conference->canvas->mutex);
        set_canvas_bgcolor(conference->canvas, conference->video_canvas_bgcolor);
+       set_canvas_letterbox_bgcolor(conference->canvas, conference->video_letterbox_bgcolor);
        init_canvas_layers(conference, vlayout);
        switch_mutex_unlock(conference->canvas->mutex);
 }
@@ -12362,7 +12368,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c
        char *video_layout_group = NULL;
        char *video_canvas_size = NULL;
        char *video_canvas_bgcolor = NULL;
-       char *video_layout_bgcolor = NULL;
+       char *video_letterbox_bgcolor = NULL;
        char *video_codec_bandwidth = NULL;
        char *no_video_avatar = NULL;
        conf_video_mode_t conf_video_mode = CONF_VIDEO_MODE_PASSTHROUGH;
@@ -12518,8 +12524,8 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c
                                video_layout_name = val;
                        } else if (!strcasecmp(var, "video-canvas-bgcolor") && !zstr(val)) {
                                video_canvas_bgcolor= val;
-                       } else if (!strcasecmp(var, "video-layout-bgcolor") && !zstr(val)) {
-                               video_layout_bgcolor= val;
+                       } else if (!strcasecmp(var, "video-letterbox-bgcolor") && !zstr(val)) {
+                               video_letterbox_bgcolor= val;
                        } else if (!strcasecmp(var, "video-canvas-size") && !zstr(val)) {
                                video_canvas_size = val;
                        } else if (!strcasecmp(var, "video-fps") && !zstr(val)) {
@@ -12752,8 +12758,8 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c
                        video_canvas_bgcolor = "#333333";
                }
 
-               if (!video_layout_bgcolor) {
-                       video_layout_bgcolor = "#000000";
+               if (!video_letterbox_bgcolor) {
+                       video_letterbox_bgcolor = "#000000";
                }
 
                if (no_video_avatar) {
@@ -12761,7 +12767,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c
                }
 
                conference->video_canvas_bgcolor = switch_core_strdup(conference->pool, video_canvas_bgcolor);
-               conference->video_layout_bgcolor = switch_core_strdup(conference->pool, video_layout_bgcolor);
+               conference->video_letterbox_bgcolor = switch_core_strdup(conference->pool, video_letterbox_bgcolor);
 
                if (fps) {
                        conference_set_fps(conference, fps);
index 35a9c51ce4564176e1b2ea5bc709af18c27c33cd..63d02dff3bb93d46148a2f6a0d18ed229717ab90 100644 (file)
@@ -836,7 +836,7 @@ SWITCH_DECLARE(switch_image_t *) switch_img_write_text_img(int w, int h, const c
 
     if (len < 5) len = 5;
 
-    width = (int) (float)(font_size * 0.95f * len);
+    width = (int) (float)(font_size * 0.75f * len);
        
        txtimg = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, width, font_size * 2, 1);