avfilter/vf_atadenoise: add planes option

Make possible filtering only some planes.
This commit is contained in:
Paul B Mahol 2016-08-27 13:44:21 +02:00
parent 69abf4f93c
commit b2c6a11fb6
2 changed files with 18 additions and 0 deletions

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

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]);