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;
226 int slice_end = (td->
h * (jobnr+1)) / nb_jobs;
229 for (y = slice_start; y <
slice_end; y++) {
230 if ((y ^ td->
parity) & 1) {
237 y > (df - 1) ? -refs : refs,
238 (y + 3*df) < td->
h ? 3 * refs : -refs,
239 y > (3*df - 1) ? -3 * refs : refs,
241 }
else if ((y < 4) || ((y + 5) > td->
h)) {
243 (y + df) < td->
h ? refs : -refs,
244 y > (df - 1) ? -refs : refs,
245 refs << 1, -(refs << 1),
247 (y < 2) || ((y + 3) > td->
h) ? 0 : 1);
250 refs, -refs, refs << 1, -(refs << 1),
251 3 * refs, -3 * refs, refs << 2, -(refs << 2),
274 if (i == 1 || i == 2) {
346 if (link->
w < 3 || link->
h < 3) {
347 av_log(ctx,
AV_LOG_ERROR,
"Video of less than 3 columns or lines is not supported\n");
370 #define OFFSET(x) offsetof(YADIFContext, x) 371 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM 373 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit } 417 .priv_class = &bwdif_class,
420 .
inputs = avfilter_vf_bwdif_inputs,
421 .
outputs = avfilter_vf_bwdif_outputs,
static const uint16_t coef_sp[2]
#define AV_PIX_FMT_YUVA422P16
static av_cold void uninit(AVFilterContext *ctx)
void(* filter_edge)(void *dst, void *prev, void *cur, void *next, int w, int prefs, int mrefs, int prefs2, int mrefs2, int parity, int clip_max, int spat)
#define AV_PIX_FMT_YUVA422P9
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
static const uint16_t coef_lf[2]
This structure describes decoded (raw) audio or video data.
#define AV_PIX_FMT_YUVA420P10
#define CONST(name, help, val, unit)
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUVA422P10
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Main libavfilter public API header.
void ff_bwdif_init_x86(BWDIFContext *bwdif)
int h
agreed upon image height
void(* filter)(AVFilterContext *ctx, AVFrame *dstpic, int parity, int tff)
int ff_yadif_request_frame(AVFilterLink *link)
#define AV_PIX_FMT_GBRP10
static int interpol(MBContext *s, uint32_t *color, int x, int y, int linesize)
#define AV_PIX_FMT_YUV420P12
A normal field in the middle of a sequence.
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
int current_field
YADIFCurrentField.
const char * name
Pad name.
AVFilterLink ** inputs
array of pointers to input links
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.
void(* filter_line)(void *dst, void *prev, void *cur, void *next, int w, int prefs, int mrefs, int prefs2, int mrefs2, int prefs3, int mrefs3, int prefs4, int mrefs4, int parity, int clip_max)
#define AV_PIX_FMT_YUVA420P9
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range...
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
#define AV_PIX_FMT_YUV444P16
send 1 frame for each field
#define AV_PIX_FMT_YUV422P12
static void filter(AVFilterContext *ctx, AVFrame *dstpic, int parity, int tff)
#define AV_PIX_FMT_YUVA420P16
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 i(width, name, range_min, range_max)
#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.
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)
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...
#define AV_PIX_FMT_YUVA444P16
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
#define AV_PIX_FMT_GBRAP16
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
int w
agreed upon image width
#define AV_PIX_FMT_YUV422P9
static void filter_intra_16bit(void *dst1, void *cur1, int w, int prefs, int mrefs, int prefs3, int mrefs3, int parity, int clip_max)
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...
AVFILTER_DEFINE_CLASS(bwdif)
static const uint16_t coef_hf[3]
AVFilterContext * src
source filter
#define AV_PIX_FMT_YUVA444P10
static const AVFilterPad inputs[]
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_GBRP14
static const AVFilterPad outputs[]
int format
agreed upon media format
#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.
static int config_props(AVFilterLink *link)
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)
Rational number (pair of numerator and denominator).
int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame)
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)
The first or last field in a sequence.
const char * name
Filter name.
#define AV_PIX_FMT_YUV420P9
static const AVFilterPad avfilter_vf_bwdif_inputs[]
#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[]
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)
#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
static const AVOption bwdif_options[]
#define AV_PIX_FMT_YUV444P12
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
const AVPixFmtDescriptor * csp
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 int query_formats(AVFilterContext *ctx)
#define AV_PIX_FMT_YUVA444P9
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.
send 1 frame for each frame
static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, int prefs3, int mrefs3, int parity, int clip_max)
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
static const AVFilterPad avfilter_vf_bwdif_outputs[]
int depth
Number of bits in the component.
only deinterlace frames marked as interlaced
AVPixelFormat
Pixel format.
mode
Use these values in ebur128_init (or'ed).
#define AV_PIX_FMT_YUV422P16
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)
void(* filter_intra)(void *dst1, void *cur1, int w, int prefs, int mrefs, int prefs3, int mrefs3, int parity, int clip_max)
#define AV_CEIL_RSHIFT(a, b)