diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 1ba6e56497..203a04bd1d 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -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; diff --git a/libavcodec/h264_cabac.c b/libavcodec/h264_cabac.c index 4225fc1f60..30b97836f0 100644 --- a/libavcodec/h264_cabac.c +++ b/libavcodec/h264_cabac.c @@ -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]; diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c index accb67bc16..7244654a30 100644 --- a/libavcodec/h264_cavlc.c +++ b/libavcodec/h264_cavlc.c @@ -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]; diff --git a/libavcodec/h264_mb.c b/libavcodec/h264_mb.c index 86beb19b37..e26f5c9f70 100644 --- a/libavcodec/h264_mb.c +++ b/libavcodec/h264_mb.c @@ -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 { diff --git a/libavcodec/h264_mb_template.c b/libavcodec/h264_mb_template.c index 4805f69055..eb34533d15 100644 --- a/libavcodec/h264_mb_template.c +++ b/libavcodec/h264_mb_template.c @@ -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); diff --git a/libavcodec/svq3.c b/libavcodec/svq3.c index e6e4b0df7a..cad546bc61 100644 --- a/libavcodec/svq3.c +++ b/libavcodec/svq3.c @@ -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; }