h264: move {chroma,intra16x16}_pred_mode into the per-slice context
authorAnton Khirnov <anton@khirnov.net>
Sat, 17 Jan 2015 21:28:46 +0000 (22:28 +0100)
committerAnton Khirnov <anton@khirnov.net>
Sat, 21 Mar 2015 10:27:12 +0000 (11:27 +0100)
libavcodec/h264.h
libavcodec/h264_cabac.c
libavcodec/h264_cavlc.c
libavcodec/h264_mb.c
libavcodec/h264_mb_template.c
libavcodec/svq3.c

index 1ba6e56..203a04b 100644 (file)
@@ -317,6 +317,9 @@ typedef struct H264SliceContext {
 
     int prev_mb_skipped;
     int next_mb_skipped;
+
+    int chroma_pred_mode;
+    int intra16x16_pred_mode;
 } H264SliceContext;
 
 /**
@@ -354,9 +357,6 @@ typedef struct H264Context {
     int workaround_bugs;
 
     // prediction stuff
-    int chroma_pred_mode;
-    int intra16x16_pred_mode;
-
     int topleft_mb_xy;
     int top_mb_xy;
     int topright_mb_xy;
index 4225fc1..30b9783 100644 (file)
@@ -1989,7 +1989,7 @@ int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
 decode_intra_mb:
         partition_count = 0;
         cbp= i_mb_type_info[mb_type].cbp;
-        h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
+        sl->intra16x16_pred_mode = i_mb_type_info[mb_type].pred_mode;
         mb_type= i_mb_type_info[mb_type].type;
     }
     if(MB_FIELD(h))
@@ -2055,8 +2055,8 @@ decode_intra_mb:
             write_back_intra_pred_mode(h);
             if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
         } else {
-            h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode, 0 );
-            if( h->intra16x16_pred_mode < 0 ) return -1;
+            sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, sl->intra16x16_pred_mode, 0);
+            if (sl->intra16x16_pred_mode < 0) return -1;
         }
         if(decode_chroma){
             h->chroma_pred_mode_table[mb_xy] =
@@ -2064,9 +2064,9 @@ decode_intra_mb:
 
             pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 );
             if( pred_mode < 0 ) return -1;
-            h->chroma_pred_mode= pred_mode;
+            sl->chroma_pred_mode = pred_mode;
         } else {
-            h->chroma_pred_mode= DC_128_PRED8x8;
+            sl->chroma_pred_mode = DC_128_PRED8x8;
         }
     } else if( partition_count == 4 ) {
         int i, j, sub_partition_count[4], list, ref[2][4];
index accb67b..7244654 100644 (file)
@@ -751,7 +751,7 @@ decode_intra_mb:
         }
         partition_count=0;
         cbp= i_mb_type_info[mb_type].cbp;
-        h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
+        sl->intra16x16_pred_mode = i_mb_type_info[mb_type].pred_mode;
         mb_type= i_mb_type_info[mb_type].type;
     }
 
@@ -814,17 +814,17 @@ decode_intra_mb:
             if( ff_h264_check_intra4x4_pred_mode(h) < 0)
                 return -1;
         }else{
-            h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode(h, h->intra16x16_pred_mode, 0);
-            if(h->intra16x16_pred_mode < 0)
+            sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, sl->intra16x16_pred_mode, 0);
+            if (sl->intra16x16_pred_mode < 0)
                 return -1;
         }
         if(decode_chroma){
             pred_mode= ff_h264_check_intra_pred_mode(h, get_ue_golomb_31(&h->gb), 1);
             if(pred_mode < 0)
                 return -1;
-            h->chroma_pred_mode= pred_mode;
+            sl->chroma_pred_mode = pred_mode;
         } else {
-            h->chroma_pred_mode = DC_128_PRED8x8;
+            sl->chroma_pred_mode = DC_128_PRED8x8;
         }
     }else if(partition_count==4){
         int i, j, sub_partition_count[4], list, ref[2][4];
index 86beb19..e26f5c9 100644 (file)
@@ -694,7 +694,7 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h,
             }
         }
     } else {
-        h->hpc.pred16x16[h->intra16x16_pred_mode](dest_y, linesize);
+        h->hpc.pred16x16[sl->intra16x16_pred_mode](dest_y, linesize);
         if (is_h264) {
             if (h->non_zero_count_cache[scan8[LUMA_DC_BLOCK_INDEX + p]]) {
                 if (!transform_bypass)
@@ -738,9 +738,9 @@ static av_always_inline void hl_decode_mb_idct_luma(H264Context *h, H264SliceCon
             if (IS_INTRA16x16(mb_type)) {
                 if (transform_bypass) {
                     if (h->sps.profile_idc == 244 &&
-                        (h->intra16x16_pred_mode == VERT_PRED8x8 ||
-                         h->intra16x16_pred_mode == HOR_PRED8x8)) {
-                        h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y, block_offset,
+                        (sl->intra16x16_pred_mode == VERT_PRED8x8 ||
+                         sl->intra16x16_pred_mode == HOR_PRED8x8)) {
+                        h->hpc.pred16x16_add[sl->intra16x16_pred_mode](dest_y, block_offset,
                                                                       h->mb + (p * 256 << pixel_shift),
                                                                       linesize);
                     } else {
index 4805f69..eb34533 100644 (file)
@@ -163,8 +163,8 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h, H264SliceContext *sl)
                                uvlinesize, 1, 0, SIMPLE, PIXEL_SHIFT);
 
             if (SIMPLE || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
-                h->hpc.pred8x8[h->chroma_pred_mode](dest_cb, uvlinesize);
-                h->hpc.pred8x8[h->chroma_pred_mode](dest_cr, uvlinesize);
+                h->hpc.pred8x8[sl->chroma_pred_mode](dest_cb, uvlinesize);
+                h->hpc.pred8x8[sl->chroma_pred_mode](dest_cr, uvlinesize);
             }
 
             hl_decode_mb_predict_luma(h, sl, mb_type, is_h264, SIMPLE,
@@ -198,13 +198,13 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h, H264SliceContext *sl)
             uint8_t *dest[2] = { dest_cb, dest_cr };
             if (transform_bypass) {
                 if (IS_INTRA(mb_type) && h->sps.profile_idc == 244 &&
-                    (h->chroma_pred_mode == VERT_PRED8x8 ||
-                     h->chroma_pred_mode == HOR_PRED8x8)) {
-                    h->hpc.pred8x8_add[h->chroma_pred_mode](dest[0],
+                    (sl->chroma_pred_mode == VERT_PRED8x8 ||
+                     sl->chroma_pred_mode == HOR_PRED8x8)) {
+                    h->hpc.pred8x8_add[sl->chroma_pred_mode](dest[0],
                                                             block_offset + 16,
                                                             h->mb + (16 * 16 * 1 << PIXEL_SHIFT),
                                                             uvlinesize);
-                    h->hpc.pred8x8_add[h->chroma_pred_mode](dest[1],
+                    h->hpc.pred8x8_add[sl->chroma_pred_mode](dest[1],
                                                             block_offset + 32,
                                                             h->mb + (16 * 16 * 2 << PIXEL_SHIFT),
                                                             uvlinesize);
index e6e4b0d..cad546b 100644 (file)
@@ -660,9 +660,9 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
         dir = i_mb_type_info[mb_type - 8].pred_mode;
         dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
 
-        if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) < 0) {
+        if ((sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) < 0) {
             av_log(h->avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
-            return h->intra16x16_pred_mode;
+            return sl->intra16x16_pred_mode;
         }
 
         cbp     = i_mb_type_info[mb_type - 8].cbp;
@@ -764,7 +764,7 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
     h->cur_pic.mb_type[mb_xy] = mb_type;
 
     if (IS_INTRA(mb_type))
-        h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1);
+        sl->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1);
 
     return 0;
 }