- int cw = inpic->video->w >> hqdn3d->hsub;
- int ch = inpic->video->h >> hqdn3d->vsub;
-
- deNoise(inpic->data[0], outpic->data[0],
- hqdn3d->Line, &hqdn3d->Frame[0], inpic->video->w, inpic->video->h,
- inpic->linesize[0], outpic->linesize[0],
- hqdn3d->Coefs[0],
- hqdn3d->Coefs[0],
- hqdn3d->Coefs[1]);
- deNoise(inpic->data[1], outpic->data[1],
- hqdn3d->Line, &hqdn3d->Frame[1], cw, ch,
- inpic->linesize[1], outpic->linesize[1],
- hqdn3d->Coefs[2],
- hqdn3d->Coefs[2],
- hqdn3d->Coefs[3]);
- deNoise(inpic->data[2], outpic->data[2],
- hqdn3d->Line, &hqdn3d->Frame[2], cw, ch,
- inpic->linesize[2], outpic->linesize[2],
- hqdn3d->Coefs[2],
- hqdn3d->Coefs[2],
- hqdn3d->Coefs[3]);
-
- ff_draw_slice(outlink, 0, inpic->video->h, 1);
- ff_end_frame(outlink);
- avfilter_unref_buffer(inpic);
- avfilter_unref_buffer(outpic);
+ int ret, c;
+
+ for (c = 0; c < 3; c++) {
+ denoise(inpic->data[c], outpic->data[c],
+ hqdn3d->line, &hqdn3d->frame_prev[c],
+ inpic->video->w >> (!!c * hqdn3d->hsub),
+ inpic->video->h >> (!!c * hqdn3d->vsub),
+ inpic->linesize[c], outpic->linesize[c],
+ hqdn3d->coefs[c?2:0], hqdn3d->coefs[c?3:1]);
+ }
+
+ if ((ret = ff_draw_slice(outlink, 0, inpic->video->h, 1)) < 0 ||
+ (ret = ff_end_frame(outlink)) < 0)
+ return ret;
+ return 0;