diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2017-06-27 22:47:31 +0300 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2017-06-28 15:08:21 +0300 |
commit | 1835c5e7a4fd3a1e7c8a51ed410cecbfe6804ade (patch) | |
tree | 0a9918309f03f675187d8d9208376e61709dba78 | |
parent | b12a36170b1314a991cff0d618a96259d4b172f4 (diff) |
avcodec/utvideodec: Move bitstream end check out of inner loop
This is not needed when the buffer is large enough for the worst case of a line
2% faster vlc reading
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavcodec/utvideodec.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c index 44841aaa65..815b71cfb6 100644 --- a/libavcodec/utvideodec.c +++ b/libavcodec/utvideodec.c @@ -196,11 +196,6 @@ static int decode_plane10(UtvideoContext *c, int plane_no, prev = 0x200; for (j = sstart; j < send; j++) { for (i = 0; i < width * step; i += step) { - if (get_bits_left(&gb) <= 0) { - av_log(c->avctx, AV_LOG_ERROR, - "Slice decoding ran out of bits\n"); - goto fail; - } pix = get_vlc2(&gb, vlc.table, vlc.bits, 3); if (pix < 0) { av_log(c->avctx, AV_LOG_ERROR, "Decoding error\n"); @@ -214,6 +209,11 @@ static int decode_plane10(UtvideoContext *c, int plane_no, dest[i] = pix; } dest += stride; + if (get_bits_left(&gb) < 0) { + av_log(c->avctx, AV_LOG_ERROR, + "Slice decoding ran out of bits\n"); + goto fail; + } } if (get_bits_left(&gb) > 32) av_log(c->avctx, AV_LOG_WARNING, @@ -302,11 +302,6 @@ static int decode_plane(UtvideoContext *c, int plane_no, prev = 0x80; for (j = sstart; j < send; j++) { for (i = 0; i < width * step; i += step) { - if (get_bits_left(&gb) <= 0) { - av_log(c->avctx, AV_LOG_ERROR, - "Slice decoding ran out of bits\n"); - goto fail; - } pix = get_vlc2(&gb, vlc.table, vlc.bits, 3); if (pix < 0) { av_log(c->avctx, AV_LOG_ERROR, "Decoding error\n"); @@ -318,6 +313,11 @@ static int decode_plane(UtvideoContext *c, int plane_no, } dest[i] = pix; } + if (get_bits_left(&gb) < 0) { + av_log(c->avctx, AV_LOG_ERROR, + "Slice decoding ran out of bits\n"); + goto fail; + } dest += stride; } if (get_bits_left(&gb) > 32) @@ -610,6 +610,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, c->frame_pred = (c->frame_info >> 8) & 3; + max_slice_size += 4*avctx->width; + av_fast_malloc(&c->slice_bits, &c->slice_bits_size, max_slice_size + AV_INPUT_BUFFER_PADDING_SIZE); |