提交 40687ccb authored 作者: Anthony Minessale's avatar Anthony Minessale

FS-10050: [core] chromakey

上级 a73d2ca7
...@@ -223,6 +223,8 @@ SWITCH_DECLARE(int) switch_img_set_rect(switch_image_t *img, ...@@ -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_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 /*!\brief patch a small img to a big IMG at position x,y
* *
* Both IMG and img must be non-NULL * Both IMG and img must be non-NULL
......
...@@ -253,6 +253,7 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi ...@@ -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); 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); img = switch_img_wrap(NULL, SWITCH_IMG_FMT_ARGB, frame->img->d_w, frame->img->d_h, 1, context->data);
switch_assert(img); switch_assert(img);
switch_chromakey_process(context->ck, img); switch_chromakey_process(context->ck, img);
......
...@@ -286,8 +286,10 @@ SWITCH_DECLARE(void) switch_img_free(switch_image_t **img) ...@@ -286,8 +286,10 @@ SWITCH_DECLARE(void) switch_img_free(switch_image_t **img)
gdImageDestroy((gdImagePtr)(*img)->user_priv); gdImageDestroy((gdImagePtr)(*img)->user_priv);
#endif #endif
} else { } else {
if ((int)(intptr_t)(*img)->user_priv != 1) {
switch_safe_free((*img)->user_priv); switch_safe_free((*img)->user_priv);
} }
}
vpx_img_free((vpx_image_t *)*img); vpx_img_free((vpx_image_t *)*img);
*img = NULL; *img = NULL;
} }
...@@ -338,6 +340,16 @@ static void switch_img_patch_rgb_noalpha(switch_image_t *IMG, switch_image_t *im ...@@ -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) 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; int i;
...@@ -358,7 +370,10 @@ SWITCH_DECLARE(void) switch_img_patch_rgb(switch_image_t *IMG, switch_image_t *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)); 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(); void (*ARGBBlendRow)(const uint8* src_argb, const uint8* src_argb1, uint8* dst_argb, int width) = GetARGBBlend();
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); 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 // Coalesce rows. we have same size images, treat as a single row
if (src_stride_argb0 == width * 4 && 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 ...@@ -384,7 +399,6 @@ SWITCH_DECLARE(void) switch_img_patch_rgb(switch_image_t *IMG, switch_image_t *i
src_argb1 += src_stride_argb1; src_argb1 += src_stride_argb1;
dst_argb += dst_stride_argb; 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);
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论