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 d353909e77)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Michael Niedermayer 2022-04-11 13:49:05 +02:00
parent ddc96fdb43
commit 54c4f1e32b
No known key found for this signature in database
GPG Key ID: B18E8928B3948D64
1 changed files with 17 additions and 7 deletions

View File

@ -353,15 +353,21 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{ {
Frei0rContext *s = inlink->dst->priv; Frei0rContext *s = inlink->dst->priv;
AVFilterLink *outlink = inlink->dst->outputs[0]; 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_free(&in);
return AVERROR(ENOMEM);
}
av_frame_copy_props(out, in); 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);
in = in2;
}
s->update(s->instance, in->pts * av_q2d(inlink->time_base) * 1000, s->update(s->instance, in->pts * av_q2d(inlink->time_base) * 1000,
(const uint32_t *)in->data[0], (const uint32_t *)in->data[0],
(uint32_t *)out->data[0]); (uint32_t *)out->data[0]);
@ -369,6 +375,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
av_frame_free(&in); av_frame_free(&in);
return ff_filter_frame(outlink, out); return ff_filter_frame(outlink, out);
fail:
av_frame_free(&in);
av_frame_free(&out);
return AVERROR(ENOMEM);
} }
#define OFFSET(x) offsetof(Frei0rContext, x) #define OFFSET(x) offsetof(Frei0rContext, x)
@ -451,7 +461,7 @@ static int source_config_props(AVFilterLink *outlink)
static int source_request_frame(AVFilterLink *outlink) static int source_request_frame(AVFilterLink *outlink)
{ {
Frei0rContext *s = outlink->src->priv; 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) if (!frame)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);