38 static inline unsigned int LowPassMul(
unsigned int PrevMul,
unsigned int CurrMul,
int *Coef)
41 int dMul= PrevMul-CurrMul;
42 unsigned int d=((dMul+0x10007FF)>>12);
43 return CurrMul + Coef[d];
47 unsigned char *FrameDest,
48 unsigned short *FrameAnt,
49 int W,
int H,
int sStride,
int dStride,
53 unsigned int PixelDst;
55 for (Y = 0; Y <
H; Y++) {
56 for (X = 0; X <
W; X++) {
57 PixelDst =
LowPassMul(FrameAnt[X]<<8, FrameSrc[X]<<16, Temporal);
58 FrameAnt[X] = ((PixelDst+0x1000007F)>>8);
59 FrameDest[X]= ((PixelDst+0x10007FFF)>>16);
68 unsigned char *FrameDest,
69 unsigned int *LineAnt,
70 int W,
int H,
int sStride,
int dStride,
71 int *Horizontal,
int *Vertical)
74 long sLineOffs = 0, dLineOffs = 0;
75 unsigned int PixelAnt;
76 unsigned int PixelDst;
79 PixelDst = LineAnt[0] = PixelAnt = Frame[0]<<16;
80 FrameDest[0]= ((PixelDst+0x10007FFF)>>16);
83 for (X = 1; X <
W; X++) {
84 PixelDst = LineAnt[X] =
LowPassMul(PixelAnt, Frame[X]<<16, Horizontal);
85 FrameDest[X]= ((PixelDst+0x10007FFF)>>16);
88 for (Y = 1; Y <
H; Y++) {
89 unsigned int PixelAnt;
90 sLineOffs += sStride, dLineOffs += dStride;
92 PixelAnt = Frame[sLineOffs]<<16;
93 PixelDst = LineAnt[0] =
LowPassMul(LineAnt[0], PixelAnt, Vertical);
94 FrameDest[dLineOffs]= ((PixelDst+0x10007FFF)>>16);
96 for (X = 1; X <
W; X++) {
97 unsigned int PixelDst;
99 PixelAnt =
LowPassMul(PixelAnt, Frame[sLineOffs+X]<<16, Horizontal);
100 PixelDst = LineAnt[X] =
LowPassMul(LineAnt[X], PixelAnt, Vertical);
101 FrameDest[dLineOffs+X]= ((PixelDst+0x10007FFF)>>16);
107 unsigned char *FrameDest,
108 unsigned int *LineAnt,
109 unsigned short **FrameAntPtr,
110 int W,
int H,
int sStride,
int dStride,
111 int *Horizontal,
int *Vertical,
int *Temporal)
114 long sLineOffs = 0, dLineOffs = 0;
115 unsigned int PixelAnt;
116 unsigned int PixelDst;
117 unsigned short* FrameAnt=(*FrameAntPtr);
120 (*FrameAntPtr) = FrameAnt =
av_malloc(W*H*
sizeof(
unsigned short));
121 for (Y = 0; Y <
H; Y++) {
122 unsigned short* dst=&FrameAnt[Y*
W];
123 unsigned char* src=Frame+Y*sStride;
124 for (X = 0; X <
W; X++) dst[X]=src[X]<<8;
128 if (!Horizontal[0] && !Vertical[0]) {
130 W, H, sStride, dStride, Temporal);
135 W, H, sStride, dStride, Horizontal, Vertical);
140 LineAnt[0] = PixelAnt = Frame[0]<<16;
141 PixelDst =
LowPassMul(FrameAnt[0]<<8, PixelAnt, Temporal);
142 FrameAnt[0] = ((PixelDst+0x1000007F)>>8);
143 FrameDest[0]= ((PixelDst+0x10007FFF)>>16);
147 for (X = 1; X <
W; X++) {
148 LineAnt[X] = PixelAnt =
LowPassMul(PixelAnt, Frame[X]<<16, Horizontal);
149 PixelDst =
LowPassMul(FrameAnt[X]<<8, PixelAnt, Temporal);
150 FrameAnt[X] = ((PixelDst+0x1000007F)>>8);
151 FrameDest[X]= ((PixelDst+0x10007FFF)>>16);
154 for (Y = 1; Y <
H; Y++) {
155 unsigned int PixelAnt;
156 unsigned short* LinePrev=&FrameAnt[Y*
W];
157 sLineOffs += sStride, dLineOffs += dStride;
159 PixelAnt = Frame[sLineOffs]<<16;
160 LineAnt[0] =
LowPassMul(LineAnt[0], PixelAnt, Vertical);
161 PixelDst =
LowPassMul(LinePrev[0]<<8, LineAnt[0], Temporal);
162 LinePrev[0] = ((PixelDst+0x1000007F)>>8);
163 FrameDest[dLineOffs]= ((PixelDst+0x10007FFF)>>16);
165 for (X = 1; X <
W; X++) {
166 unsigned int PixelDst;
168 PixelAnt =
LowPassMul(PixelAnt, Frame[sLineOffs+X]<<16, Horizontal);
169 LineAnt[X] =
LowPassMul(LineAnt[X], PixelAnt, Vertical);
170 PixelDst =
LowPassMul(LinePrev[X]<<8, LineAnt[X], Temporal);
171 LinePrev[X] = ((PixelDst+0x1000007F)>>8);
172 FrameDest[dLineOffs+X]= ((PixelDst+0x10007FFF)>>16);
180 double Gamma, Simil, C;
182 Gamma = log(0.25) / log(1.0 - Dist25/255.0 - 0.00001);
184 for (i = -255*16; i <= 255*16; i++) {
185 Simil = 1.0 -
FFABS(i) / (16*255.0);
186 C = pow(Simil, Gamma) * 65536.0 * i / 16.0;
187 Ct[16*256+i] =
lrint(C);
193 #define PARAM1_DEFAULT 4.0
194 #define PARAM2_DEFAULT 3.0
195 #define PARAM3_DEFAULT 6.0
200 double LumSpac, LumTmp, ChromSpac, ChromTmp;
201 double Param1, Param2, Param3, Param4;
206 ChromTmp = LumTmp * ChromSpac / LumSpac;
209 switch (sscanf(args,
"%lf:%lf:%lf:%lf",
210 &Param1, &Param2, &Param3, &Param4)) {
215 ChromTmp = LumTmp * ChromSpac / LumSpac;
221 ChromTmp = LumTmp * ChromSpac / LumSpac;
227 ChromTmp = LumTmp * ChromSpac / LumSpac;
239 LumSpac, ChromSpac, LumTmp, ChromTmp);
240 if (LumSpac < 0 || ChromSpac < 0 || isnan(ChromTmp)) {
242 "Invalid negative value for luma or chroma spatial strength, "
243 "or resulting value for chroma temporal strength is nan.\n");
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
unsigned short * Frame[3]
AVFilterBufferRefVideoProps * video
video buffer specific properties
int linesize[8]
number of bytes per line
static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
AVFilterBufferRef * out_buf
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
static void deNoise(unsigned char *Frame, unsigned char *FrameDest, unsigned int *LineAnt, unsigned short **FrameAntPtr, int W, int H, int sStride, int dStride, int *Horizontal, int *Vertical, int *Temporal)
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
void avfilter_end_frame(AVFilterLink *link)
Notifie the next filter that the current frame has finished.
A filter pad used for either input or output.
A link between two filters.
void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void * priv
private data for use by the filter
void av_log(void *avcl, int level, const char *fmt,...)
AVFilterFormats * avfilter_make_format_list(const int *fmts)
Create a list of supported formats.
static int config_input(AVFilterLink *inlink)
const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB]
The array of all the pixel format descriptors.
int w
agreed upon image width
static void end_frame(AVFilterLink *inlink)
static void deNoiseSpacial(unsigned char *Frame, unsigned char *FrameDest, unsigned int *LineAnt, int W, int H, int sStride, int dStride, int *Horizontal, int *Vertical)
void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
Send a slice to the next filter.
int format
agreed upon media format
static unsigned int LowPassMul(unsigned int PrevMul, unsigned int CurrMul, int *Coef)
void avfilter_unref_buffer(AVFilterBufferRef *ref)
Remove a reference to a buffer.
A reference to an AVFilterBuffer.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
static int init(AVFilterContext *ctx, const char *args, void *opaque)
static void uninit(AVFilterContext *ctx)
static av_always_inline av_const long int lrint(double x)
const char * name
filter name
AVFilterLink ** outputs
array of pointers to output links
AVFilter avfilter_vf_hqdn3d
AVFilterContext * dst
dest filter
static void PrecalcCoefs(int *Ct, double Dist25)
uint8_t * data[8]
picture/audio data for each plane
AVFilterBufferRef * cur_buf
static void deNoiseTemporal(unsigned char *FrameSrc, unsigned char *FrameDest, unsigned short *FrameAnt, int W, int H, int sStride, int dStride, int *Temporal)
static int query_formats(AVFilterContext *ctx)