]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: basic logo
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 12 Feb 2015 20:06:26 +0000 (14:06 -0600)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:47:01 +0000 (12:47 -0500)
src/include/switch_core_video.h
src/mod/applications/mod_conference/mod_conference.c
src/switch_core_video.c

index 84b0eaca901c9056339f1298a27c9829f20f2455..748d658a3f68168b4b2943bdb7d2555639c7b9b7 100644 (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);
 
 /** @} */
index 86b8903fca4bbec1e97719be7b0be1f0c97cb3f7..06bf9496f73a2264cdfbb4a684a5917be219b317 100644 (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,14 +1046,26 @@ 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 (*text == '{') {
+               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")) {
                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);
@@ -1054,18 +1074,11 @@ static void layer_set_banner(conference_member_t *member, mcu_layer_t *layer, co
                goto end;
        }
 
-
-       if (*text == '{') {
-               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 ((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");
index d6a206af49c9d1488af4623daed522944d383837..6b75d849f2bec01ff6d586bc3d7f761cf999fb08 100644 (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;