diff --git a/src/include/switch_core_video.h b/src/include/switch_core_video.h index 6e6de2aecd..92440a1e7b 100644 --- a/src/include/switch_core_video.h +++ b/src/include/switch_core_video.h @@ -189,7 +189,9 @@ SWITCH_DECLARE(void) switch_img_add_text(void *buffer, int w, int x, int y, char SWITCH_DECLARE(switch_image_t *) switch_img_copy_rect(switch_image_t *img, int x, int y, int w, int h); -SWITCH_DECLARE(void) switch_image_draw_pixel(switch_image_t *img, int x, int y, switch_yuv_color_t color); +SWITCH_DECLARE(void) switch_img_fill(switch_image_t *img, int x, int y, int w, int h, switch_yuv_color_t color); + +SWITCH_DECLARE(void) switch_img_draw_pixel(switch_image_t *img, int x, int y, switch_yuv_color_t color); SWITCH_DECLARE(void) switch_color_set(switch_yuv_color_t *color, char *color_str); diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 297cabbe8a..44d8f97d74 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -754,7 +754,7 @@ static void draw_bitmap(switch_image_t *img, FT_Bitmap* bitmap, FT_Int x, FT_Int if ( i < 0 || j < 0 || i >= img->d_w || j >= img->d_h) continue; if (bitmap->buffer[q * bitmap->width + p] > 128) { - switch_image_draw_pixel(img, i, j, color); + switch_img_draw_pixel(img, i, j, color); } } } @@ -1013,16 +1013,7 @@ static int mcu_canvas_wake(mcu_canvas_t *mcu_canvas) static void reset_image(switch_image_t *img, switch_yuv_color_t *color) { - int i; - - for (i = 0; i < img->h; i++) { - memset(img->planes[SWITCH_PLANE_Y] + img->stride[SWITCH_PLANE_Y] * i, color->y, img->d_w); - } - - for (i = 0; i < img->h / 2; i++) { - memset(img->planes[SWITCH_PLANE_U] + img->stride[SWITCH_PLANE_U] * i, color->u, img->d_w / 2); - memset(img->planes[SWITCH_PLANE_V] + img->stride[SWITCH_PLANE_V] * i, color->v, img->d_w / 2); - } + switch_img_fill(img, 0, 0, img->w, img->h, *color); } #define SCALE_FACTOR 360.0f @@ -1126,6 +1117,10 @@ static void scale_and_patch(conference_obj_t *conference, mcu_layer_t *layer) if (ret != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Scaling Error: ret: %d\n", ret); } else { + if (layer->img->d_h > 20) { + // reserv the bottom room for text, e.g. caller id + // switch_img_set_rect(layer->img, 0, 0, layer->img->d_w, layer->img->d_h - 20); + } switch_img_patch(IMG, layer->img, x, y); } } else { @@ -1583,6 +1578,10 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread switch_img_draw_text(conference->canvas->img, 10, 80, color, 24, "AVA 123 你好 FreeSWITCH\nFreeSWITCH Rocks!"); switch_img_draw_text(conference->canvas->img, 10, 160, color, 36, "AVA 123 你好 FreeSWITCH\nFreeSWITCH Rocks!"); switch_img_draw_text(conference->canvas->img, 10, 300, color, 72, "AVA 123 你好 FreeSWITCH\nFreeSWITCH Rocks!"); + + switch_img_fill(conference->canvas->img, 300, 10, 400, 40, color); + switch_color_set(&color, "#FF0000"); + switch_img_draw_text(conference->canvas->img, 300, 10, color, 32, "FreeSWITCH"); } if (used) { diff --git a/src/switch_core_video.c b/src/switch_core_video.c index 9e0eadbf21..8a1396ccac 100644 --- a/src/switch_core_video.c +++ b/src/switch_core_video.c @@ -161,7 +161,7 @@ SWITCH_DECLARE(switch_image_t *) switch_img_copy_rect(switch_image_t *img, int x return new_img; } -SWITCH_DECLARE(void) switch_image_draw_pixel(switch_image_t *img, int x, int y, switch_yuv_color_t color) +SWITCH_DECLARE(void) switch_img_draw_pixel(switch_image_t *img, int x, int y, switch_yuv_color_t color) { if (x < 0 || y < 0 || x >= img->d_w || y >= img->d_h) return; @@ -173,6 +173,27 @@ SWITCH_DECLARE(void) switch_image_draw_pixel(switch_image_t *img, int x, int y, } } +SWITCH_DECLARE(void) switch_img_fill(switch_image_t *img, int x, int y, int w, int h, switch_yuv_color_t color) +{ + int len, i; + + if (x < 0 || y < 0 || x >= img->d_w || y >= img->d_h) return; + + len = MIN(w, img->d_w - x); + if (len <= 0) return; + + for (i = y; i < (y + h) && i < img->d_h; i++) { + memset(img->planes[SWITCH_PLANE_Y] + img->stride[SWITCH_PLANE_Y] * i + x, color.y, len); + } + + len /= 2; + + for (i = y; i < (y + h) && i < img->d_h; i += 2) { + memset(img->planes[SWITCH_PLANE_U] + img->stride[SWITCH_PLANE_U] * i / 2 + x / 2, color.u, len); + memset(img->planes[SWITCH_PLANE_V] + img->stride[SWITCH_PLANE_V] * i / 2 + x / 2, color.v, len); + } +} + static uint8_t scv_art[14][16] = { {0x00, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x00}, {0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00},