From patchwork Thu Mar 25 15:49:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 26605 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 64F9F44B722 for ; Thu, 25 Mar 2021 17:50:49 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 52D9C68AB79; Thu, 25 Mar 2021 17:50:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f41.google.com (mail-ej1-f41.google.com [209.85.218.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8389568A9A8 for ; Thu, 25 Mar 2021 17:50:36 +0200 (EET) Received: by mail-ej1-f41.google.com with SMTP id a7so3728016ejs.3 for ; Thu, 25 Mar 2021 08:50:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=wSJlso4jk23n+5bd8joO4eQ0Jwyv4V3Ua8LvXSP2wuM=; b=M9/cKWrbo7PW3OP0+Je4/jqDxbkqstMc4RNs6TzuxqjEanbqAfHXqfPVqwzdT+rJTZ HnaMl8YwBqfTsLshHJc2yjmlXB/0dzOgXvPizfA2ANIj5vGAnAd0a9YNHIRr2X4mi3zf T894XPmQEfMl74sXFlXmJ6quZA1J3EkWWFmiegX4ZxqTHxhmCe+Me3a6Dhuv8eVYRxgW VBzNoieILDUYjS1wyk46VC6OgMWx0n7jXBCOlrpDo6DALL1NU+LVLzDTlC4IvLbK9S6j 9an4y26EDVpHx+5wJ6vS7eyH+C9Od8/lua427QGGd/6Z+cYaADNZ68fEvOfUsynWy624 SICg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=wSJlso4jk23n+5bd8joO4eQ0Jwyv4V3Ua8LvXSP2wuM=; b=JOT21I7rUtrW1HkBfC475dIe0vy8UV0MK2ozK4rp8IcgacxS1S+FDzK3TA3q+LpcCw ijF0eMcnyP6MXeZwXpr7nDfZbo5yrqPvDUyRH5Q0iw+hVLYu0FhfuWia0mOJjQHPI6UL aIqQc8rYsCf/sLtZTIcdsSqtSVQDx6AimoPJ5A5jfT35xT/yuY3AM+Eun3zlOxm5pYiB 47zsq43behRB6fNl0AHUuqsqy4exPEuBNiPbj2mrZyxel67goz8qaJLDPXr8n+CGkhBH G9T1d9NV71ctN8i66NvSlHWA4mqxIh4gxcQnKf1B5vEusqFsFu3PI38F3p7/Ut7MWU51 +Bmw== X-Gm-Message-State: AOAM530VIdGm5ipn2IJO2s5Nw4Gaq73+IIeWwG6E64VFRdadEvgzIKIw lofhlubFpbjt+TLlaiPeF9BHJNkfhkbNqA== X-Google-Smtp-Source: ABdhPJwNlTZBl6d04tIiq3+I8yg9tycbxnXgI8Ro4Go3uKtGgcqhLef+vaOmAKAJJD+3jzi0FzA3qw== X-Received: by 2002:a17:907:2b03:: with SMTP id gc3mr10238085ejc.448.1616687435738; Thu, 25 Mar 2021 08:50:35 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc08960.dynamic.kabel-deutschland.de. [188.192.137.96]) by smtp.gmail.com with ESMTPSA id o6sm2859103edw.24.2021.03.25.08.50.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Mar 2021 08:50:35 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 25 Mar 2021 16:49:51 +0100 Message-Id: <20210325154956.2405162-7-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210325154956.2405162-1-andreas.rheinhardt@gmail.com> References: <20210325154956.2405162-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/12] avcodec: Remove cumbersome way of checking for amount of bytes left 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Several encoders used code like the following to check for the amount of bytes left in a PutBitContext: pb->buf_end - pb->buf - (put_bits_count(pb) >> 3) Besides the fact that using the pointers directly might pose a maintainence burden in the future this also leads to suboptimal code: The above code reads all three pointers (buf, buf_ptr and buf_end), but touching buf is unnecessary and switching to put_bytes_left() automatically fixes this. Signed-off-by: Andreas Rheinhardt --- libavcodec/asvenc.c | 2 +- libavcodec/ffv1enc_template.c | 2 +- libavcodec/huffyuvenc.c | 9 ++++----- libavcodec/ljpegenc.c | 4 ++-- libavcodec/mpegvideo_enc.c | 13 ++++++------- libavcodec/svq1enc.c | 3 +-- libavcodec/xsubenc.c | 2 +- 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/libavcodec/asvenc.c b/libavcodec/asvenc.c index 718ffa1836..2d8c310521 100644 --- a/libavcodec/asvenc.c +++ b/libavcodec/asvenc.c @@ -167,7 +167,7 @@ static inline int encode_mb(ASV1Context *a, int16_t block[6][64]) { int i; - av_assert0(a->pb.buf_end - a->pb.buf - (put_bits_count(&a->pb) >> 3) >= MAX_MB_SIZE); + av_assert0(put_bytes_left(&a->pb, 0) >= MAX_MB_SIZE); if (a->avctx->codec_id == AV_CODEC_ID_ASV1) { for (i = 0; i < 6; i++) diff --git a/libavcodec/ffv1enc_template.c b/libavcodec/ffv1enc_template.c index bc0add5ed7..8a4a387923 100644 --- a/libavcodec/ffv1enc_template.c +++ b/libavcodec/ffv1enc_template.c @@ -37,7 +37,7 @@ static av_always_inline int RENAME(encode_line)(FFV1Context *s, int w, return AVERROR_INVALIDDATA; } } else { - if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < w * 4) { + if (put_bytes_left(&s->pb, 0) < w * 4) { av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return AVERROR_INVALIDDATA; } diff --git a/libavcodec/huffyuvenc.c b/libavcodec/huffyuvenc.c index 28a5534535..2882433db5 100644 --- a/libavcodec/huffyuvenc.c +++ b/libavcodec/huffyuvenc.c @@ -443,7 +443,7 @@ static int encode_422_bitstream(HYuvContext *s, int offset, int count) const uint8_t *u = s->temp[1] + offset / 2; const uint8_t *v = s->temp[2] + offset / 2; - if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 2 * 4 * count) { + if (put_bytes_left(&s->pb, 0) < 2 * 4 * count) { av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } @@ -495,7 +495,7 @@ static int encode_plane_bitstream(HYuvContext *s, int width, int plane) { int i, count = width/2; - if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < count * s->bps / 2) { + if (put_bytes_left(&s->pb, 0) < count * s->bps / 2) { av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } @@ -657,7 +657,7 @@ static int encode_gray_bitstream(HYuvContext *s, int count) { int i; - if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 4 * count) { + if (put_bytes_left(&s->pb, 0) < 4 * count) { av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } @@ -702,8 +702,7 @@ static inline int encode_bgra_bitstream(HYuvContext *s, int count, int planes) { int i; - if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < - 4 * planes * count) { + if (put_bytes_left(&s->pb, 0) < 4 * planes * count) { av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } diff --git a/libavcodec/ljpegenc.c b/libavcodec/ljpegenc.c index 3c68c08a3c..056b80b4b5 100644 --- a/libavcodec/ljpegenc.c +++ b/libavcodec/ljpegenc.c @@ -86,7 +86,7 @@ FF_ENABLE_DEPRECATION_WARNINGS const int modified_predictor = y ? s->pred : 1; uint8_t *ptr = frame->data[0] + (linesize * y); - if (pb->buf_end - pb->buf - (put_bits_count(pb) >> 3) < width * 4 * 4) { + if (put_bytes_left(pb, 0) < width * 4 * 4) { av_log(avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } @@ -211,7 +211,7 @@ FF_ENABLE_DEPRECATION_WARNINGS #endif for (mb_y = 0; mb_y < mb_height; mb_y++) { - if (pb->buf_end - pb->buf - (put_bits_count(pb) >> 3) < + if (put_bytes_left(pb, 0) < mb_width * 4 * 3 * s->hsample[0] * s->vsample[0]) { av_log(avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 7eecfce27c..8731b0ad31 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1993,8 +1993,7 @@ FF_ENABLE_DEPRECATION_WARNINGS stuffing_count = ff_vbv_update(s, s->frame_bits); s->stuffing_bits = 8*stuffing_count; if (stuffing_count) { - if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < - stuffing_count + 50) { + if (put_bytes_left(&s->pb, 0) < stuffing_count + 50) { av_log(avctx, AV_LOG_ERROR, "stuffing too large\n"); return -1; } @@ -2911,7 +2910,7 @@ static void update_mb_info(MpegEncContext *s, int startcode) int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t size_increase) { - if ( s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold + if (put_bytes_left(&s->pb, 0) < threshold && s->slice_context_count == 1 && s->pb.buf == s->avctx->internal->byte_buffer) { int lastgob_pos = s->ptr_lastgob - s->pb.buf; @@ -2940,7 +2939,7 @@ int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t s s->ptr_lastgob = s->pb.buf + lastgob_pos; s->vbv_delay_ptr = s->pb.buf + vbv_pos; } - if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold) + if (put_bytes_left(&s->pb, 0) < threshold) return AVERROR(EINVAL); return 0; } @@ -3032,13 +3031,13 @@ static int encode_thread(AVCodecContext *c, void *arg){ + s->mb_width*MAX_MB_BYTES; ff_mpv_reallocate_putbitbuffer(s, MAX_MB_BYTES, size_increase); - if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){ + if (put_bytes_left(&s->pb, 0) < MAX_MB_BYTES){ av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } if(s->data_partitioning){ - if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES - || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){ + if (put_bytes_left(&s->pb2, 0) < MAX_MB_BYTES || + put_bytes_left(&s->tex_pb, 0) < MAX_MB_BYTES) { av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n"); return -1; } diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c index 4fac0c26e5..53f0b40a21 100644 --- a/libavcodec/svq1enc.c +++ b/libavcodec/svq1enc.c @@ -372,8 +372,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, int score[4] = { 0, 0, 0, 0 }, best; uint8_t *temp = s->scratchbuf; - if (s->pb.buf_end - s->pb.buf - - (put_bits_count(&s->pb) >> 3) < 3000) { // FIXME: check size + if (put_bytes_left(&s->pb, 0) < 3000) { // FIXME: check size av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } diff --git a/libavcodec/xsubenc.c b/libavcodec/xsubenc.c index ad7144db2d..36c5ab7223 100644 --- a/libavcodec/xsubenc.c +++ b/libavcodec/xsubenc.c @@ -63,7 +63,7 @@ static int xsub_encode_rle(PutBitContext *pb, const uint8_t *bitmap, x0 = 0; while (x0 < w) { // Make sure we have enough room for at least one run and padding - if (pb->size_in_bits - put_bits_count(pb) < 7*8) + if (put_bytes_left(pb, 1) < 7) return AVERROR_BUFFER_TOO_SMALL; x1 = x0;