mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-14 08:05:37 +00:00
FS-10050: [core] chromakey
This commit is contained in:
parent
a73d2ca72f
commit
40687ccb6a
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user