summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-03-21 14:37:55 +0100
committerMichael Niedermayer <michaelni@gmx.at>2015-03-21 14:37:55 +0100
commit4ffbeddd35cb6a365a3db85bb2bdf2084fb1ba55 (patch)
tree86c21a7454f7c1ffd7897b78b42280414d9e1ef0
parent97c8ecaadab4e246d969fadd44072025b64747e4 (diff)
parented451a08a46b2b07fd2dba3e55ffddd18ae6e3d6 (diff)
downloadffmpeg-streaming-4ffbeddd35cb6a365a3db85bb2bdf2084fb1ba55.zip
ffmpeg-streaming-4ffbeddd35cb6a365a3db85bb2bdf2084fb1ba55.tar.gz
Merge commit 'ed451a08a46b2b07fd2dba3e55ffddd18ae6e3d6'
* commit 'ed451a08a46b2b07fd2dba3e55ffddd18ae6e3d6': h264: move sub_mb_type into the per-slice context Conflicts: libavcodec/h264_cabac.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/h264.h17
-rw-r--r--libavcodec/h264_cabac.c30
-rw-r--r--libavcodec/h264_cavlc.c34
-rw-r--r--libavcodec/h264_direct.c18
-rw-r--r--libavcodec/h264_mb.c2
-rw-r--r--libavcodec/h264_mc_template.c2
6 files changed, 51 insertions, 52 deletions
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index ff00c8b..1ba9fc0 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -403,6 +403,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;
/**
@@ -481,9 +483,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;
@@ -1101,21 +1100,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));
}
diff --git a/libavcodec/h264_cabac.c b/libavcodec/h264_cabac.c
index 93f90a3..b516a62 100644
--- a/libavcodec/h264_cabac.c
+++ b/libavcodec/h264_cabac.c
@@ -2096,32 +2096,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)){
if (local_ref_count[list] > 1) {
ref[list][i] = decode_cabac_mb_ref(h, sl, list, 4 * i);
if (ref[list][i] >= (unsigned)local_ref_count[list]) {
@@ -2139,18 +2139,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;
diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c
index 58406a0..08180a5 100644
--- a/libavcodec/h264_cavlc.c
+++ b/libavcodec/h264_cavlc.c
@@ -847,15 +847,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]] =
@@ -865,21 +865,21 @@ decode_intra_mb:
}else{
av_assert2(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 : local_ref_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)){
unsigned int tmp;
if(ref_count == 1){
tmp= 0;
@@ -901,19 +901,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;
diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c
index ec5f476..8d6ee4b 100644
--- a/libavcodec/h264_direct.c
+++ b/libavcodec/h264_direct.c
@@ -338,9 +338,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);
@@ -402,9 +402,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);
@@ -446,7 +446,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;
}
}
@@ -576,9 +576,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])) {
@@ -644,9 +644,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);
diff --git a/libavcodec/h264_mb.c b/libavcodec/h264_mb.c
index 1dbf9de..1e7314a 100644
--- a/libavcodec/h264_mb.c
+++ b/libavcodec/h264_mb.c
@@ -123,7 +123,7 @@ static void await_references(H264Context *h, H264SliceContext *sl)
av_assert2(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;
diff --git a/libavcodec/h264_mc_template.c b/libavcodec/h264_mc_template.c
index 32b7a3c..d20ccc5 100644
--- a/libavcodec/h264_mc_template.c
+++ b/libavcodec/h264_mc_template.c
@@ -109,7 +109,7 @@ static void MCFUNC(hl_motion)(H264Context *h, H264SliceContext *sl,
av_assert2(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;
OpenPOWER on IntegriCloud