41     {   int score = FFABS(cur[mrefs - 1 + (j)] - cur[prefs - 1 - (j)])\ 
   42                   + FFABS(cur[mrefs  +(j)] - cur[prefs  -(j)])\ 
   43                   + FFABS(cur[mrefs + 1 + (j)] - cur[prefs + 1 - (j)]);\ 
   44         if (score < spatial_score) {\ 
   45             spatial_score= score;\ 
   46             spatial_pred= (cur[mrefs  +(j)] + cur[prefs  -(j)])>>1;\ 
   51 #define FILTER(start, end, is_not_edge) \ 
   52     for (x = start;  x < end; x++) { \ 
   54         int d = (prev2[0] + next2[0])>>1; \ 
   56         int temporal_diff0 = FFABS(prev2[0] - next2[0]); \ 
   57         int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e) )>>1; \ 
   58         int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e) )>>1; \ 
   59         int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \ 
   60         int spatial_pred = (c+e) >> 1; \ 
   63             int spatial_score = FFABS(cur[mrefs - 1] - cur[prefs - 1]) + FFABS(c-e) \ 
   64                               + FFABS(cur[mrefs + 1] - cur[prefs + 1]) - 1; \ 
   65             CHECK(-1) CHECK(-2) }} }} \ 
   66             CHECK( 1) CHECK( 2) }} }} \ 
   70             int b = (prev2[2 * mrefs] + next2[2 * mrefs])>>1; \ 
   71             int f = (prev2[2 * prefs] + next2[2 * prefs])>>1; \ 
   72             int max = FFMAX3(d - e, d - c, FFMIN(b - c, f - e)); \ 
   73             int min = FFMIN3(d - e, d - c, FFMAX(b - c, f - e)); \ 
   75             diff = FFMAX3(diff, min, -max); \ 
   78         if (spatial_pred > d + diff) \ 
   79            spatial_pred = d + diff; \ 
   80         else if (spatial_pred < d - diff) \ 
   81            spatial_pred = d - diff; \ 
   83         dst[0] = spatial_pred; \ 
   94                           void *prev1, 
void *cur1, 
void *next1,
 
   95                           int w, 
int prefs, 
int mrefs, 
int parity, 
int mode)
 
  102     uint8_t *prev2 = parity ? prev : cur ;
 
  103     uint8_t *next2 = parity ? cur  : next;
 
  113 static void filter_edges(
void *dst1, 
void *prev1, 
void *cur1, 
void *next1,
 
  114                          int w, 
int prefs, 
int mrefs, 
int parity, 
int mode)
 
  121     uint8_t *prev2 = parity ? prev : cur ;
 
  122     uint8_t *next2 = parity ? cur  : next;
 
  132     prev2 = (
uint8_t*)(parity ? prev : cur);
 
  133     next2 = (
uint8_t*)(parity ? cur  : next);
 
  141                                 void *prev1, 
void *cur1, 
void *next1,
 
  142                                 int w, 
int prefs, 
int mrefs, 
int parity,
 
  145     uint16_t *dst  = dst1;
 
  146     uint16_t *prev = prev1;
 
  147     uint16_t *cur  = cur1;
 
  148     uint16_t *next = next1;
 
  150     uint16_t *prev2 = parity ? prev : cur ;
 
  151     uint16_t *next2 = parity ? cur  : next;
 
  159                                int w, 
int prefs, 
int mrefs, 
int parity, 
int mode)
 
  161     uint16_t *dst  = dst1;
 
  162     uint16_t *prev = prev1;
 
  163     uint16_t *cur  = cur1;
 
  164     uint16_t *next = next1;
 
  166     uint16_t *prev2 = parity ? prev : cur ;
 
  167     uint16_t *next2 = parity ? cur  : next;
 
  173     dst   = (uint16_t*)dst1  + w - (
MAX_ALIGN/2-1);
 
  174     prev  = (uint16_t*)prev1 + w - (
MAX_ALIGN/2-1);
 
  175     cur   = (uint16_t*)cur1  + w - (
MAX_ALIGN/2-1);
 
  176     next  = (uint16_t*)next1 + w - (
MAX_ALIGN/2-1);
 
  177     prev2 = (uint16_t*)(parity ? prev : cur);
 
  178     next2 = (uint16_t*)(parity ? cur  : next);
 
  191     int slice_start = (td->
h *  jobnr   ) / nb_jobs;
 
  192     int slice_end   = (td->
h * (jobnr+1)) / nb_jobs;
 
  198     for (y = slice_start; y < 
slice_end; y++) {
 
  199         if ((y ^ td->
parity) & 1) {
 
  204             int     mode  = y == 1 || y + 2 == td->
h ? 2 : s->
mode;
 
  205             s->
filter_line(dst + pix_3, prev + pix_3, cur + pix_3,
 
  207                            y + 1 < td->
h ? refs : -refs,
 
  211                             y + 1 < td->
h ? refs : -refs,
 
  230         int w = dstpic->
width;
 
  233         if (i == 1 || i == 2) {
 
  255     if (yadif->
parity == -1) {
 
  271     filter(ctx, yadif->
out, tff ^ !is_second, tff);
 
  274         int64_t cur_pts  = yadif->
cur->
pts;
 
  275         int64_t next_pts = yadif->
next->
pts;
 
  278             yadif->
out->
pts = cur_pts + next_pts;
 
  400         } 
else if (ret < 0) {
 
  403     } 
while (!yadif->
cur);
 
  473     if (link->w < 3 || link->h < 3) {
 
  474         av_log(ctx, 
AV_LOG_ERROR, 
"Video of less than 3 columns or lines is not supported\n");
 
  479     if (
s->csp->comp[0].depth_minus1 / 8 == 1) {
 
  494 #define OFFSET(x) offsetof(YADIFContext, x) 
  495 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM 
  497 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit } 
  543     .priv_class    = &yadif_class,
 
  546     .
inputs        = avfilter_vf_yadif_inputs,
 
  547     .
outputs       = avfilter_vf_yadif_outputs,