42 { int score = FFABS(cur[mrefs - 1 + (j)] - cur[prefs - 1 - (j)])\
43 + FFABS(cur[mrefs +(j)] - cur[prefs -(j)])\
44 + FFABS(cur[mrefs + 1 + (j)] - cur[prefs + 1 - (j)]);\
45 if (score < spatial_score) {\
46 spatial_score= score;\
47 spatial_pred= (cur[mrefs +(j)] + cur[prefs -(j)])>>1;\
52 #define FILTER(start, end, is_not_edge) \
53 for (x = start; x < end; x++) { \
55 int d = (prev2[0] + next2[0])>>1; \
57 int temporal_diff0 = FFABS(prev2[0] - next2[0]); \
58 int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e) )>>1; \
59 int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e) )>>1; \
60 int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \
61 int spatial_pred = (c+e) >> 1; \
64 int spatial_score = FFABS(cur[mrefs - 1] - cur[prefs - 1]) + FFABS(c-e) \
65 + FFABS(cur[mrefs + 1] - cur[prefs + 1]) - 1; \
66 CHECK(-1) CHECK(-2) }} }} \
67 CHECK( 1) CHECK( 2) }} }} \
71 int b = (prev2[2 * mrefs] + next2[2 * mrefs])>>1; \
72 int f = (prev2[2 * prefs] + next2[2 * prefs])>>1; \
73 int max = FFMAX3(d - e, d - c, FFMIN(b - c, f - e)); \
74 int min = FFMIN3(d - e, d - c, FFMAX(b - c, f - e)); \
76 diff = FFMAX3(diff, min, -max); \
79 if (spatial_pred > d + diff) \
80 spatial_pred = d + diff; \
81 else if (spatial_pred < d - diff) \
82 spatial_pred = d - diff; \
84 dst[0] = spatial_pred; \
95 void *prev1,
void *cur1,
void *next1,
103 uint8_t *prev2 = parity ? prev : cur ;
104 uint8_t *next2 = parity ? cur : next;
114 static void filter_edges(
void *dst1,
void *prev1,
void *cur1,
void *next1,
122 uint8_t *prev2 = parity ? prev : cur ;
123 uint8_t *next2 = parity ? cur : next;
131 dst = (
uint8_t*)dst1 + w - edge;
132 prev = (
uint8_t*)prev1 + w - edge;
133 cur = (
uint8_t*)cur1 + w - edge;
134 next = (
uint8_t*)next1 + w - edge;
135 prev2 = (
uint8_t*)(parity ? prev : cur);
136 next2 = (
uint8_t*)(parity ? cur : next);
138 FILTER(w - edge, w - 3, 1)
144 void *prev1,
void *cur1,
void *next1,
145 int w,
int prefs,
int mrefs,
int parity,
148 uint16_t *dst = dst1;
149 uint16_t *prev = prev1;
150 uint16_t *cur = cur1;
151 uint16_t *next = next1;
153 uint16_t *prev2 = parity ? prev : cur ;
154 uint16_t *next2 = parity ? cur : next;
164 uint16_t *dst = dst1;
165 uint16_t *prev = prev1;
166 uint16_t *cur = cur1;
167 uint16_t *next = next1;
169 uint16_t *prev2 = parity ? prev : cur ;
170 uint16_t *next2 = parity ? cur : next;
179 dst = (uint16_t*)dst1 + w - edge;
180 prev = (uint16_t*)prev1 + w - edge;
181 cur = (uint16_t*)cur1 + w - edge;
182 next = (uint16_t*)next1 + w - edge;
183 prev2 = (uint16_t*)(parity ? prev : cur);
184 next2 = (uint16_t*)(parity ? cur : next);
186 FILTER(w - edge, w - 3, 1)
197 int slice_start = (td->
h * jobnr ) / nb_jobs;
198 int slice_end = (td->
h * (jobnr+1)) / nb_jobs;
205 for (y = slice_start; y <
slice_end; y++) {
206 if ((y ^ td->
parity) & 1) {
211 int mode = y == 1 || y + 2 == td->
h ? 2 : s->
mode;
212 s->
filter_line(dst + pix_3, prev + pix_3, cur + pix_3,
213 next + pix_3, td->
w - edge,
214 y + 1 < td->
h ? refs : -refs,
218 y + 1 < td->
h ? refs : -refs,
240 if (i == 1 || i == 2) {
328 if (link->w < 3 || link->h < 3) {
335 if (
s->csp->comp[0].depth > 8) {
381 .priv_class = &yadif_class,
384 .
inputs = avfilter_vf_yadif_inputs,
385 .
outputs = avfilter_vf_yadif_outputs,
void(* filter_edges)(void *dst, void *prev, void *cur, void *next, int w, int prefs, int mrefs, int parity, int mode)
static const AVFilterPad avfilter_vf_yadif_inputs[]
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
This structure describes decoded (raw) audio or video data.
#define AV_PIX_FMT_YUV444P14
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
#define LIBAVUTIL_VERSION_INT
Main libavfilter public API header.
int h
agreed upon image height
int ff_yadif_request_frame(AVFilterLink *link)
#define AV_PIX_FMT_GBRP10
const char * av_default_item_name(void *ptr)
Return the context name.
static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
#define AV_PIX_FMT_YUV420P12
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
const char * name
Pad name.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
AVFilterLink ** inputs
array of pointers to input links
static const AVClass yadif_class
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range...
void(* filter_line)(void *dst, void *prev, void *cur, void *next, int w, int prefs, int mrefs, int parity, int mode)
Required alignment for filter_line.
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
static void filter(AVFilterContext *ctx, AVFrame *dstpic, int parity, int tff)
static void filter_edges(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV422P12
A filter pad used for either input or output.
A link between two filters.
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable; if left to 0/0, will be automatically copied from the first input of the source filter if it exists.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#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
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link...
simple assert() macros that are a bit more flexible than ISO C assert().
#define AV_PIX_FMT_YUV444P10
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static int query_formats(AVFilterContext *ctx)
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
static const AVFilterPad avfilter_vf_yadif_outputs[]
int w
agreed upon image width
#define AV_PIX_FMT_YUV422P9
uint8_t nb_components
The number of components each pixel has, (1-4)
#define AV_PIX_FMT_GBRP16
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
#define AV_PIX_FMT_GRAY16
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
static int config_props(AVFilterLink *link)
AVFilterContext * src
source filter
static const AVFilterPad inputs[]
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_GBRP14
static const AVFilterPad outputs[]
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P14
Used for passing data between threads.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
#define AV_PIX_FMT_YUV420P10
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Describe the class of an AVClass context structure.
Rational number (pair of numerator and denominator).
int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame)
const char * name
Filter name.
#define AV_PIX_FMT_YUV420P9
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will have its filter_frame() c...
static enum AVPixelFormat pix_fmts[]
#define AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_GBRP12
#define flags(name, subs,...)
AVFilterInternal * internal
An opaque struct for libavfilter internal use.
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV444P12
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
const AVPixFmtDescriptor * csp
#define FILTER(start, end, is_not_edge)
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal and external API header
planar GBRA 4:4:4:4 32bpp
static void filter_edges_16bit(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
const AVOption ff_yadif_options[]
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
avfilter_execute_func * execute
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
static av_cold void uninit(AVFilterContext *ctx)
av_cold void ff_yadif_init_x86(YADIFContext *yadif)
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
int depth
Number of bits in the component.
AVPixelFormat
Pixel format.
mode
Use these values in ebur128_init (or'ed).
#define AV_PIX_FMT_YUV422P16
static void filter_line_c_16bit(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
#define AV_CEIL_RSHIFT(a, b)