mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
h264: move sub_mb_type into the per-slice context
This commit is contained in:
parent
56febc993b
commit
ed451a08a4
@ -366,6 +366,8 @@ typedef struct H264SliceContext {
|
||||
*/
|
||||
DECLARE_ALIGNED(16, int16_t, mv_cache)[2][5 * 8][2];
|
||||
DECLARE_ALIGNED(8, int8_t, ref_cache)[2][5 * 8];
|
||||
|
||||
DECLARE_ALIGNED(8, uint16_t, sub_mb_type)[4];
|
||||
} H264SliceContext;
|
||||
|
||||
/**
|
||||
@ -438,9 +440,6 @@ typedef struct H264Context {
|
||||
int picture_structure;
|
||||
int first_field;
|
||||
|
||||
DECLARE_ALIGNED(8, uint16_t, sub_mb_type)[4];
|
||||
|
||||
|
||||
int direct_spatial_mv_pred;
|
||||
int col_parity;
|
||||
int col_fieldoff;
|
||||
@ -1027,21 +1026,21 @@ static av_always_inline void write_back_motion(H264Context *h,
|
||||
if (sl->slice_type_nos == AV_PICTURE_TYPE_B && CABAC(h)) {
|
||||
if (IS_8X8(mb_type)) {
|
||||
uint8_t *direct_table = &h->direct_table[4 * h->mb_xy];
|
||||
direct_table[1] = h->sub_mb_type[1] >> 1;
|
||||
direct_table[2] = h->sub_mb_type[2] >> 1;
|
||||
direct_table[3] = h->sub_mb_type[3] >> 1;
|
||||
direct_table[1] = sl->sub_mb_type[1] >> 1;
|
||||
direct_table[2] = sl->sub_mb_type[2] >> 1;
|
||||
direct_table[3] = sl->sub_mb_type[3] >> 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static av_always_inline int get_dct8x8_allowed(H264Context *h)
|
||||
static av_always_inline int get_dct8x8_allowed(H264Context *h, H264SliceContext *sl)
|
||||
{
|
||||
if (h->sps.direct_8x8_inference_flag)
|
||||
return !(AV_RN64A(h->sub_mb_type) &
|
||||
return !(AV_RN64A(sl->sub_mb_type) &
|
||||
((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8) *
|
||||
0x0001000100010001ULL));
|
||||
else
|
||||
return !(AV_RN64A(h->sub_mb_type) &
|
||||
return !(AV_RN64A(sl->sub_mb_type) &
|
||||
((MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8 | MB_TYPE_DIRECT2) *
|
||||
0x0001000100010001ULL));
|
||||
}
|
||||
|
@ -2090,32 +2090,32 @@ decode_intra_mb:
|
||||
|
||||
if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
|
||||
for( i = 0; i < 4; i++ ) {
|
||||
h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
|
||||
sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
|
||||
h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
|
||||
sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
|
||||
sub_partition_count[i] = b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
|
||||
sl->sub_mb_type[i] = b_sub_mb_type_info[sl->sub_mb_type[i]].type;
|
||||
}
|
||||
if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
|
||||
h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
|
||||
if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
|
||||
sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
|
||||
ff_h264_pred_direct_motion(h, sl, &mb_type);
|
||||
sl->ref_cache[0][scan8[4]] =
|
||||
sl->ref_cache[1][scan8[4]] =
|
||||
sl->ref_cache[0][scan8[12]] =
|
||||
sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
|
||||
for( i = 0; i < 4; i++ )
|
||||
fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
|
||||
fill_rectangle(&h->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
|
||||
}
|
||||
} else {
|
||||
for( i = 0; i < 4; i++ ) {
|
||||
h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
|
||||
sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
|
||||
h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
|
||||
sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(h);
|
||||
sub_partition_count[i] = p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
|
||||
sl->sub_mb_type[i] = p_sub_mb_type_info[sl->sub_mb_type[i]].type;
|
||||
}
|
||||
}
|
||||
|
||||
for( list = 0; list < h->list_count; list++ ) {
|
||||
for( i = 0; i < 4; i++ ) {
|
||||
if(IS_DIRECT(h->sub_mb_type[i])) continue;
|
||||
if(IS_DIR(h->sub_mb_type[i], 0, list)){
|
||||
if(IS_DIRECT(sl->sub_mb_type[i])) continue;
|
||||
if(IS_DIR(sl->sub_mb_type[i], 0, list)){
|
||||
int rc = h->ref_count[list] << MB_MBAFF(h);
|
||||
if (rc > 1) {
|
||||
ref[list][i] = decode_cabac_mb_ref(h, sl, list, 4 * i);
|
||||
@ -2134,18 +2134,18 @@ decode_intra_mb:
|
||||
}
|
||||
|
||||
if(dct8x8_allowed)
|
||||
dct8x8_allowed = get_dct8x8_allowed(h);
|
||||
dct8x8_allowed = get_dct8x8_allowed(h, sl);
|
||||
|
||||
for(list=0; list<h->list_count; list++){
|
||||
for(i=0; i<4; i++){
|
||||
sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
|
||||
if(IS_DIRECT(h->sub_mb_type[i])){
|
||||
if(IS_DIRECT(sl->sub_mb_type[i])){
|
||||
fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
|
||||
const int sub_mb_type= h->sub_mb_type[i];
|
||||
if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
|
||||
const int sub_mb_type= sl->sub_mb_type[i];
|
||||
const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
|
||||
for(j=0; j<sub_partition_count[i]; j++){
|
||||
int mpx, mpy;
|
||||
|
@ -836,15 +836,15 @@ decode_intra_mb:
|
||||
|
||||
if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
|
||||
for(i=0; i<4; i++){
|
||||
h->sub_mb_type[i]= get_ue_golomb_31(&h->gb);
|
||||
if(h->sub_mb_type[i] >=13){
|
||||
av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], h->mb_x, h->mb_y);
|
||||
sl->sub_mb_type[i]= get_ue_golomb_31(&h->gb);
|
||||
if(sl->sub_mb_type[i] >=13){
|
||||
av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], h->mb_x, h->mb_y);
|
||||
return -1;
|
||||
}
|
||||
sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
|
||||
h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
|
||||
sub_partition_count[i]= b_sub_mb_type_info[ sl->sub_mb_type[i] ].partition_count;
|
||||
sl->sub_mb_type[i]= b_sub_mb_type_info[ sl->sub_mb_type[i] ].type;
|
||||
}
|
||||
if( IS_DIRECT(h->sub_mb_type[0]|h->sub_mb_type[1]|h->sub_mb_type[2]|h->sub_mb_type[3])) {
|
||||
if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) {
|
||||
ff_h264_pred_direct_motion(h, sl, &mb_type);
|
||||
sl->ref_cache[0][scan8[4]] =
|
||||
sl->ref_cache[1][scan8[4]] =
|
||||
@ -854,21 +854,21 @@ decode_intra_mb:
|
||||
}else{
|
||||
assert(sl->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ?
|
||||
for(i=0; i<4; i++){
|
||||
h->sub_mb_type[i]= get_ue_golomb_31(&h->gb);
|
||||
if(h->sub_mb_type[i] >=4){
|
||||
av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], h->mb_x, h->mb_y);
|
||||
sl->sub_mb_type[i]= get_ue_golomb_31(&h->gb);
|
||||
if(sl->sub_mb_type[i] >=4){
|
||||
av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], h->mb_x, h->mb_y);
|
||||
return -1;
|
||||
}
|
||||
sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
|
||||
h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
|
||||
sub_partition_count[i]= p_sub_mb_type_info[ sl->sub_mb_type[i] ].partition_count;
|
||||
sl->sub_mb_type[i]= p_sub_mb_type_info[ sl->sub_mb_type[i] ].type;
|
||||
}
|
||||
}
|
||||
|
||||
for(list=0; list<h->list_count; list++){
|
||||
int ref_count = IS_REF0(mb_type) ? 1 : h->ref_count[list] << MB_MBAFF(h);
|
||||
for(i=0; i<4; i++){
|
||||
if(IS_DIRECT(h->sub_mb_type[i])) continue;
|
||||
if(IS_DIR(h->sub_mb_type[i], 0, list)){
|
||||
if(IS_DIRECT(sl->sub_mb_type[i])) continue;
|
||||
if(IS_DIR(sl->sub_mb_type[i], 0, list)){
|
||||
unsigned int tmp;
|
||||
if(ref_count == 1){
|
||||
tmp= 0;
|
||||
@ -890,19 +890,19 @@ decode_intra_mb:
|
||||
}
|
||||
|
||||
if(dct8x8_allowed)
|
||||
dct8x8_allowed = get_dct8x8_allowed(h);
|
||||
dct8x8_allowed = get_dct8x8_allowed(h, sl);
|
||||
|
||||
for(list=0; list<h->list_count; list++){
|
||||
for(i=0; i<4; i++){
|
||||
if(IS_DIRECT(h->sub_mb_type[i])) {
|
||||
if(IS_DIRECT(sl->sub_mb_type[i])) {
|
||||
sl->ref_cache[list][ scan8[4*i] ] = sl->ref_cache[list][ scan8[4*i]+1 ];
|
||||
continue;
|
||||
}
|
||||
sl->ref_cache[list][ scan8[4*i] ]=sl->ref_cache[list][ scan8[4*i]+1 ]=
|
||||
sl->ref_cache[list][ scan8[4*i]+8 ]=sl->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
|
||||
|
||||
if(IS_DIR(h->sub_mb_type[i], 0, list)){
|
||||
const int sub_mb_type= h->sub_mb_type[i];
|
||||
if(IS_DIR(sl->sub_mb_type[i], 0, list)){
|
||||
const int sub_mb_type= sl->sub_mb_type[i];
|
||||
const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
|
||||
for(j=0; j<sub_partition_count[i]; j++){
|
||||
int mx, my;
|
||||
|
@ -337,9 +337,9 @@ single_col:
|
||||
int xy4 = x8 * 3 + y8 * b4_stride;
|
||||
int a, b;
|
||||
|
||||
if (is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
|
||||
if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8]))
|
||||
continue;
|
||||
h->sub_mb_type[i8] = sub_mb_type;
|
||||
sl->sub_mb_type[i8] = sub_mb_type;
|
||||
|
||||
fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8,
|
||||
(uint8_t)ref[0], 1);
|
||||
@ -401,9 +401,9 @@ single_col:
|
||||
const int x8 = i8 & 1;
|
||||
const int y8 = i8 >> 1;
|
||||
|
||||
if (is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
|
||||
if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8]))
|
||||
continue;
|
||||
h->sub_mb_type[i8] = sub_mb_type;
|
||||
sl->sub_mb_type[i8] = sub_mb_type;
|
||||
|
||||
fill_rectangle(&sl->mv_cache[0][scan8[i8 * 4]], 2, 2, 8, mv[0], 4);
|
||||
fill_rectangle(&sl->mv_cache[1][scan8[i8 * 4]], 2, 2, 8, mv[1], 4);
|
||||
@ -445,7 +445,7 @@ single_col:
|
||||
}
|
||||
}
|
||||
if (!(m & 3))
|
||||
h->sub_mb_type[i8] += MB_TYPE_16x16 - MB_TYPE_8x8;
|
||||
sl->sub_mb_type[i8] += MB_TYPE_16x16 - MB_TYPE_8x8;
|
||||
n += m;
|
||||
}
|
||||
}
|
||||
@ -575,9 +575,9 @@ single_col:
|
||||
int ref0, scale;
|
||||
const int16_t (*l1mv)[2] = l1mv0;
|
||||
|
||||
if (is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
|
||||
if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8]))
|
||||
continue;
|
||||
h->sub_mb_type[i8] = sub_mb_type;
|
||||
sl->sub_mb_type[i8] = sub_mb_type;
|
||||
|
||||
fill_rectangle(&sl->ref_cache[1][scan8[i8 * 4]], 2, 2, 8, 0, 1);
|
||||
if (IS_INTRA(mb_type_col[y8])) {
|
||||
@ -643,9 +643,9 @@ single_col:
|
||||
int ref0, scale;
|
||||
const int16_t (*l1mv)[2] = l1mv0;
|
||||
|
||||
if (is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
|
||||
if (is_b8x8 && !IS_DIRECT(sl->sub_mb_type[i8]))
|
||||
continue;
|
||||
h->sub_mb_type[i8] = sub_mb_type;
|
||||
sl->sub_mb_type[i8] = sub_mb_type;
|
||||
fill_rectangle(&sl->ref_cache[1][scan8[i8 * 4]], 2, 2, 8, 0, 1);
|
||||
if (IS_INTRA(mb_type_col[0])) {
|
||||
fill_rectangle(&sl->ref_cache[0][scan8[i8 * 4]], 2, 2, 8, 0, 1);
|
||||
|
@ -123,7 +123,7 @@ static void await_references(H264Context *h, H264SliceContext *sl)
|
||||
assert(IS_8X8(mb_type));
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
const int sub_mb_type = h->sub_mb_type[i];
|
||||
const int sub_mb_type = sl->sub_mb_type[i];
|
||||
const int n = 4 * i;
|
||||
int y_offset = (i & 2) << 2;
|
||||
|
||||
|
@ -109,7 +109,7 @@ static void MCFUNC(hl_motion)(H264Context *h, H264SliceContext *sl,
|
||||
assert(IS_8X8(mb_type));
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
const int sub_mb_type = h->sub_mb_type[i];
|
||||
const int sub_mb_type = sl->sub_mb_type[i];
|
||||
const int n = 4 * i;
|
||||
int x_offset = (i & 1) << 2;
|
||||
int y_offset = (i & 2) << 1;
|
||||
|
Loading…
Reference in New Issue
Block a user