Browse Source

avfilter/vf_atadenoise: add planes option

Make possible filtering only some planes.
tags/n3.2
Paul B Mahol 8 years ago
parent
commit
b2c6a11fb6
2 changed files with 18 additions and 0 deletions
  1. +3
    -0
      doc/filters.texi
  2. +15
    -0
      libavfilter/vf_atadenoise.c

+ 3
- 0
doc/filters.texi View File

@@ -4397,6 +4397,9 @@ threshold B is designed to react on continuous changes in the input signal.
@item s @item s
Set number of frames filter will use for averaging. Default is 33. Must be odd Set number of frames filter will use for averaging. Default is 33. Must be odd
number in range [5, 129]. number in range [5, 129].

@item p
Set what planes of frame filter will use for averaging. Default is all.
@end table @end table


@section bbox @section bbox


+ 15
- 0
libavfilter/vf_atadenoise.c View File

@@ -25,6 +25,7 @@
* David Bartovčak and Miroslav Vrankić * David Bartovčak and Miroslav Vrankić
*/ */


#include "libavutil/imgutils.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "avfilter.h" #include "avfilter.h"
@@ -44,6 +45,7 @@ typedef struct ATADenoiseContext {
float fthra[4], fthrb[4]; float fthra[4], fthrb[4];
int thra[4], thrb[4]; int thra[4], thrb[4];


int planes;
int nb_planes; int nb_planes;
int planewidth[4]; int planewidth[4];
int planeheight[4]; int planeheight[4];
@@ -68,6 +70,7 @@ static const AVOption atadenoise_options[] = {
{ "2a", "set threshold A for 3rd plane", OFFSET(fthra[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0, 0.3, FLAGS }, { "2a", "set threshold A for 3rd plane", OFFSET(fthra[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0, 0.3, FLAGS },
{ "2b", "set threshold B for 3rd plane", OFFSET(fthrb[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.04}, 0, 5.0, FLAGS }, { "2b", "set threshold B for 3rd plane", OFFSET(fthrb[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.04}, 0, 5.0, FLAGS },
{ "s", "set how many frames to use", OFFSET(size), AV_OPT_TYPE_INT, {.i64=9}, 5, SIZE, FLAGS }, { "s", "set how many frames to use", OFFSET(size), AV_OPT_TYPE_INT, {.i64=9}, 5, SIZE, FLAGS },
{ "p", "set what planes to filter", OFFSET(planes), AV_OPT_TYPE_FLAGS, {.i64=7}, 0, 15, FLAGS },
{ NULL } { NULL }
}; };


@@ -141,6 +144,12 @@ static int filter_slice8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs
const int *linesize = (const int *)s->linesize[p]; const int *linesize = (const int *)s->linesize[p];
const uint8_t *srcf[SIZE]; const uint8_t *srcf[SIZE];


if (!((1 << p) & s->planes)) {
av_image_copy_plane(dst, out->linesize[p], src, in->linesize[p],
w, slice_end - slice_start);
continue;
}

for (i = 0; i < size; i++) for (i = 0; i < size; i++)
srcf[i] = data[i] + slice_start * linesize[i]; srcf[i] = data[i] + slice_start * linesize[i];


@@ -212,6 +221,12 @@ static int filter_slice16(AVFilterContext *ctx, void *arg, int jobnr, int nb_job
const int *linesize = (const int *)s->linesize[p]; const int *linesize = (const int *)s->linesize[p];
const uint16_t *srcf[SIZE]; const uint16_t *srcf[SIZE];


if (!((1 << p) & s->planes)) {
av_image_copy_plane((uint8_t *)dst, out->linesize[p], (uint8_t *)src, in->linesize[p],
w * 2, slice_end - slice_start);
continue;
}

for (i = 0; i < s->size; i++) for (i = 0; i < s->size; i++)
srcf[i] = (const uint16_t *)(data[i] + slice_start * linesize[i]); srcf[i] = (const uint16_t *)(data[i] + slice_start * linesize[i]);




Loading…
Cancel
Save