From 334ae30484a93852e458720345b09d42d2a70061 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 8 Mar 2017 19:36:10 -0600 Subject: [PATCH] FS-10114: [mod_conference] Reduce image reads from disk for logo image --- .../mod_conference/conference_api.c | 17 +-- .../mod_conference/conference_member.c | 8 +- .../mod_conference/conference_video.c | 102 +++++++++--------- .../mod_conference/mod_conference.h | 10 +- src/switch_core_video.c | 26 +++-- 5 files changed, 86 insertions(+), 77 deletions(-) diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index 3c12c1050f..4e8cf1f5bb 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -1634,28 +1634,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); diff --git a/src/mod/applications/mod_conference/conference_member.c b/src/mod/applications/mod_conference/conference_member.c index 3a550abab5..ca1e6a932f 100644 --- a/src/mod/applications/mod_conference/conference_member.c +++ b/src/mod/applications/mod_conference/conference_member.c @@ -743,6 +743,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); @@ -1114,7 +1119,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); diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c index 2438777fc8..82d38679b3 100644 --- a/src/mod/applications/mod_conference/conference_video.c +++ b/src/mod/applications/mod_conference/conference_video.c @@ -692,7 +692,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; @@ -702,19 +722,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); + switch_img_free(&member->video_logo); - if (!path) { - path = member->video_logo; - } - - if (!path) { - goto end; - } - - if (path) { - switch_img_free(&layer->logo_img); - switch_img_free(&layer->logo_text_img); + if (!path || !strcasecmp(path, "clear")) { + return; } if (*path == '{') { @@ -728,21 +739,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; } @@ -757,18 +753,34 @@ 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_patch(member->video_logo, img, x, y); + switch_img_free(&img); } + } } @@ -776,10 +788,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) @@ -984,10 +993,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; @@ -2271,11 +2277,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); } } diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index 2d3e56e7a6..bb42bca46a 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -448,7 +448,6 @@ typedef struct mcu_layer_s { int clear; int is_avatar; 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; @@ -457,6 +456,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; @@ -768,7 +768,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; @@ -935,7 +937,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); @@ -955,7 +958,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); diff --git a/src/switch_core_video.c b/src/switch_core_video.c index effbdbb715..a59f623a02 100644 --- a/src/switch_core_video.c +++ b/src/switch_core_video.c @@ -1054,8 +1054,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; @@ -1149,6 +1148,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])) { @@ -1181,7 +1183,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, @@ -1196,15 +1201,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;