FS-10114: [mod_conference] Reduce image reads from disk for logo image #resolve

This commit is contained in:
Anthony Minessale committed 2017-03-08 19:36:18 -06:00
1 parent e4f526fc1e
commit 115e69a0c0
5 files changed
+87 -77

No files matched your search

@@ -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);
@@ -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);
@@ -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);
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 == '{') {
@@ -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);
}
}
@@ -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);