From 47a0d393504d6726c4a235951153bee0abb3f7d6 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 17 Jan 2015 22:28:46 +0100 Subject: [PATCH] h264: move mb_skip_run into the per-slice context --- libavcodec/h264.h | 3 ++- libavcodec/h264_cavlc.c | 8 ++++---- libavcodec/h264_slice.c | 4 ++-- libavcodec/svq3.c | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 0696000294..04ed625c37 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -356,6 +356,8 @@ typedef struct H264SliceContext { ptrdiff_t mb_linesize; ///< may be equal to s->linesize or s->linesize * 2, for mbaff ptrdiff_t mb_uvlinesize; + int mb_skip_run; + int redundant_pic_count; /** @@ -525,7 +527,6 @@ typedef struct H264Context { int mb_x, mb_y; int resync_mb_x; int resync_mb_y; - int mb_skip_run; int mb_height, mb_width; int mb_stride; int mb_num; diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c index b16b6b66c2..0ef5dcfe4f 100644 --- a/libavcodec/h264_cavlc.c +++ b/libavcodec/h264_cavlc.c @@ -709,12 +709,12 @@ int ff_h264_decode_mb_cavlc(H264Context *h, H264SliceContext *sl) cbp = 0; /* avoid warning. FIXME: find a solution without slowing down the code */ if (sl->slice_type_nos != AV_PICTURE_TYPE_I) { - if(h->mb_skip_run==-1) - h->mb_skip_run= get_ue_golomb(&h->gb); + if (sl->mb_skip_run == -1) + sl->mb_skip_run = get_ue_golomb(&h->gb); - if (h->mb_skip_run--) { + if (sl->mb_skip_run--) { if(FRAME_MBAFF(h) && (h->mb_y&1) == 0){ - if(h->mb_skip_run==0) + if (sl->mb_skip_run == 0) h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&h->gb); } decode_mb_skip(h, sl); diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 2e319e9daa..43185c59b4 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -2183,7 +2183,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) H264Context *h = sl->h264; int lf_x_start = h->mb_x; - h->mb_skip_run = -1; + sl->mb_skip_run = -1; h->is_complex = FRAME_MBAFF(h) || h->picture_structure != PICT_FRAME || avctx->codec_id != AV_CODEC_ID_H264 || @@ -2314,7 +2314,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) } } - if (get_bits_left(&h->gb) <= 0 && h->mb_skip_run <= 0) { + if (get_bits_left(&h->gb) <= 0 && sl->mb_skip_run <= 0) { tprintf(h->avctx, "slice end %d %d\n", get_bits_count(&h->gb), h->gb.size_in_bits); diff --git a/libavcodec/svq3.c b/libavcodec/svq3.c index 316699c37c..d8aefa633e 100644 --- a/libavcodec/svq3.c +++ b/libavcodec/svq3.c @@ -821,11 +821,11 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) if ((header & 0x9F) == 2) { i = (h->mb_num < 64) ? 6 : (1 + av_log2(h->mb_num - 1)); - h->mb_skip_run = get_bits(&h->gb, i) - + sl->mb_skip_run = get_bits(&h->gb, i) - (h->mb_y * h->mb_width + h->mb_x); } else { skip_bits1(&h->gb); - h->mb_skip_run = 0; + sl->mb_skip_run = 0; } sl->slice_num = get_bits(&h->gb, 8);