|
|
|
@@ -222,7 +222,6 @@ static void filter(OWDenoiseContext *s, |
|
|
|
|
|
|
|
static int filter_frame(AVFilterLink *inlink, AVFrame *in) |
|
|
|
{ |
|
|
|
int direct = 0; |
|
|
|
AVFilterContext *ctx = inlink->dst; |
|
|
|
OWDenoiseContext *s = ctx->priv; |
|
|
|
AVFilterLink *outlink = ctx->outputs[0]; |
|
|
|
@@ -231,8 +230,14 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) |
|
|
|
const int ch = AV_CEIL_RSHIFT(inlink->h, s->vsub); |
|
|
|
|
|
|
|
if (av_frame_is_writable(in)) { |
|
|
|
direct = 1; |
|
|
|
out = in; |
|
|
|
|
|
|
|
if (s->luma_strength > 0) |
|
|
|
filter(s, out->data[0], out->linesize[0], in->data[0], in->linesize[0], inlink->w, inlink->h, s->luma_strength); |
|
|
|
if (s->chroma_strength > 0) { |
|
|
|
filter(s, out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, s->chroma_strength); |
|
|
|
filter(s, out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, s->chroma_strength); |
|
|
|
} |
|
|
|
} else { |
|
|
|
out = ff_get_video_buffer(outlink, outlink->w, outlink->h); |
|
|
|
if (!out) { |
|
|
|
@@ -240,13 +245,20 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} |
|
|
|
av_frame_copy_props(out, in); |
|
|
|
} |
|
|
|
|
|
|
|
filter(s, out->data[0], out->linesize[0], in->data[0], in->linesize[0], inlink->w, inlink->h, s->luma_strength); |
|
|
|
filter(s, out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, s->chroma_strength); |
|
|
|
filter(s, out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, s->chroma_strength); |
|
|
|
if (s->luma_strength > 0) { |
|
|
|
filter(s, out->data[0], out->linesize[0], in->data[0], in->linesize[0], inlink->w, inlink->h, s->luma_strength); |
|
|
|
} else { |
|
|
|
av_image_copy_plane(out->data[0], out->linesize[0], in ->data[0], in ->linesize[0], inlink->w, inlink->h); |
|
|
|
} |
|
|
|
if (s->chroma_strength > 0) { |
|
|
|
filter(s, out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, s->chroma_strength); |
|
|
|
filter(s, out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, s->chroma_strength); |
|
|
|
} else { |
|
|
|
av_image_copy_plane(out->data[1], out->linesize[1], in ->data[1], in ->linesize[1], inlink->w, inlink->h); |
|
|
|
av_image_copy_plane(out->data[2], out->linesize[2], in ->data[2], in ->linesize[2], inlink->w, inlink->h); |
|
|
|
} |
|
|
|
|
|
|
|
if (!direct) { |
|
|
|
if (in->data[3]) |
|
|
|
av_image_copy_plane(out->data[3], out->linesize[3], |
|
|
|
in ->data[3], in ->linesize[3], |
|
|
|
|