diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c index 2e3a024cae..481113d4f1 100644 --- a/libavfilter/vf_hue.c +++ b/libavfilter/vf_hue.c @@ -281,13 +281,19 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) HueContext *hue = inlink->dst->priv; AVFilterLink *outlink = inlink->dst->outputs[0]; AVFrame *outpic; + int direct = 0; + if (av_frame_is_writable(inpic)) { + direct = 1; + outpic = inpic; + } else { outpic = ff_get_video_buffer(outlink, outlink->w, outlink->h); if (!outpic) { av_frame_free(&inpic); return AVERROR(ENOMEM); } av_frame_copy_props(outpic, inpic); + } if (!hue->flat_syntax) { hue->var_values[VAR_T] = TS2T(inpic->pts, inlink->time_base); @@ -321,6 +327,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) hue->var_values[VAR_N] += 1; + if (!direct) av_image_copy_plane(outpic->data[0], outpic->linesize[0], inpic->data[0], inpic->linesize[0], inlink->w, inlink->h); @@ -330,6 +337,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) inlink->w >> hue->hsub, inlink->h >> hue->vsub, hue->hue_cos, hue->hue_sin); + if (!direct) av_frame_free(&inpic); return ff_filter_frame(outlink, outpic); }