FS-7513: basic logo

This commit is contained in:
Anthony Minessale 2015-02-12 14:06:26 -06:00 committed by Michael Jerris
parent 521a97935e
commit 1faf602251
3 changed files with 45 additions and 22 deletions

View File

@ -193,7 +193,7 @@ SWITCH_DECLARE(switch_status_t) switch_img_txt_handle_render(switch_img_txt_hand
SWITCH_DECLARE(void) switch_img_patch_hole(switch_image_t *IMG, switch_image_t *img, int x, int y, switch_image_rect_t *rect);
SWITCH_DECLARE(switch_image_t *) switch_img_read_png(char* file_name);
SWITCH_DECLARE(switch_image_t *) switch_img_read_png(const char* file_name);
SWITCH_DECLARE(void) switch_img_write_png(switch_image_t *img, char* file_name);
/** @} */

View File

@ -366,6 +366,7 @@ typedef struct mcu_layer_s {
switch_image_t *img;
switch_image_t *cur_img;
switch_image_t *banner_img;
switch_image_t *logo_img;
switch_img_txt_handle_t *txthandle;
} mcu_layer_t;
@ -877,6 +878,8 @@ static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer)
layer->tagged = 0;
switch_img_free(&layer->banner_img);
switch_img_free(&layer->logo_img);
layer->banner_patched = 0;
switch_img_free(&layer->img);
@ -940,6 +943,11 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer)
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;
}
if (layer->logo_img) {
switch_img_patch(img, layer->logo_img, img->d_w - layer->logo_img->d_w, 0);
}
switch_assert(layer->img);
@ -1023,10 +1031,10 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
const char *bg = "#142e55";
char *parsed = NULL;
switch_event_t *params = NULL;
const char *font_face = "/usr/share/fonts/truetype/freefont/FreeSansOblique.ttf";
const char *var;
const char *font_face = "/usr/share/fonts/truetype/freefont/FreeSansOblique.ttf", *logo_png = NULL;
const char *var, *tmp = NULL;
char *dup = NULL;
switch_mutex_lock(member->conference->canvas->mutex);
@ -1038,23 +1046,6 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
goto end;
}
if (!strcasecmp(text, "reset")) {
text = switch_channel_get_variable_dup(member->channel, "video_banner_text", SWITCH_FALSE, -1);
}
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);
goto end;
}
if (*text == '{') {
dup = strdup(text);
text = dup;
@ -1066,6 +1057,28 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
}
}
if (zstr(text) || !strcasecmp(text, "reset")) {
text = switch_channel_get_variable_dup(member->channel, "video_banner_text", SWITCH_FALSE, -1);
}
if (zstr(text) || !strcasecmp(text, "clear")) {
switch_rgb_color_t color;
switch_img_free(&layer->banner_img);
switch_img_free(&layer->logo_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);
goto end;
}
if ((tmp = strchr(text, '}'))) {
text = tmp + 1;
}
if (params) {
if ((var = switch_event_get_header(params, "fg"))) {
fg = var;
@ -1079,6 +1092,10 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
font_face = var;
}
if ((var = switch_event_get_header(params, "logo_png"))) {
logo_png = var;
}
if ((var = switch_event_get_header(params, "font_scale"))) {
int tmp = atoi(var);
@ -1095,8 +1112,12 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
switch_color_set_rgb(&bgcolor, bg);
switch_img_free(&layer->banner_img);
switch_img_free(&layer->logo_img);
layer->banner_img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, layer->screen_w, font_size * 2, 1);
if (logo_png) {
layer->logo_img = switch_img_read_png(logo_png);
}
if (layer->txthandle) {
switch_img_txt_handle_destroy(&layer->txthandle);
@ -1615,6 +1636,7 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
switch_img_free(&layer->img);
layer->banner_patched = 0;
switch_img_free(&layer->banner_img);
switch_img_free(&layer->logo_img);
if (layer->txthandle) {
switch_img_txt_handle_destroy(&layer->txthandle);
@ -8003,6 +8025,7 @@ static switch_status_t conf_api_sub_vid_banner(conference_member_t *member, swit
layer = &member->conference->canvas->layers[member->video_layer_id];
member->video_banner_text = switch_core_strdup(member->pool, text);
layer_set_banner(member, layer, NULL);
stream->write_function(stream, "+OK\n");

View File

@ -605,7 +605,7 @@ SWITCH_DECLARE(void) switch_img_patch_hole(switch_image_t *IMG, switch_image_t *
// http://www.libpng.org/pub/png/libpng-1.2.5-manual.html
// ftp://ftp.oreilly.com/examples/9781565920583/CDROM/SOFTWARE/SOURCE/LIBPNG/EXAMPLE.C
SWITCH_DECLARE(switch_image_t *) switch_img_read_png(char* file_name)
SWITCH_DECLARE(switch_image_t *) switch_img_read_png(const char* file_name)
{
png_byte header[8]; // 8 is the maximum size that can be checked
png_bytep *row_pointers = NULL;