When using pad with eval=frame with variable frame sizes, we get significant artifacting. This is due to incorrect frame sizes, resulting in invalid frames. Made changes to use the output width and height for frame sizes when using eval=frame, with if statement guards to make sure the normal usage is unaffected
Signed-off-by: Ben Lu <[email protected]> --- libavfilter/vf_pad.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c index 49fb272b24..846dd0a9f4 100644 --- a/libavfilter/vf_pad.c +++ b/libavfilter/vf_pad.c @@ -237,15 +237,24 @@ static AVFrame *get_video_buffer(AVFilterLink *inlink, int w, int h) if (s->inlink_w <= 0) return NULL; - frame = ff_get_video_buffer(inlink->dst->outputs[0], - w + (s->w - s->in_w), - h + (s->h - s->in_h) + (s->x > 0)); + if (s->eval_mode == EVAL_MODE_FRAME) { + frame = ff_get_video_buffer(inlink->dst->outputs[0], s->w, s->h); + } else { + frame = ff_get_video_buffer(inlink->dst->outputs[0], + w + (s->w - s->in_w), + h + (s->h - s->in_h) + (s->x > 0)); + } if (!frame) return NULL; - frame->width = w; - frame->height = h; + if (s->eval_mode == EVAL_MODE_FRAME) { + frame->width = s->w; + frame->height = s->h; + } else { + frame->width = w; + frame->height = h; + } for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++) { int hsub = s->draw.hsub[plane]; @@ -358,9 +367,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) if (needs_copy) { av_log(inlink->dst, AV_LOG_DEBUG, "Direct padding impossible allocating new frame\n"); - out = ff_get_video_buffer(outlink, - FFMAX(inlink->w, s->w), - FFMAX(inlink->h, s->h)); + if (s->eval_mode == EVAL_MODE_FRAME) { + out = ff_get_video_buffer(outlink, s->w, s->h); + } else { + out = ff_get_video_buffer(outlink, + FFMAX(inlink->w, s->w), + FFMAX(inlink->h, s->h)); + } if (!out) { av_frame_free(&in); return AVERROR(ENOMEM); -- 2.35.1.70.gdb80f58b59-twtrsrc _______________________________________________ ffmpeg-devel mailing list [email protected] https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
