48 static const uint16_t
coef_lf[2] = { 4309, 213 };
49 static const uint16_t
coef_hf[3] = { 5570, 3801, 1016 };
50 static const uint16_t
coef_sp[2] = { 5077, 981 };
60 #define FILTER_INTRA() \
61 for (x = 0; x < w; x++) { \
62 interpol = (coef_sp[0] * (cur[mrefs] + cur[prefs]) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \
63 dst[0] = av_clip(interpol, 0, clip_max); \
70 for (x = 0; x < w; x++) { \
72 int d = (prev2[0] + next2[0]) >> 1; \
74 int temporal_diff0 = FFABS(prev2[0] - next2[0]); \
75 int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e)) >> 1; \
76 int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e)) >> 1; \
77 int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \
83 #define SPAT_CHECK() \
84 int b = ((prev2[mrefs2] + next2[mrefs2]) >> 1) - c; \
85 int f = ((prev2[prefs2] + next2[prefs2]) >> 1) - e; \
88 int max = FFMAX3(de, dc, FFMIN(b, f)); \
89 int min = FFMIN3(de, dc, FFMAX(b, f)); \
90 diff = FFMAX3(diff, min, -max);
92 #define FILTER_LINE() \
94 if (FFABS(c - e) > temporal_diff0) { \
95 interpol = (((coef_hf[0] * (prev2[0] + next2[0]) \
96 - coef_hf[1] * (prev2[mrefs2] + next2[mrefs2] + prev2[prefs2] + next2[prefs2]) \
97 + coef_hf[2] * (prev2[mrefs4] + next2[mrefs4] + prev2[prefs4] + next2[prefs4])) >> 2) \
98 + coef_lf[0] * (c + e) - coef_lf[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \
100 interpol = (coef_sp[0] * (c + e) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \
103 #define FILTER_EDGE() \
107 interpol = (c + e) >> 1;
110 if (interpol > d + diff) \
111 interpol = d + diff; \
112 else if (interpol < d - diff) \
113 interpol = d - diff; \
115 dst[0] = av_clip(interpol, 0, clip_max); \
126 static void filter_intra(
void *dst1,
void *cur1,
int w,
int prefs,
int mrefs,
127 int prefs3,
int mrefs3,
int parity,
int clip_max)
137 int w,
int prefs,
int mrefs,
int prefs2,
int mrefs2,
138 int prefs3,
int mrefs3,
int prefs4,
int mrefs4,
154 static void filter_edge(
void *dst1,
void *prev1,
void *cur1,
void *next1,
155 int w,
int prefs,
int mrefs,
int prefs2,
int mrefs2,
156 int parity,
int clip_max,
int spat)
172 int prefs3,
int mrefs3,
int parity,
int clip_max)
174 uint16_t *dst = dst1;
175 uint16_t *cur = cur1;
182 int w,
int prefs,
int mrefs,
int prefs2,
int mrefs2,
183 int prefs3,
int mrefs3,
int prefs4,
int mrefs4,
186 uint16_t *dst = dst1;
187 uint16_t *prev = prev1;
188 uint16_t *cur = cur1;
189 uint16_t *next = next1;
190 uint16_t *prev2 =
parity ? prev : cur ;
191 uint16_t *next2 =
parity ? cur : next;
200 int w,
int prefs,
int mrefs,
int prefs2,
int mrefs2,
201 int parity,
int clip_max,
int spat)
203 uint16_t *dst = dst1;
204 uint16_t *prev = prev1;
205 uint16_t *cur = cur1;
206 uint16_t *next = next1;
207 uint16_t *prev2 =
parity ? prev : cur ;
208 uint16_t *next2 =
parity ? cur : next;
224 int refs = linesize /
df;
225 int slice_start = (
td->h * jobnr ) / nb_jobs;
229 for (y = slice_start; y <
slice_end; y++) {
230 if ((y ^
td->parity) & 1) {
234 uint8_t *dst = &
td->frame->data[
td->plane][y *
td->frame->linesize[
td->plane]];
236 s->filter_intra(dst, cur,
td->w, (y +
df) <
td->h ? refs : -refs,
237 y > (
df - 1) ? -refs : refs,
238 (y + 3*
df) <
td->h ? 3 * refs : -refs,
239 y > (3*
df - 1) ? -3 * refs : refs,
240 td->parity ^
td->tff, clip_max);
241 }
else if ((y < 4) || ((y + 5) >
td->h)) {
242 s->filter_edge(dst, prev, cur, next,
td->w,
243 (y +
df) <
td->h ? refs : -refs,
244 y > (
df - 1) ? -refs : refs,
245 refs << 1, -(refs << 1),
246 td->parity ^
td->tff, clip_max,
247 (y < 2) || ((y + 3) >
td->h) ? 0 : 1);
249 s->filter_line(dst, prev, cur, next,
td->w,
250 refs, -refs, refs << 1, -(refs << 1),
251 3 * refs, -3 * refs, refs << 2, -(refs << 2),
252 td->parity ^
td->tff, clip_max);
255 memcpy(&
td->frame->data[
td->plane][y *
td->frame->linesize[
td->plane]],
274 if (
i == 1 ||
i == 2) {
371 #define OFFSET(x) offsetof(YADIFContext, x)
372 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
374 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
418 .priv_class = &bwdif_class,
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
simple assert() macros that are a bit more flexible than ISO C assert().
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
void ff_bwdif_init_x86(BWDIFContext *bwdif)
#define flags(name, subs,...)
common internal and external API header
#define AV_CEIL_RSHIFT(a, b)
mode
Use these values in ebur128_init (or'ed).
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will have its filter_frame() c...
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUV420P14
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
#define AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
int depth
Number of bits in the component.
AVFilterLink ** inputs
array of pointers to input links
void * priv
private data for use by the filter
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable; if left to 0/0,...
int format
agreed upon media format
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
AVFormatInternal * internal
An opaque field for libavformat internal usage.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
uint8_t nb_components
The number of components each pixel has, (1-4)
Rational number (pair of numerator and denominator).
Used for passing data between threads.
void(* filter)(AVFilterContext *ctx, AVFrame *dstpic, int parity, int tff)
int current_field
YADIFCurrentField.
const AVPixFmtDescriptor * csp
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static void filter_edge(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int prefs2, int mrefs2, int parity, int clip_max, int spat)
static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int prefs2, int mrefs2, int prefs3, int mrefs3, int prefs4, int mrefs4, int parity, int clip_max)
static const AVFilterPad avfilter_vf_bwdif_outputs[]
static void filter_line_c_16bit(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int prefs2, int mrefs2, int prefs3, int mrefs3, int prefs4, int mrefs4, int parity, int clip_max)
static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, int prefs3, int mrefs3, int parity, int clip_max)
static const uint16_t coef_hf[3]
static void filter(AVFilterContext *ctx, AVFrame *dstpic, int parity, int tff)
#define CONST(name, help, val, unit)
static int query_formats(AVFilterContext *ctx)
static const uint16_t coef_sp[2]
static const AVOption bwdif_options[]
static const AVFilterPad avfilter_vf_bwdif_inputs[]
static void filter_intra_16bit(void *dst1, void *cur1, int w, int prefs, int mrefs, int prefs3, int mrefs3, int parity, int clip_max)
static av_cold void uninit(AVFilterContext *ctx)
AVFILTER_DEFINE_CLASS(bwdif)
static const uint16_t coef_lf[2]
static void filter_edge_16bit(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int prefs2, int mrefs2, int parity, int clip_max, int spat)
static int config_props(AVFilterLink *link)
static int interpol(MBContext *s, uint32_t *color, int x, int y, int linesize)
@ YADIF_DEINT_INTERLACED
only deinterlace frames marked as interlaced
@ YADIF_DEINT_ALL
deinterlace all frames
@ YADIF_PARITY_TFF
top field first
@ YADIF_PARITY_BFF
bottom field first
@ YADIF_PARITY_AUTO
auto detection
@ YADIF_FIELD_NORMAL
A normal field in the middle of a sequence.
@ YADIF_FIELD_END
The first or last field in a sequence.
int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame)
@ YADIF_MODE_SEND_FIELD
send 1 frame for each field
@ YADIF_MODE_SEND_FRAME
send 1 frame for each frame
int ff_yadif_request_frame(AVFilterLink *link)