mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-04 17:51:03 +00:00
FS-10114: [mod_conference] Reduce image reads from disk for logo image
This commit is contained in:
parent
165e8cf38c
commit
334ae30484
@ -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);
|
||||
|
||||
|
@ -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,6 +1119,7 @@ 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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user