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,
114 static void filter_edges(
void *dst1,
void *prev1,
void *cur1,
void *next1,
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);
194 int refs =
s->cur->linesize[
td->plane];
195 int df = (
s->csp->comp[
td->plane].depth + 7) / 8;
197 int slice_start = (
td->h * jobnr ) / nb_jobs;
205 for (y = slice_start; y <
slice_end; y++) {
206 if ((y ^
td->parity) & 1) {
207 uint8_t *prev = &
s->prev->data[
td->plane][y * refs];
208 uint8_t *cur = &
s->cur ->data[
td->plane][y * refs];
209 uint8_t *next = &
s->next->data[
td->plane][y * refs];
210 uint8_t *dst = &
td->frame->data[
td->plane][y *
td->frame->linesize[
td->plane]];
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,
217 s->filter_edges(dst, prev, cur, next,
td->w,
218 y + 1 <
td->h ? refs : -refs,
222 memcpy(&
td->frame->data[
td->plane][y *
td->frame->linesize[
td->plane]],
223 &
s->cur->data[
td->plane][y * refs],
td->w *
df);
240 if (
i == 1 ||
i == 2) {
298 outlink->
w =
ctx->inputs[0]->w;
299 outlink->
h =
ctx->inputs[0]->h;
305 if (outlink->
w < 3 || outlink->
h < 3) {
312 if (
s->csp->comp[0].depth > 8) {
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.
#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.
const char * av_default_item_name(void *ptr)
Return the context name.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
#define LIBAVUTIL_VERSION_INT
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[]
@ AV_CLASS_CATEGORY_FILTER
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_YUV422P9
#define AV_PIX_FMT_YUV420P12
#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_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_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_GBRP16
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
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 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.
const AVPixFmtDescriptor * csp
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static void filter_edges_16bit(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
static void filter(AVFilterContext *ctx, AVFrame *dstpic, int parity, int tff)
static int query_formats(AVFilterContext *ctx)
static void filter_line_c_16bit(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
#define FILTER(start, end, is_not_edge)
static av_cold void uninit(AVFilterContext *ctx)
static const AVFilterPad avfilter_vf_yadif_outputs[]
static int config_output(AVFilterLink *outlink)
static const AVFilterPad avfilter_vf_yadif_inputs[]
static void filter_edges(void *dst1, void *prev1, void *cur1, void *next1, int w, int prefs, int mrefs, int parity, int mode)
static const AVClass yadif_class
av_cold void ff_yadif_init_x86(YADIFContext *yadif)
int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame)
int ff_yadif_request_frame(AVFilterLink *link)
const AVOption ff_yadif_options[]