diff options
author | Clément Bœsch <clement@stupeflix.com> | 2016-06-30 11:15:51 +0300 |
---|---|---|
committer | Clément Bœsch <clement@stupeflix.com> | 2016-06-30 11:15:51 +0300 |
commit | d407e76c42d5ae79791ff88d3bd5185e10ad6047 (patch) | |
tree | 2c77d67281ef3e29bf9a0e6f69bfb83ba3a55fff /libavcodec/h264_refs.c | |
parent | 879330c561f4214bd81c35f46f31dd7fe906a59a (diff) | |
parent | 2d410ebbaa1e760d6837cb434a6d1d4c3c6f0d85 (diff) |
Merge commit '2d410ebbaa1e760d6837cb434a6d1d4c3c6f0d85'
* commit '2d410ebbaa1e760d6837cb434a6d1d4c3c6f0d85':
h264: decode the MMCOs into per-slice contexts
Merged-by: Clément Bœsch <clement@stupeflix.com>
Diffstat (limited to 'libavcodec/h264_refs.c')
-rw-r--r-- | libavcodec/h264_refs.c | 44 |
1 files changed, 13 insertions, 31 deletions
diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c index e7ae447358..c710012e05 100644 --- a/libavcodec/h264_refs.c +++ b/libavcodec/h264_refs.c @@ -601,9 +601,10 @@ static int check_opcodes(MMCO *mmco1, MMCO *mmco2, int n_mmcos) return 0; } -int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice) +int ff_generate_sliding_window_mmcos(const H264Context *h, + H264SliceContext *sl) { - MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp; + MMCO *mmco = sl->mmco; int nb_mmco = 0, i = 0; if (h->short_ref_count && @@ -620,16 +621,8 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice) } } - if (first_slice) { - h->nb_mmco = nb_mmco; - } else if (!first_slice && nb_mmco >= 0 && - (nb_mmco != h->nb_mmco || - (i = check_opcodes(h->mmco, mmco_temp, nb_mmco)))) { - av_log(h->avctx, AV_LOG_ERROR, - "Inconsistent MMCO state between slices [%d, %d]\n", - nb_mmco, h->nb_mmco); - return AVERROR_INVALIDDATA; - } + sl->nb_mmco = nb_mmco; + return 0; } @@ -842,11 +835,11 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count) return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0; } -int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, - int first_slice) +int ff_h264_decode_ref_pic_marking(const H264Context *h, H264SliceContext *sl, + GetBitContext *gb) { int i, ret; - MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = mmco_temp; + MMCO *mmco = sl->mmco; int nb_mmco = 0; if (h->nal_unit_type == NAL_IDR_SLICE) { // FIXME fields @@ -902,26 +895,15 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, } nb_mmco = i; } else { - if (first_slice) { - ret = ff_generate_sliding_window_mmcos(h, first_slice); - if (ret < 0 && h->avctx->err_recognition & AV_EF_EXPLODE) - return ret; - } + ret = ff_generate_sliding_window_mmcos(h, sl); + if (ret < 0 && h->avctx->err_recognition & AV_EF_EXPLODE) + return ret; nb_mmco = -1; } } - if (first_slice && nb_mmco != -1) { - memcpy(h->mmco, mmco_temp, sizeof(h->mmco)); - h->nb_mmco = nb_mmco; - } else if (!first_slice && nb_mmco >= 0 && - (nb_mmco != h->nb_mmco || - check_opcodes(h->mmco, mmco_temp, nb_mmco))) { - av_log(h->avctx, AV_LOG_ERROR, - "Inconsistent MMCO state between slices [%d, %d]\n", - nb_mmco, h->nb_mmco); - return AVERROR_INVALIDDATA; - } + if (nb_mmco != -1) + sl->nb_mmco = nb_mmco; return 0; } |