aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2022-04-11 13:49:05 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2022-06-14 16:55:15 +0200
commit0a3a33311e7566e0e05ca98f97d1e4b45f37f08d (patch)
treec994820e908b5b752dcb345edecb534daf7d649c
parent1e99ff9d338b1573462d8a7a75bc523e9cb35085 (diff)
downloadffmpeg-0a3a33311e7566e0e05ca98f97d1e4b45f37f08d.tar.gz
avfilter/vf_frei0r: Copy to frame allocated according to frei0r requirements
Fixes: issues with non trivial linesize Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit d353909e773ba8a8201fa13d6c35251351dd567a) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavfilter/vf_frei0r.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/libavfilter/vf_frei0r.c b/libavfilter/vf_frei0r.c
index 8aeac08519..bfcec07726 100644
--- a/libavfilter/vf_frei0r.c
+++ b/libavfilter/vf_frei0r.c
@@ -348,14 +348,20 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{
Frei0rContext *s = inlink->dst->priv;
AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFrame *out;
+ AVFrame *out = ff_default_get_video_buffer2(outlink, outlink->w, outlink->h, 16);
+ if (!out)
+ goto fail;
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
+ av_frame_copy_props(out, in);
+
+ if (in->linesize[0] != out->linesize[0]) {
+ AVFrame *in2 = ff_default_get_video_buffer2(outlink, outlink->w, outlink->h, 16);
+ if (!in2)
+ goto fail;
+ av_frame_copy(in2, in);
av_frame_free(&in);
- return AVERROR(ENOMEM);
+ in = in2;
}
- av_frame_copy_props(out, in);
s->update(s->instance, in->pts * av_q2d(inlink->time_base) * 1000,
(const uint32_t *)in->data[0],
@@ -364,6 +370,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
av_frame_free(&in);
return ff_filter_frame(outlink, out);
+fail:
+ av_frame_free(&in);
+ av_frame_free(&out);
+ return AVERROR(ENOMEM);
}
#define OFFSET(x) offsetof(Frei0rContext, x)
@@ -446,7 +456,7 @@ static int source_config_props(AVFilterLink *outlink)
static int source_request_frame(AVFilterLink *outlink)
{
Frei0rContext *s = outlink->src->priv;
- AVFrame *frame = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+ AVFrame *frame = ff_default_get_video_buffer2(outlink, outlink->w, outlink->h, 16);
if (!frame)
return AVERROR(ENOMEM);