提交 ad462d20 authored 作者: Anthony Minessale's avatar Anthony Minessale

FS-7513: basic logo

上级 c6293bec
...@@ -193,7 +193,7 @@ SWITCH_DECLARE(switch_status_t) switch_img_txt_handle_render(switch_img_txt_hand ...@@ -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(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); SWITCH_DECLARE(void) switch_img_write_png(switch_image_t *img, char* file_name);
/** @} */ /** @} */
......
...@@ -366,6 +366,7 @@ typedef struct mcu_layer_s { ...@@ -366,6 +366,7 @@ typedef struct mcu_layer_s {
switch_image_t *img; switch_image_t *img;
switch_image_t *cur_img; switch_image_t *cur_img;
switch_image_t *banner_img; switch_image_t *banner_img;
switch_image_t *logo_img;
switch_img_txt_handle_t *txthandle; switch_img_txt_handle_t *txthandle;
} mcu_layer_t; } mcu_layer_t;
...@@ -877,6 +878,8 @@ static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer) ...@@ -877,6 +878,8 @@ static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer)
layer->tagged = 0; layer->tagged = 0;
switch_img_free(&layer->banner_img); switch_img_free(&layer->banner_img);
switch_img_free(&layer->logo_img);
layer->banner_patched = 0; layer->banner_patched = 0;
switch_img_free(&layer->img); switch_img_free(&layer->img);
...@@ -940,6 +943,11 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer) ...@@ -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); 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; 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); switch_assert(layer->img);
...@@ -1023,10 +1031,10 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co ...@@ -1023,10 +1031,10 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
const char *bg = "#142e55"; const char *bg = "#142e55";
char *parsed = NULL; char *parsed = NULL;
switch_event_t *params = NULL; switch_event_t *params = NULL;
const char *font_face = "/usr/share/fonts/truetype/freefont/FreeSansOblique.ttf"; const char *font_face = "/usr/share/fonts/truetype/freefont/FreeSansOblique.ttf", *logo_png = NULL;
const char *var; const char *var, *tmp = NULL;
char *dup = NULL; char *dup = NULL;
switch_mutex_lock(member->conference->canvas->mutex); switch_mutex_lock(member->conference->canvas->mutex);
...@@ -1038,14 +1046,26 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co ...@@ -1038,14 +1046,26 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
goto end; goto end;
} }
if (!strcasecmp(text, "reset")) { if (*text == '{') {
text = switch_channel_get_variable_dup(member->channel, "video_banner_text", SWITCH_FALSE, -1); dup = strdup(text);
text = dup;
if (switch_event_create_brackets((char *)text, '{', '}', ',', &params, &parsed, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS || !parsed) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n");
} else {
text = parsed;
}
} }
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")) { if (zstr(text) || !strcasecmp(text, "clear")) {
switch_rgb_color_t color; switch_rgb_color_t color;
switch_img_free(&layer->banner_img); switch_img_free(&layer->banner_img);
switch_img_free(&layer->logo_img);
layer->banner_patched = 0; layer->banner_patched = 0;
switch_color_set_rgb(&color, member->conference->video_layout_bgcolor); switch_color_set_rgb(&color, member->conference->video_layout_bgcolor);
...@@ -1054,18 +1074,11 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co ...@@ -1054,18 +1074,11 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
goto end; goto end;
} }
if ((tmp = strchr(text, '}'))) {
if (*text == '{') { text = tmp + 1;
dup = strdup(text);
text = dup;
if (switch_event_create_brackets((char *)text, '{', '}', ',', &params, &parsed, SWITCH_FALSE) != SWITCH_STATUS_SUCCESS || !parsed) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n");
} else {
text = parsed;
}
} }
if (params) { if (params) {
if ((var = switch_event_get_header(params, "fg"))) { if ((var = switch_event_get_header(params, "fg"))) {
fg = var; fg = var;
...@@ -1079,6 +1092,10 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co ...@@ -1079,6 +1092,10 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
font_face = var; font_face = var;
} }
if ((var = switch_event_get_header(params, "logo_png"))) {
logo_png = var;
}
if ((var = switch_event_get_header(params, "font_scale"))) { if ((var = switch_event_get_header(params, "font_scale"))) {
int tmp = atoi(var); int tmp = atoi(var);
...@@ -1095,8 +1112,12 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co ...@@ -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_color_set_rgb(&bgcolor, bg);
switch_img_free(&layer->banner_img); 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); 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) { if (layer->txthandle) {
switch_img_txt_handle_destroy(&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 ...@@ -1615,6 +1636,7 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
switch_img_free(&layer->img); switch_img_free(&layer->img);
layer->banner_patched = 0; layer->banner_patched = 0;
switch_img_free(&layer->banner_img); switch_img_free(&layer->banner_img);
switch_img_free(&layer->logo_img);
if (layer->txthandle) { if (layer->txthandle) {
switch_img_txt_handle_destroy(&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 ...@@ -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]; layer = &member->conference->canvas->layers[member->video_layer_id];
member->video_banner_text = switch_core_strdup(member->pool, text); member->video_banner_text = switch_core_strdup(member->pool, text);
layer_set_banner(member, layer, NULL); layer_set_banner(member, layer, NULL);
stream->write_function(stream, "+OK\n"); stream->write_function(stream, "+OK\n");
......
...@@ -605,7 +605,7 @@ SWITCH_DECLARE(void) switch_img_patch_hole(switch_image_t *IMG, switch_image_t * ...@@ -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 // http://www.libpng.org/pub/png/libpng-1.2.5-manual.html
// ftp://ftp.oreilly.com/examples/9781565920583/CDROM/SOFTWARE/SOURCE/LIBPNG/EXAMPLE.C // 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_byte header[8]; // 8 is the maximum size that can be checked
png_bytep *row_pointers = NULL; png_bytep *row_pointers = NULL;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论