|
|
@@ -476,24 +476,128 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u |
|
|
|
} |
|
|
|
|
|
|
|
/* Calculate bS */ |
|
|
|
for( edge = start; edge < edges; edge++ ) { |
|
|
|
/* mbn_xy: neighbor macroblock */ |
|
|
|
const int mbn_xy = edge > 0 ? mb_xy : mbm_xy; |
|
|
|
const int mbn_type = s->current_picture.mb_type[mbn_xy]; |
|
|
|
if(start==0) { |
|
|
|
DECLARE_ALIGNED_8(int16_t, bS)[4]; |
|
|
|
int qp; |
|
|
|
|
|
|
|
if( IS_INTRA(mb_type|mbm_type)) { |
|
|
|
*(uint64_t*)bS= 0x0003000300030003ULL; |
|
|
|
if ( (!IS_INTERLACED(mb_type|mbm_type)) |
|
|
|
|| ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0)) |
|
|
|
) |
|
|
|
*(uint64_t*)bS= 0x0004000400040004ULL; |
|
|
|
} else { |
|
|
|
int i, l; |
|
|
|
int mv_done; |
|
|
|
|
|
|
|
if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbm_type)) { //FIXME not posible left |
|
|
|
*(uint64_t*)bS= 0x0001000100010001ULL; |
|
|
|
mv_done = 1; |
|
|
|
} |
|
|
|
else if( mask_par0 && ((mbm_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) { |
|
|
|
int b_idx= 8 + 4; |
|
|
|
int bn_idx= b_idx - (dir ? 8:1); |
|
|
|
int v = 0; |
|
|
|
|
|
|
|
for( l = 0; !v && l < h->list_count; l++ ) { |
|
|
|
v |= h->ref_cache[l][b_idx] != h->ref_cache[l][bn_idx] | |
|
|
|
h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] + 3 >= 7U | |
|
|
|
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit; |
|
|
|
} |
|
|
|
|
|
|
|
if(h->list_count==2 && v){ |
|
|
|
v=0; |
|
|
|
for( l = 0; !v && l < 2; l++ ) { |
|
|
|
int ln= 1-l; |
|
|
|
v |= h->ref_cache[l][b_idx] != h->ref_cache[ln][bn_idx] | |
|
|
|
h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] + 3 >= 7U | |
|
|
|
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bS[0] = bS[1] = bS[2] = bS[3] = v; |
|
|
|
mv_done = 1; |
|
|
|
} |
|
|
|
else |
|
|
|
mv_done = 0; |
|
|
|
|
|
|
|
for( i = 0; i < 4; i++ ) { |
|
|
|
int x = dir == 0 ? 0 : i; |
|
|
|
int y = dir == 0 ? i : 0; |
|
|
|
int b_idx= 8 + 4 + x + 8*y; |
|
|
|
int bn_idx= b_idx - (dir ? 8:1); |
|
|
|
|
|
|
|
if( h->non_zero_count_cache[b_idx] | |
|
|
|
h->non_zero_count_cache[bn_idx] ) { |
|
|
|
bS[i] = 2; |
|
|
|
} |
|
|
|
else if(!mv_done) |
|
|
|
{ |
|
|
|
bS[i] = 0; |
|
|
|
for( l = 0; l < h->list_count; l++ ) { |
|
|
|
if( h->ref_cache[l][b_idx] != h->ref_cache[l][bn_idx] | |
|
|
|
h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] + 3 >= 7U | |
|
|
|
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) { |
|
|
|
bS[i] = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(h->list_count == 2 && bS[i]){ |
|
|
|
bS[i] = 0; |
|
|
|
for( l = 0; l < 2; l++ ) { |
|
|
|
int ln= 1-l; |
|
|
|
if( h->ref_cache[l][b_idx] != h->ref_cache[ln][bn_idx] | |
|
|
|
h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] + 3 >= 7U | |
|
|
|
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) { |
|
|
|
bS[i] = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Filter edge */ |
|
|
|
// Do not use s->qscale as luma quantizer because it has not the same |
|
|
|
// value in IPCM macroblocks. |
|
|
|
if(bS[0]+bS[1]+bS[2]+bS[3]){ |
|
|
|
qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbm_xy] + 1 ) >> 1; |
|
|
|
//tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], s->current_picture.qscale_table[mbn_xy]); |
|
|
|
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); |
|
|
|
//{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } |
|
|
|
if( dir == 0 ) { |
|
|
|
filter_mb_edgev( &img_y[0], linesize, bS, qp, h ); |
|
|
|
{ |
|
|
|
int qp= ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbm_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgecv( &img_cb[0], uvlinesize, bS, qp, h); |
|
|
|
if(h->pps.chroma_qp_diff) |
|
|
|
qp= ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbm_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgecv( &img_cr[0], uvlinesize, bS, qp, h); |
|
|
|
} |
|
|
|
} else { |
|
|
|
filter_mb_edgeh( &img_y[0], linesize, bS, qp, h ); |
|
|
|
{ |
|
|
|
int qp= ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbm_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgech( &img_cb[0], uvlinesize, bS, qp, h); |
|
|
|
if(h->pps.chroma_qp_diff) |
|
|
|
qp= ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbm_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgech( &img_cr[0], uvlinesize, bS, qp, h); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/* Calculate bS */ |
|
|
|
for( edge = 1; edge < edges; edge++ ) { |
|
|
|
DECLARE_ALIGNED_8(int16_t, bS)[4]; |
|
|
|
int qp; |
|
|
|
|
|
|
|
if( IS_8x8DCT(mb_type & (edge<<24)) ) // (edge&1) && IS_8x8DCT(mb_type) |
|
|
|
continue; |
|
|
|
|
|
|
|
if( IS_INTRA(mb_type|mbn_type)) { |
|
|
|
if( IS_INTRA(mb_type)) { |
|
|
|
*(uint64_t*)bS= 0x0003000300030003ULL; |
|
|
|
if (edge == 0) { |
|
|
|
if ( (!IS_INTERLACED(mb_type|mbm_type)) |
|
|
|
|| ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0)) |
|
|
|
) |
|
|
|
*(uint64_t*)bS= 0x0004000400040004ULL; |
|
|
|
} |
|
|
|
} else { |
|
|
|
int i, l; |
|
|
|
int mv_done; |
|
|
@@ -502,11 +606,7 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u |
|
|
|
*(uint64_t*)bS= 0; |
|
|
|
mv_done = 1; |
|
|
|
} |
|
|
|
else if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbn_type)) { |
|
|
|
*(uint64_t*)bS= 0x0001000100010001ULL; |
|
|
|
mv_done = 1; |
|
|
|
} |
|
|
|
else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) { |
|
|
|
else if( mask_par0 ) { |
|
|
|
int b_idx= 8 + 4 + edge * (dir ? 8:1); |
|
|
|
int bn_idx= b_idx - (dir ? 8:1); |
|
|
|
int v = 0; |
|
|
@@ -577,27 +677,21 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u |
|
|
|
/* Filter edge */ |
|
|
|
// Do not use s->qscale as luma quantizer because it has not the same |
|
|
|
// value in IPCM macroblocks. |
|
|
|
qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1; |
|
|
|
qp = s->current_picture.qscale_table[mb_xy]; |
|
|
|
//tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], s->current_picture.qscale_table[mbn_xy]); |
|
|
|
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); |
|
|
|
//{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } |
|
|
|
if( dir == 0 ) { |
|
|
|
filter_mb_edgev( &img_y[4*edge], linesize, bS, qp, h ); |
|
|
|
if( (edge&1) == 0 ) { |
|
|
|
int qp= ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgecv( &img_cb[2*edge], uvlinesize, bS, qp, h); |
|
|
|
if(h->pps.chroma_qp_diff) |
|
|
|
qp= ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgecv( &img_cr[2*edge], uvlinesize, bS, qp, h); |
|
|
|
filter_mb_edgecv( &img_cb[2*edge], uvlinesize, bS, h->chroma_qp[0], h); |
|
|
|
filter_mb_edgecv( &img_cr[2*edge], uvlinesize, bS, h->chroma_qp[1], h); |
|
|
|
} |
|
|
|
} else { |
|
|
|
filter_mb_edgeh( &img_y[4*edge*linesize], linesize, bS, qp, h ); |
|
|
|
if( (edge&1) == 0 ) { |
|
|
|
int qp= ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgech( &img_cb[2*edge*uvlinesize], uvlinesize, bS, qp, h); |
|
|
|
if(h->pps.chroma_qp_diff) |
|
|
|
qp= ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1; |
|
|
|
filter_mb_edgech( &img_cr[2*edge*uvlinesize], uvlinesize, bS, qp, h); |
|
|
|
filter_mb_edgech( &img_cb[2*edge*uvlinesize], uvlinesize, bS, h->chroma_qp[0], h); |
|
|
|
filter_mb_edgech( &img_cr[2*edge*uvlinesize], uvlinesize, bS, h->chroma_qp[1], h); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|