From patchwork Tue Mar 26 10:13:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 12451 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 6F0A3447CE7 for ; Tue, 26 Mar 2019 12:13:47 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 50D9368A559; Tue, 26 Mar 2019 12:13:47 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA42868A4A3 for ; Tue, 26 Mar 2019 12:13:40 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id o10so2001673wmc.1 for ; Tue, 26 Mar 2019 03:13:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=HZASDh7r/4dYgJI+QtvWBnaHrUu7i9Mls6kE/ezC/do=; b=kxHlTzisLtEy+xqzNu9IoleUG+4QC6mABALAuEzeLDgVLYnJJia0eEWw7iclQu5bq2 97N2//jeUW0vsLzohYhoZqyzpPYzDfUWzxbxRaVlrb56Z3tqObxFrj4n3W9P2Z7ecIW4 Bez6NnoqcaePQPH7EFt9+h3YyJjhjR2789J10ledAqj9Rd4lw5gps/LhSKgPIH4aNaub AYaTcknKVuwxtrL0B9pZaSqYm69ShqRgxbGrBJ4BPpb2VEOHDaNA7eIUdPtKwbqjwmIx btcKxAePJ/4U4xKzBooQo17pTsZvQ+zzOk+Eg0Cy1rvoM8e1g/h0VzqjQK9b/1LiYacL lONQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=HZASDh7r/4dYgJI+QtvWBnaHrUu7i9Mls6kE/ezC/do=; b=mr7AIfeI+qWDjYzw7eiH7N1RnkQICvhkCDJL5EZCZrJ0LMt3Ii1208hAfAAyYPqA1B zDP2GrutwPSyx61AyFySGMuqQlpLmhiPCa0iGDeL4EFcumoXGT+GVF57lvxl5Vcp18MW 15asEUIFNDQ60crEN/QZxV+phik3DRYUhyVx+vhZBzlbLDdivmZq8HxCV5O82WIFvScj SBCqYVB5PFY/t3mIDQ1ONVO0YoWd4iCsgsbI4vigDsMAg5wud6Mnik+FiWwXWRgAgiww IpIb+FWPVB81V5FdaDRvHZhJ6QglaVC3SGtX2lFU/9LkA9cnCGP4nTD2pfeGtLw47ilN NSjg== X-Gm-Message-State: APjAAAWE+K3Ijxd0XvgL8hmDWcV+2qneL+m3qciZGVAdxjGFqtHP3sT0 Lec48o8J1jWmh0bbFPRxDOegV8d7 X-Google-Smtp-Source: APXvYqzr+DR7QCYTCVEfpfQxHnFRDTPNzjNqSi9HaDkJuYJIfc8pm2cPXpRcw/rxhKJ9a0eu8gU5DA== X-Received: by 2002:a1c:658a:: with SMTP id z132mr8901763wmb.92.1553595219729; Tue, 26 Mar 2019 03:13:39 -0700 (PDT) Received: from localhost.localdomain ([77.237.99.43]) by smtp.gmail.com with ESMTPSA id g19sm5446617wmh.17.2019.03.26.03.13.38 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Mar 2019 03:13:39 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Tue, 26 Mar 2019 11:13:30 +0100 Message-Id: <20190326101330.24496-1-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] avcodec/get_bits: unbreak get_bits_le() with cached reader X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/get_bits.h | 82 +++++++++++++++++++++++++++++------------ libavcodec/utvideodec.c | 4 +- 2 files changed, 60 insertions(+), 26 deletions(-) diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h index c2f267186e..c4ab607744 100644 --- a/libavcodec/get_bits.h +++ b/libavcodec/get_bits.h @@ -226,34 +226,32 @@ static inline int get_bits_count(const GetBitContext *s) } #if CACHED_BITSTREAM_READER -static inline void refill_32(GetBitContext *s) +static inline void refill_32(GetBitContext *s, int is_le) { #if !UNCHECKED_BITSTREAM_READER if (s->index >> 3 >= s->buffer_end - s->buffer) return; #endif -#ifdef BITSTREAM_READER_LE + if (is_le) s->cache = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache; -#else + else s->cache = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left); -#endif s->index += 32; s->bits_left += 32; } -static inline void refill_64(GetBitContext *s) +static inline void refill_64(GetBitContext *s, int is_le) { #if !UNCHECKED_BITSTREAM_READER if (s->index >> 3 >= s->buffer_end - s->buffer) return; #endif -#ifdef BITSTREAM_READER_LE + if (is_le) s->cache = AV_RL64(s->buffer + (s->index >> 3)); -#else + else s->cache = AV_RB64(s->buffer + (s->index >> 3)); -#endif s->index += 64; s->bits_left = 64; } @@ -385,7 +383,11 @@ static inline unsigned int get_bits(GetBitContext *s, int n) av_assert2(n>0 && n<=32); if (n > s->bits_left) { - refill_32(s); +#ifdef BITSTREAM_READER_LE + refill_32(s, 1); +#else + refill_32(s, 0); +#endif if (s->bits_left < 32) s->bits_left = n; } @@ -420,7 +422,7 @@ static inline unsigned int get_bits_le(GetBitContext *s, int n) #if CACHED_BITSTREAM_READER av_assert2(n>0 && n<=32); if (n > s->bits_left) { - refill_32(s); + refill_32(s, 1); if (s->bits_left < 32) s->bits_left = n; } @@ -446,7 +448,11 @@ static inline unsigned int show_bits(GetBitContext *s, int n) register unsigned int tmp; #if CACHED_BITSTREAM_READER if (n > s->bits_left) - refill_32(s); +#ifdef BITSTREAM_READER_LE + refill_32(s, 1); +#else + refill_32(s, 0); +#endif tmp = show_val(s, n); #else @@ -474,7 +480,11 @@ static inline void skip_bits(GetBitContext *s, int n) n -= skip; s->index += skip; } - refill_64(s); +#ifdef BITSTREAM_READER_LE + refill_64(s, 1); +#else + refill_64(s, 0); +#endif if (n) skip_remaining(s, n); } @@ -489,7 +499,11 @@ static inline unsigned int get_bits1(GetBitContext *s) { #if CACHED_BITSTREAM_READER if (!s->bits_left) - refill_64(s); +#ifdef BITSTREAM_READER_LE + refill_64(s, 1); +#else + refill_64(s, 0); +#endif #ifdef BITSTREAM_READER_LE return get_val(s, 1, 1); @@ -605,16 +619,8 @@ static inline int check_marker(void *logctx, GetBitContext *s, const char *msg) return bit; } -/** - * Initialize GetBitContext. - * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes - * larger than the actual read bits because some optimized bitstream - * readers read 32 or 64 bit at once and could read over the end - * @param bit_size the size of the buffer in bits - * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow. - */ -static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer, - int bit_size) +static inline int init_get_bits_xe(GetBitContext *s, const uint8_t *buffer, + int bit_size, int is_le) { int buffer_size; int ret = 0; @@ -634,12 +640,32 @@ static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer, s->index = 0; #if CACHED_BITSTREAM_READER - refill_64(s); + s->cache = 0; + s->bits_left = 0; + refill_64(s, is_le); #endif return ret; } +/** + * Initialize GetBitContext. + * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes + * larger than the actual read bits because some optimized bitstream + * readers read 32 or 64 bit at once and could read over the end + * @param bit_size the size of the buffer in bits + * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow. + */ +static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer, + int bit_size) +{ +#ifdef BITSTREAM_READER_LE + return init_get_bits_xe(s, buffer, bit_size, 1); +#else + return init_get_bits_xe(s, buffer, bit_size, 0); +#endif +} + /** * Initialize GetBitContext. * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes @@ -656,6 +682,14 @@ static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer, return init_get_bits(s, buffer, byte_size * 8); } +static inline int init_get_bits8_le(GetBitContext *s, const uint8_t *buffer, + int byte_size) +{ + if (byte_size > INT_MAX / 8 || byte_size < 0) + byte_size = -1; + return init_get_bits_xe(s, buffer, byte_size * 8, 1); +} + static inline const uint8_t *align_get_bits(GetBitContext *s) { int n = -get_bits_count(s) & 7; diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c index 3891df3570..d5af9d53a8 100644 --- a/libavcodec/utvideodec.c +++ b/libavcodec/utvideodec.c @@ -258,11 +258,11 @@ static int decode_plane(UtvideoContext *c, int plane_no, GetBitContext cbit, pbit; uint8_t *dest, *p; - ret = init_get_bits8(&cbit, c->control_stream[plane_no][slice], c->control_stream_size[plane_no][slice]); + ret = init_get_bits8_le(&cbit, c->control_stream[plane_no][slice], c->control_stream_size[plane_no][slice]); if (ret < 0) return ret; - ret = init_get_bits8(&pbit, c->packed_stream[plane_no][slice], c->packed_stream_size[plane_no][slice]); + ret = init_get_bits8_le(&pbit, c->packed_stream[plane_no][slice], c->packed_stream_size[plane_no][slice]); if (ret < 0) return ret;