From 40687ccb6aabce5ef65fcdb46fa1742429b3c130 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 3 Mar 2017 19:01:39 -0600 Subject: [PATCH] FS-10050: [core] chromakey --- src/include/switch_core_video.h | 2 ++ .../mod_video_filter/mod_video_filter.c | 1 + src/switch_core_video.c | 20 ++++++++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/include/switch_core_video.h b/src/include/switch_core_video.h index 908911e92a..4a5be90cb4 100644 --- a/src/include/switch_core_video.h +++ b/src/include/switch_core_video.h @@ -223,6 +223,8 @@ SWITCH_DECLARE(int) switch_img_set_rect(switch_image_t *img, */ SWITCH_DECLARE(void) switch_img_patch(switch_image_t *IMG, switch_image_t *img, int x, int y); +SWITCH_DECLARE(void) switch_img_attenuate(switch_image_t *img); + /*!\brief patch a small img to a big IMG at position x,y * * Both IMG and img must be non-NULL diff --git a/src/mod/applications/mod_video_filter/mod_video_filter.c b/src/mod/applications/mod_video_filter/mod_video_filter.c index e7d7250232..f7a9995c61 100644 --- a/src/mod/applications/mod_video_filter/mod_video_filter.c +++ b/src/mod/applications/mod_video_filter/mod_video_filter.c @@ -253,6 +253,7 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi switch_img_to_raw(frame->img, context->data, frame->img->d_w * 4, SWITCH_IMG_FMT_ARGB); img = switch_img_wrap(NULL, SWITCH_IMG_FMT_ARGB, frame->img->d_w, frame->img->d_h, 1, context->data); + switch_assert(img); switch_chromakey_process(context->ck, img); diff --git a/src/switch_core_video.c b/src/switch_core_video.c index 1924c13b99..a9645c5802 100644 --- a/src/switch_core_video.c +++ b/src/switch_core_video.c @@ -286,7 +286,9 @@ SWITCH_DECLARE(void) switch_img_free(switch_image_t **img) gdImageDestroy((gdImagePtr)(*img)->user_priv); #endif } else { - switch_safe_free((*img)->user_priv); + if ((int)(intptr_t)(*img)->user_priv != 1) { + switch_safe_free((*img)->user_priv); + } } vpx_img_free((vpx_image_t *)*img); *img = NULL; @@ -338,6 +340,16 @@ static void switch_img_patch_rgb_noalpha(switch_image_t *IMG, switch_image_t *im } } +SWITCH_DECLARE(void) switch_img_attenuate(switch_image_t *img) +{ + if (img->fmt != SWITCH_IMG_FMT_ARGB) { + return; + } + + ARGBAttenuate(img->planes[SWITCH_PLANE_PACKED], img->stride[SWITCH_PLANE_PACKED], + img->planes[SWITCH_PLANE_PACKED], img->stride[SWITCH_PLANE_PACKED], img->d_w, img->d_h); +} + SWITCH_DECLARE(void) switch_img_patch_rgb(switch_image_t *IMG, switch_image_t *img, int x, int y, switch_bool_t noalpha) { int i; @@ -358,7 +370,10 @@ SWITCH_DECLARE(void) switch_img_patch_rgb(switch_image_t *IMG, switch_image_t *i int height = MIN(img->d_h, IMG->d_h - abs(y)); void (*ARGBBlendRow)(const uint8* src_argb, const uint8* src_argb1, uint8* dst_argb, int width) = GetARGBBlend(); - ARGBAttenuate(src_argb0, src_stride_argb0, src_argb0, src_stride_argb0, img->d_w, img->d_h); + if (!img->user_priv) { + img->user_priv = (void *)(intptr_t)1; + ARGBAttenuate(src_argb0, src_stride_argb0, src_argb0, src_stride_argb0, img->d_w, img->d_h); + } // Coalesce rows. we have same size images, treat as a single row if (src_stride_argb0 == width * 4 && @@ -384,7 +399,6 @@ SWITCH_DECLARE(void) switch_img_patch_rgb(switch_image_t *IMG, switch_image_t *i src_argb1 += src_stride_argb1; dst_argb += dst_stride_argb; } - ARGBUnattenuate(img->planes[SWITCH_PLANE_PACKED], src_stride_argb0, img->planes[SWITCH_PLANE_PACKED], src_stride_argb0, img->d_w, img->d_h); } }