Commit b2c6a11f authored by Paul B Mahol's avatar Paul B Mahol

avfilter/vf_atadenoise: add planes option

Make possible filtering only some planes.
parent 69abf4f9
...@@ -4397,6 +4397,9 @@ threshold B is designed to react on continuous changes in the input signal. ...@@ -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
......
...@@ -25,6 +25,7 @@ ...@@ -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 { ...@@ -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[] = { ...@@ -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 ...@@ -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 ...@@ -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]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment