]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10114: [mod_conference] Reduce image reads from disk for logo image #resolve
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 9 Mar 2017 01:36:10 +0000 (19:36 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 9 Mar 2017 01:36:18 +0000 (19:36 -0600)
src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/conference_member.c
src/mod/applications/mod_conference/conference_video.c
src/mod/applications/mod_conference/mod_conference.h
src/switch_core_video.c

index f56fcbb7e696a93c966a8eb45188fd85c5db6bb3..6f07937145dd36585904b83b208f195d9d82d175 100644 (file)
@@ -1637,28 +1637,19 @@ switch_status_t conference_api_sub_vid_logo_img(conference_member_t *member, swi
                return SWITCH_STATUS_FALSE;
        }
 
+       conference_member_set_logo(member, text);
+
        layer = conference_video_get_layer_locked(member);
 
        if (!layer) {
                goto end;
        }
 
-       if (!zstr(text)) {
-               if (!strcasecmp(text, "allclear")) {
-                       switch_channel_set_variable(member->channel, "video_logo_path", NULL);
-                       member->video_logo = NULL;
-               } else if (!strcasecmp(text, "clear")) {
-                       member->video_logo = NULL;
-               } else {
-                       member->video_logo = switch_core_strdup(member->pool, text);
-               }
-
-               conference_video_layer_set_logo(member, layer, text);
-       }
+       conference_video_layer_set_logo(member, layer);
 
  end:
 
-       stream->write_function(stream, "%s\n", member->video_logo ? member->video_logo : "_undef_");
+       stream->write_function(stream, "Video logo %s\n", member->video_logo ? "set" : "cleared");
 
        conference_video_release_layer(&layer);
 
index 2dc5ce5a5f2c9b42645e6397415e57dce0e1626e..c58b7e5637d79e76f622bcf8d19b2b6a21348e4d 100644 (file)
@@ -742,6 +742,11 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
 
                conference_video_check_avatar(member, SWITCH_FALSE);
 
+
+               if ((var = switch_channel_get_variable_dup(member->channel, "video_logo_path", SWITCH_FALSE, -1))) {
+                       conference_member_set_logo(member, var);
+               }
+
                if ((var = switch_channel_get_variable_dup(member->channel, "conference_join_volume_in", SWITCH_FALSE, -1))) {
                        uint32_t id = atoi(var);
 
@@ -1113,7 +1118,8 @@ switch_status_t conference_member_del(conference_obj_t *conference, conference_m
                                                         switch_core_session_get_channel(member->session), 0);
        }
 
-
+       conference_member_set_logo(member, NULL);
+       
        lock_member(member);
 
        conference_member_del_relationship(member, 0);
index fde8db631510ebb4af3fd8de2cdae4363f106d93..8d0d0e98a0aed963247a656e3901adfc46e5774d 100644 (file)
@@ -763,7 +763,27 @@ void conference_video_detach_video_layer(conference_member_t *member)
 }
 
 
-void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *layer, const char *path)
+void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *layer)
+{
+       switch_mutex_lock(layer->canvas->mutex);
+
+
+       switch_img_free(&layer->logo_img);
+       switch_img_free(&layer->logo_text_img);
+
+       if (member->video_logo) {
+               switch_img_copy(member->video_logo, &layer->logo_img);
+
+               if (layer->logo_img) {
+                       layer->logo_pos = member->logo_pos;
+                       layer->logo_fit = member->logo_fit;
+               }
+       }
+
+       switch_mutex_unlock(layer->canvas->mutex);
+}
+
+void conference_member_set_logo(conference_member_t *member, const char *path)
 {
        const char *var = NULL;
        char *dup = NULL;
@@ -773,19 +793,10 @@ void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *l
        switch_img_position_t pos = POS_LEFT_TOP;
        switch_img_fit_t fit = SWITCH_FIT_SIZE;
 
-       switch_mutex_lock(layer->canvas->mutex);
-
-       if (!path) {
-               path = member->video_logo;
-       }
-
-       if (!path) {
-               goto end;
-       }
+       switch_img_free(&member->video_logo);
 
-       if (path) {
-               switch_img_free(&layer->logo_img);
-               switch_img_free(&layer->logo_text_img);
+       if (!path || !strcasecmp(path, "clear")) {
+               return;
        }
 
        if (*path == '{') {
@@ -799,21 +810,6 @@ void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *l
                }
        }
 
-
-       if (zstr(path) || !strcasecmp(path, "reset")) {
-               path = switch_channel_get_variable_dup(member->channel, "video_logo_path", SWITCH_FALSE, -1);
-       }
-
-       if (zstr(path) || !strcasecmp(path, "clear")) {
-               switch_img_free(&layer->banner_img);
-               layer->banner_patched = 0;
-               member->video_logo = NULL;
-               switch_img_fill(layer->canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h,
-                                               &layer->canvas->letterbox_bgcolor);
-
-               goto end;
-       }
-
        if ((tmp = strchr(path, '}'))) {
                path = tmp + 1;
        }
@@ -828,18 +824,35 @@ void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *l
                }
        }
 
-       if (path && strcasecmp(path, "clear")) {
-               layer->logo_img = switch_img_read_png(path, SWITCH_IMG_FMT_ARGB);
-       }
 
-       if (layer->logo_img) {
-               layer->logo_pos = pos;
-               layer->logo_fit = fit;
 
-               if (params) {
-                       if ((var = switch_event_get_header(params, "text"))) {
-                               layer->logo_text_img = switch_img_write_text_img(layer->screen_w, layer->screen_h, SWITCH_FALSE, var);
+       if (path) {
+               member->video_logo = switch_img_read_png(path, SWITCH_IMG_FMT_ARGB);
+
+               if (member->video_logo) {
+                       member->logo_pos = pos;
+                       member->logo_fit = fit;
+
+                       if (params && (var = switch_event_get_header(params, "text"))) {
+                               switch_image_t *img = NULL;
+                               const char *tmp;
+                               int x = 0, y = 0;
+
+                               if ((tmp = switch_event_get_header(params, "text_x"))) {
+                                       x = atoi(tmp);
+                               }
+
+                               if ((tmp = switch_event_get_header(params, "text_y"))) {
+                                       y = atoi(tmp);
+                               }
+
+                               img = switch_img_write_text_img(member->video_logo->d_w, member->video_logo->d_h, SWITCH_FALSE, var);
+                               switch_img_fit(&img, member->video_logo->d_w, member->video_logo->d_h, SWITCH_FIT_SIZE);
+                               switch_img_attenuate(member->video_logo);
+                               switch_img_patch(member->video_logo, img, x, y);
+                               switch_img_free(&img);
                        }
+                       
                }
        }
 
@@ -847,10 +860,7 @@ void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *l
 
        switch_safe_free(dup);
 
- end:
-
-       switch_mutex_unlock(layer->canvas->mutex);
-
+       return;
 }
 
 void conference_video_layer_set_banner(conference_member_t *member, mcu_layer_t *layer, const char *text)
@@ -1055,10 +1065,7 @@ switch_status_t conference_video_attach_video_layer(conference_member_t *member,
                conference_video_layer_set_banner(member, layer, var);
        }
 
-       var = NULL;
-       if (member->video_logo || (var = switch_channel_get_variable_dup(channel, "video_logo_path", SWITCH_FALSE, -1))) {
-               conference_video_layer_set_logo(member, layer, var);
-       }
+       conference_video_layer_set_logo(member, layer);
 
        layer->member_id = member->id;
        layer->member = member;
@@ -2431,11 +2438,7 @@ static void personal_attach(mcu_layer_t *layer, conference_member_t *member)
                                conference_video_layer_set_banner(member, layer, var);
                        }
 
-                       var = NULL;
-                       if (member->video_logo ||
-                               (var = switch_channel_get_variable_dup(member->channel, "video_logo_path", SWITCH_FALSE, -1))) {
-                               conference_video_layer_set_logo(member, layer, var);
-                       }
+                       conference_video_layer_set_logo(member, layer);
                }
        }
 
index d7335e52283e80776c989af59b964c0109c46724..101cbd93bb5168a54532f4a6d8c24c288ed119a3 100644 (file)
@@ -449,7 +449,6 @@ typedef struct mcu_layer_s {
        int is_avatar;
        int crop_point;
        switch_size_t last_img_addr;
-       switch_img_position_t logo_pos;
        switch_image_t *img;
        switch_image_t *cur_img;
        switch_image_t *banner_img;
@@ -458,6 +457,7 @@ typedef struct mcu_layer_s {
        switch_image_t *mute_img;
        switch_img_txt_handle_t *txthandle;
        conference_file_node_t *fnode;
+       switch_img_position_t logo_pos;
        switch_img_fit_t logo_fit;
        struct mcu_canvas_s *canvas;
        int need_patch;
@@ -775,7 +775,9 @@ struct conference_member {
        int video_codec_index;
        int video_codec_id;
        char *video_banner_text;
-       char *video_logo;
+       switch_image_t *video_logo;
+       switch_img_position_t logo_pos;
+       switch_img_fit_t logo_fit;
        char *video_mute_png;
        char *video_reservation_id;
        switch_vid_params_t vid_params;
@@ -949,7 +951,8 @@ void conference_utils_member_clear_flag(conference_member_t *member, member_flag
 void conference_utils_member_clear_flag_locked(conference_member_t *member, member_flag_t flag);
 switch_status_t conference_video_attach_video_layer(conference_member_t *member, mcu_canvas_t *canvas, int idx);
 int conference_video_set_fps(conference_obj_t *conference, float fps);
-void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *layer, const char *path);
+void conference_member_set_logo(conference_member_t *member, const char *path);
+void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *layer);
 void conference_video_layer_set_banner(conference_member_t *member, mcu_layer_t *layer, const char *text);
 void conference_fnode_seek(conference_file_node_t *fnode, switch_stream_handle_t *stream, char *arg);
 uint32_t conference_member_stop_file(conference_member_t *member, file_stop_t stop);
@@ -970,7 +973,6 @@ void conference_video_init_canvas_layers(conference_obj_t *conference, mcu_canva
 switch_status_t conference_video_attach_video_layer(conference_member_t *member, mcu_canvas_t *canvas, int idx);
 void conference_video_reset_video_bitrate_counters(conference_member_t *member);
 void conference_video_layer_set_banner(conference_member_t *member, mcu_layer_t *layer, const char *text);
-void conference_video_layer_set_logo(conference_member_t *member, mcu_layer_t *layer, const char *path);
 void conference_video_detach_video_layer(conference_member_t *member);
 void conference_video_check_used_layers(mcu_canvas_t *canvas);
 void conference_video_check_flush(conference_member_t *member, switch_bool_t force);
index 135b1b3e0cbbf10d56e977be48a4e48f3e926f4d..0f7cc4aa3b7826dc10f6aee52caf07a4d17e7c25 100644 (file)
@@ -1861,8 +1861,7 @@ SWITCH_DECLARE(uint32_t) switch_img_txt_handle_render(switch_img_txt_handle_t *h
                return 0;
        }
 
-       /* use 50pt at 100dpi */
-       error = FT_Set_Char_Size(face, 64 * font_size, 0, 96, 96); /* set character size */
+       error = FT_Set_Char_Size(face, 64 * font_size, 0, 96, 0); /* set character size */
        if (error) return 0;
 
        slot = face->glyph;
@@ -1956,6 +1955,9 @@ SWITCH_DECLARE(switch_image_t *) switch_img_write_text_img(int w, int h, switch_
 
                if (argc > 1 && !zstr(argv[1])) {
                        bg = argv[1];
+                       if (!strcasecmp(bg, "transparent")) {
+                               bg = NULL;
+                       }
                }
 
                if (argc > 2 && !zstr(argv[2])) {
@@ -1988,7 +1990,10 @@ SWITCH_DECLARE(switch_image_t *) switch_img_write_text_img(int w, int h, switch_
 
 
        switch_img_txt_handle_create(&txthandle, font_face, fg, bg, font_size, 0, NULL);
-       switch_color_set_rgb(&bgcolor, bg);
+
+       if (bg) {
+               switch_color_set_rgb(&bgcolor, bg);
+       }
 
        pre_width = switch_img_txt_handle_render(txthandle,
                                                                                         NULL,
@@ -2003,15 +2008,18 @@ SWITCH_DECLARE(switch_image_t *) switch_img_write_text_img(int w, int h, switch_
                width = pre_width;
        }
 
-       if (bg) {
-               txtimg = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, width, height, 1);
-               switch_assert(txtimg);
-               switch_img_fill(txtimg, 0, 0, txtimg->d_w, txtimg->d_h, &bgcolor);
-       } else {
+       //if (bg) {
+       //      txtimg = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, width, height, 1);
+       //      switch_assert(txtimg);
+       //      switch_img_fill(txtimg, 0, 0, txtimg->d_w, txtimg->d_h, &bgcolor);
+       //} else {
                txtimg = switch_img_alloc(NULL, SWITCH_IMG_FMT_ARGB, width, height, 1);
                switch_assert(txtimg);
                memset(txtimg->planes[SWITCH_PLANE_PACKED], 0, width * height * 4);
-       }
+               if (bg) {
+                       switch_img_fill(txtimg, 0, 0, txtimg->d_w, txtimg->d_h, &bgcolor);
+               }
+               //}
 
        x = font_size / 2;
        y = font_size / 2;