summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2022-04-11 13:49:05 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2022-10-09 22:15:34 +0200
commit3ba52211293f094e819b0a349129980508f0be57 (patch)
tree081a8905bbdbf96f6fb078260796e6f6080d9efb
parent504a2bc6d9fc3d782d31dfa09688afb0c044a594 (diff)
downloadffmpeg-3ba52211293f094e819b0a349129980508f0be57.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 c775ed1d99..3f8e61c28a 100644
--- a/libavfilter/vf_frei0r.c
+++ b/libavfilter/vf_frei0r.c
@@ -353,14 +353,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],
@@ -369,6 +375,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)
@@ -451,7 +461,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);