|
|
|
@ -50,42 +50,42 @@ typedef struct { |
|
|
|
|
AVFilterBufferRef *out; |
|
|
|
|
void (*filter_line)(uint8_t *dst, |
|
|
|
|
uint8_t *prev, uint8_t *cur, uint8_t *next, |
|
|
|
|
int w, int refs, int parity, int mode); |
|
|
|
|
int w, int prefs, int mrefs, int parity, int mode); |
|
|
|
|
} YADIFContext; |
|
|
|
|
|
|
|
|
|
static void filter_line_c(uint8_t *dst, |
|
|
|
|
uint8_t *prev, uint8_t *cur, uint8_t *next, |
|
|
|
|
int w, int refs, int parity, int mode) |
|
|
|
|
int w, int prefs, int mrefs, int parity, int mode) |
|
|
|
|
{ |
|
|
|
|
int x; |
|
|
|
|
uint8_t *prev2 = parity ? prev : cur ; |
|
|
|
|
uint8_t *next2 = parity ? cur : next; |
|
|
|
|
for (x = 0; x < w; x++) { |
|
|
|
|
int c = cur[-refs]; |
|
|
|
|
int c = cur[mrefs]; |
|
|
|
|
int d = (prev2[0] + next2[0])>>1; |
|
|
|
|
int e = cur[+refs]; |
|
|
|
|
int e = cur[prefs]; |
|
|
|
|
int temporal_diff0 = FFABS(prev2[0] - next2[0]); |
|
|
|
|
int temporal_diff1 =(FFABS(prev[-refs] - c) + FFABS(prev[+refs] - e) )>>1; |
|
|
|
|
int temporal_diff2 =(FFABS(next[-refs] - c) + FFABS(next[+refs] - e) )>>1; |
|
|
|
|
int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e) )>>1; |
|
|
|
|
int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e) )>>1; |
|
|
|
|
int diff = FFMAX3(temporal_diff0>>1, temporal_diff1, temporal_diff2); |
|
|
|
|
int spatial_pred = (c+e)>>1; |
|
|
|
|
int spatial_score = FFABS(cur[-refs-1] - cur[+refs-1]) + FFABS(c-e) |
|
|
|
|
+ FFABS(cur[-refs+1] - cur[+refs+1]) - 1; |
|
|
|
|
int spatial_score = FFABS(cur[mrefs-1] - cur[prefs-1]) + FFABS(c-e) |
|
|
|
|
+ FFABS(cur[mrefs+1] - cur[prefs+1]) - 1; |
|
|
|
|
|
|
|
|
|
#define CHECK(j)\ |
|
|
|
|
{ int score = FFABS(cur[-refs-1+(j)] - cur[+refs-1-(j)])\
|
|
|
|
|
+ FFABS(cur[-refs +(j)] - cur[+refs -(j)])\
|
|
|
|
|
+ FFABS(cur[-refs+1+(j)] - cur[+refs+1-(j)]);\
|
|
|
|
|
{ int score = FFABS(cur[mrefs-1+(j)] - cur[prefs-1-(j)])\
|
|
|
|
|
+ FFABS(cur[mrefs +(j)] - cur[prefs -(j)])\
|
|
|
|
|
+ FFABS(cur[mrefs+1+(j)] - cur[prefs+1-(j)]);\
|
|
|
|
|
if (score < spatial_score) {\
|
|
|
|
|
spatial_score= score;\
|
|
|
|
|
spatial_pred= (cur[-refs +(j)] + cur[+refs -(j)])>>1;\
|
|
|
|
|
spatial_pred= (cur[mrefs +(j)] + cur[prefs -(j)])>>1;\
|
|
|
|
|
|
|
|
|
|
CHECK(-1) CHECK(-2) }} }} |
|
|
|
|
CHECK( 1) CHECK( 2) }} }} |
|
|
|
|
|
|
|
|
|
if (mode < 2) { |
|
|
|
|
int b = (prev2[-2*refs] + next2[-2*refs])>>1; |
|
|
|
|
int f = (prev2[+2*refs] + next2[+2*refs])>>1; |
|
|
|
|
int b = (prev2[2*mrefs] + next2[2*mrefs])>>1; |
|
|
|
|
int f = (prev2[2*prefs] + next2[2*prefs])>>1; |
|
|
|
|
#if 0 |
|
|
|
|
int a = cur[-3*refs]; |
|
|
|
|
int g = cur[+3*refs]; |
|
|
|
@ -133,7 +133,8 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic, |
|
|
|
|
uint8_t *cur = &yadif->cur ->data[i][y*refs]; |
|
|
|
|
uint8_t *next = &yadif->next->data[i][y*refs]; |
|
|
|
|
uint8_t *dst = &dstpic->data[i][y*dstpic->linesize[i]]; |
|
|
|
|
yadif->filter_line(dst, prev, cur, next, w, refs, parity ^ tff, yadif->mode); |
|
|
|
|
int mode = y==1 || y+2==h ? 2 : yadif->mode; |
|
|
|
|
yadif->filter_line(dst, prev, cur, next, w, y+1<h ? refs : -refs, y ? -refs : refs, parity ^ tff, mode); |
|
|
|
|
} else { |
|
|
|
|
memcpy(&dstpic->data[i][y*dstpic->linesize[i]], |
|
|
|
|
&yadif->cur->data[i][y*refs], w); |
|
|
|
|