Subject: [PATCH] fix pad artifacts
From: Ben Lu <[email-masked]>
To: [email-masked]
Date: Fri, 31 Jan 2025 23:13:25 +0000

Signed-off-by: Ben Lu <[email-masked]>
---
 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