typedef struct chromakey_context_s {
int threshold;
switch_image_t *bgimg;
+ switch_image_t *bgimg_scaled;
switch_rgb_color_t bgcolor;
switch_rgb_color_t mask;
switch_core_session_t *session;
static void uninit_context(chromakey_context_t *context)
{
switch_img_free(&context->bgimg);
+ switch_img_free(&context->bgimg_scaled);
}
static void parse_params(chromakey_context_t *context, int start, int argc, char **argv, const char **function, switch_media_bug_flag_t *flags)
i++;
if (n > 2 && argv[i]) {
+ if (context->bgimg) {
+ switch_img_free(&context->bgimg);
+ }
+ if (context->bgimg_scaled) {
+ switch_img_free(&context->bgimg_scaled);
+ }
+
if (argv[i][0] == '#') { // bgcolor
switch_color_set_rgb(&context->bgcolor, argv[i]);
} else {
- if (!context->bgimg) {
- context->bgimg = switch_img_read_png(argv[i], SWITCH_IMG_FMT_ARGB);
- }
+ context->bgimg = switch_img_read_png(argv[i], SWITCH_IMG_FMT_I420);
}
}
switch_img_chromakey(img, &context->mask, context->threshold);
if (context->bgimg) {
- switch_img_patch(frame->img, context->bgimg, 0, 0);
+ if (context->bgimg_scaled && (context->bgimg_scaled->d_w != frame->img->d_w || context->bgimg_scaled->d_h != frame->img->d_h)) {
+ switch_img_free(&context->bgimg_scaled);
+ }
+
+ if (!context->bgimg_scaled) {
+ switch_img_scale(context->bgimg, &context->bgimg_scaled, frame->img->d_w, frame->img->d_h);
+ }
+
+ switch_img_patch(frame->img, context->bgimg_scaled, 0, 0);
} else {
switch_img_fill(frame->img, 0, 0, img->d_w, img->d_h, &context->bgcolor);
}