[FFmpeg-devel] [PATCH] Align overlaied video movie x/y and w/h sizes to chroma subsampling values.
Stefano Sabatini
stefano.sabatini-lala
Fri Jan 28 00:17:27 CET 2011
Fix alignment bands when the input video size or position is not
chroma-aligned.
---
libavfilter/vf_overlay.c | 21 ++++++++++++---------
1 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
index a170e81..5e73da2 100644
--- a/libavfilter/vf_overlay.c
+++ b/libavfilter/vf_overlay.c
@@ -58,7 +58,8 @@ enum var_name {
#define OVERLAY 1
typedef struct {
- int x, y; ///< position of overlayed picture
+ int x, y; ///< chroma-aligned position of overlayed picture
+ int w, h; ///< chroma-aligned width and heigth of the overlaied video
AVFilterBufferRef *overpicref;
@@ -129,31 +130,33 @@ static int config_input_overlay(AVFilterLink *inlink)
var_values[VAR_PHI] = M_PHI;
var_values[VAR_PI ] = M_PI;
+ over->w = ctx->inputs[OVERLAY]->w & ~((1 << over->hsub) - 1);
+ over->h = ctx->inputs[OVERLAY]->h & ~((1 << over->vsub) - 1);
+
var_values[VAR_MAIN_W ] = var_values[VAR_MW] = ctx->inputs[MAIN ]->w;
var_values[VAR_MAIN_H ] = var_values[VAR_MH] = ctx->inputs[MAIN ]->h;
- var_values[VAR_OVERLAY_W] = var_values[VAR_OW] = ctx->inputs[OVERLAY]->w;
- var_values[VAR_OVERLAY_H] = var_values[VAR_OH] = ctx->inputs[OVERLAY]->h;
+ var_values[VAR_OVERLAY_W] = var_values[VAR_OW] = over->w;
+ var_values[VAR_OVERLAY_H] = var_values[VAR_OH] = over->h;
if ((ret = av_expr_parse_and_eval(&res, (expr = over->x_expr), var_names, var_values,
NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0)
goto fail;
- over->x = res;
+ over->x = (int)res & ~((1 << over->hsub) - 1);
if ((ret = av_expr_parse_and_eval(&res, (expr = over->y_expr), var_names, var_values,
NULL, NULL, NULL, NULL, NULL, 0, ctx)))
goto fail;
- over->y = res;
+ over->y = (int)res & ~((1 << over->vsub) - 1);
/* x may depend on y */
if ((ret = av_expr_parse_and_eval(&res, (expr = over->x_expr), var_names, var_values,
NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0)
goto fail;
- over->x = res;
+ over->x = (int)res & ~((1 << over->hsub) - 1);
av_log(ctx, AV_LOG_INFO,
"main w:%d h:%d fmt:%s overlay x:%d y:%d w:%d h:%d fmt:%s\n",
ctx->inputs[MAIN]->w, ctx->inputs[MAIN]->h,
av_pix_fmt_descriptors[ctx->inputs[MAIN]->format].name,
- over->x, over->y,
- ctx->inputs[OVERLAY]->w, ctx->inputs[OVERLAY]->h,
+ over->x, over->y, over->w, over->h,
av_pix_fmt_descriptors[ctx->inputs[OVERLAY]->format].name);
if (over->x < 0 || over->y < 0 ||
@@ -328,7 +331,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
!(over->x >= outpicref->video->w || over->y >= outpicref->video->h ||
y+h < over->y || y >= over->y + over->overpicref->video->h)) {
blend_slice(ctx, outpicref, over->overpicref, over->x, over->y,
- over->overpicref->video->w, over->overpicref->video->h,
+ over->w, over->h,
y, outpicref->video->w, h);
}
avfilter_draw_slice(outlink, y, h, slice_dir);
--
1.7.2.3
More information about the ffmpeg-devel
mailing list