From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 0605B4FF70 for ; Fri, 4 Jul 2025 13:45:49 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id E4F3468FA4E; Fri, 4 Jul 2025 16:45:28 +0300 (EEST) Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id E5B7A68FA44 for ; Fri, 4 Jul 2025 16:45:21 +0300 (EEST) Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-749248d06faso836233b3a.2 for ; Fri, 04 Jul 2025 06:45:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751636720; x=1752241520; darn=ffmpeg.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date :references:in-reply-to:message-id:from:from:to:cc:subject:date :message-id:reply-to; bh=LdL6v3ZlzKF76YYEeQAbCxZlZM4dA4ZDrtlh2IADaD8=; b=eBjIIfxzVLMctwywOTpHvJ8XB7e7LRd3NvJ6dW130jRPzGMOTq0mWyyzvBJnRctVkg rljw1WxuNY2w565SGunIPrNyuFA1M0cK7zV/v81RZQ7vpPZxakVqD2iTHPVhGDlUf7UD TwUaOz/lfQiGF7ObvKimWBvAbaBkG3dKsFx7dYflSJ/ktklQJgFB5BDEDVOC2s0Mei4H pTrW27JPLsTEz9eiOOBbh0hJW2Vi8crq0ZRH2qWpfEFSVGq7Bar/EjuomdcRVZeNrroT +5QXqnITMAstqqTwOlJvgRtxHCJ7gSCldW3DiWuKxXX1GSBBF8XmOBesXDjtk6R4kxck mxdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751636720; x=1752241520; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date :references:in-reply-to:message-id:from:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=LdL6v3ZlzKF76YYEeQAbCxZlZM4dA4ZDrtlh2IADaD8=; b=PWOr0ZZyYgXmFbAQrQz0hiqzJQlXHLBhOHnwrEyDVrGCcvTTfTY4s4HYFVjNPuxi3q ugQTY1jYnybNfM7RER8/yfoDQoFIa7nDMtHSdhqJ5Gk8uehLU2b7NvDRySoa6X4fyd/Y htUrlXLWVe49uZMQc7b6NZGhFlGXprqNM+TH9ijUajVJnEKFt52nF4i23E4t8RTxc4cc 02Wh3QiMlwpTxfW0y7BJm+clcBuDc3QLMgvxpibYGvxULC3D2LFO9Gy14GgXCo5YXl7d eJT/eYRPHz6AP7Azs0yi2nwOeZmPu/PP41OonQitU0smA0owzKOH9gaukiTftzYsGuTm WNrw== X-Gm-Message-State: AOJu0Yz+Ne4PoNm/3octEoGUxSfeSZKQo/Jax731AHikP5adOMa1XLYd 7wF4dd3Dwi+CM6i/STnu3uB0KP3sq7Brb0uYAQ71s6TxZABYJpudp48u/ajqVg== X-Gm-Gg: ASbGncuxeJiT+uPqMnNFGuwvN9DEF2fGZ+eS3HeEnyT2+jPAp+grZnhKXZpRL4+z7AZ 1iRTbri69459RcrmbbWLyvjst+Z2SRJfsqAXU9R0EJRL8hwXrr9BqqGhmN/ooChaeccFq6VoF7P gS8CTk83UTlG/pbk9KYfad+m80ItR1tE+fA69MPyuNAMWowXDHlZ4+Du0D8CCA6OKx1hjf3WAbI LuDbw9IEbecpkPcrSaNIUYqEwxDJPww2kAyLKs7fWSJGmFw5vbLbNuAPWnSIcWNmFD4eb+SVca6 2AJf1s087scDQ59ODlWLCX6KGS0fnsTnMKqPKv9LEyMpw1Zv4FyxTQaKy0nOHvot0ZTHfm1Bb3f ogGnwC4lp4rDgBXZXCyIv+6pE5Bo= X-Google-Smtp-Source: AGHT+IHz7L7xL8DHb1+VKjSCrYp5M2u//rO2MW+paP3QPO5gitly//NVTdyJTd2wn8fUt2nJOxKd7Q== X-Received: by 2002:a05:6a00:22c7:b0:748:f1ba:9aff with SMTP id d2e1a72fcca58-74ce68e4dbbmr3377806b3a.5.1751636720113; Fri, 04 Jul 2025 06:45:20 -0700 (PDT) Received: from [127.0.0.1] (master.gitmailbox.com. [34.83.118.50]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74ce4180dd8sm2342048b3a.100.2025.07.04.06.45.19 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 04 Jul 2025 06:45:19 -0700 (PDT) From: Andreas Rheinhardt X-Google-Original-From: Andreas Rheinhardt Message-Id: In-Reply-To: References: X-Original-From: Andreas Rheinhardt Date: Fri, 04 Jul 2025 13:44:56 +0000 Fcc: Sent MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 3/4] avcodec/get_bits: Add get_bits_bytesize() X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: From: Andreas Rheinhardt And use it to avoid accesses to GetBitContext.buffer_end. Signed-off-by: Andreas Rheinhardt --- libavcodec/bitstream.h | 2 ++ libavcodec/bitstream_template.h | 8 ++++++++ libavcodec/get_bits.h | 15 +++++++++++++++ libavcodec/h263dec.c | 7 ++++--- libavcodec/h264_ps.c | 4 ++-- libavcodec/hevc/hevcdec.c | 2 +- libavcodec/hevc/ps.c | 6 +++--- libavcodec/mpeg12dec.c | 5 +++-- 8 files changed, 38 insertions(+), 11 deletions(-) diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h index 35b7873b9c..e4d96af710 100644 --- a/libavcodec/bitstream.h +++ b/libavcodec/bitstream.h @@ -82,6 +82,7 @@ # define bits_init8 bits_init8_le # define bits_tell bits_tell_le # define bits_size bits_size_le +# define bits_bytesize bits_bytesize_le # define bits_left bits_left_le # define bits_read_bit bits_read_bit_le # define bits_read_nz bits_read_nz_le @@ -111,6 +112,7 @@ # define bits_init8 bits_init8_be # define bits_tell bits_tell_be # define bits_size bits_size_be +# define bits_bytesize bits_bytesize_be # define bits_left bits_left_be # define bits_read_bit bits_read_bit_be # define bits_read_nz bits_read_nz_be diff --git a/libavcodec/bitstream_template.h b/libavcodec/bitstream_template.h index bbb8dfa555..773d40ef14 100644 --- a/libavcodec/bitstream_template.h +++ b/libavcodec/bitstream_template.h @@ -156,6 +156,14 @@ static inline int BS_FUNC(size)(const BSCTX *bc) return bc->size_in_bits; } +/** + * Return buffer size in bytes. + */ +static inline int BS_FUNC(bytesize)(const BSCTX *bc, int round_up) +{ + return (bc->size_in_bits + (round_up ? 7 : 0)) >> 3; +} + /** * Return the number of the bits left in a buffer. */ diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h index 1954296569..c64540cf95 100644 --- a/libavcodec/get_bits.h +++ b/libavcodec/get_bits.h @@ -76,6 +76,7 @@ typedef BitstreamContext GetBitContext; #define get_bits_count bits_tell +#define get_bits_bytesize bits_bytesize #define get_bits_left bits_left #define skip_bits_long bits_skip #define skip_bits bits_skip @@ -251,6 +252,20 @@ static inline int get_bits_count(const GetBitContext *s) return s->index; } +/** + * Get the size of the GetBitContext's buffer in bytes. + * + * @param s the GetBitContext + * @param round_up If set, the number of bits will be rounded up to full bytes; + * this does not matter if the number of bits is known to be + * a multiple of eight, e.g. if the GetBitContext has been + * initialized with init_get_bits8. + */ +static inline int get_bits_bytesize(const GetBitContext *s, int round_up) +{ + return (s->size_in_bits + (round_up ? 7 : 0)) >> 3; +} + /** * Skips the specified number of bits. * @param n the number of bits to skip, diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index b2d0f9c409..3821472e91 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -208,7 +208,8 @@ static int decode_slice(H263DecContext *const h) if (h->c.avctx->hwaccel) { const uint8_t *start = h->gb.buffer + get_bits_count(&h->gb) / 8; - ret = FF_HW_CALL(h->c.avctx, decode_slice, start, h->gb.buffer_end - start); + ret = FF_HW_CALL(h->c.avctx, decode_slice, start, + get_bits_bytesize(&h->gb, 0) - get_bits_count(&h->gb) / 8); // ensure we exit decode loop h->c.mb_y = h->c.mb_height; return ret; @@ -372,7 +373,7 @@ static int decode_slice(H263DecContext *const h) if (h->c.codec_id == AV_CODEC_ID_H263 && (h->c.workaround_bugs & FF_BUG_AUTODETECT) && get_bits_left(&h->gb) >= 64 && - AV_RB64(h->gb.buffer_end - 8) == 0xCDCDCDCDFC7F0000) { + AV_RB64(h->gb.buffer + (get_bits_bytesize(&h->gb, 0) - 8)) == 0xCDCDCDCDFC7F0000) { h->padding_bug_score += 32; } @@ -546,7 +547,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict, if (avctx->hwaccel) { ret = FF_HW_CALL(avctx, start_frame, NULL, - h->gb.buffer, h->gb.buffer_end - h->gb.buffer); + h->gb.buffer, get_bits_bytesize(&h->gb, 0)); if (ret < 0 ) return ret; } diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c index c698f1b80d..3a3cad7de7 100644 --- a/libavcodec/h264_ps.c +++ b/libavcodec/h264_ps.c @@ -294,7 +294,7 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx, if (!sps) return AVERROR(ENOMEM); - sps->data_size = gb->buffer_end - gb->buffer; + sps->data_size = get_bits_bytesize(gb, 1); if (sps->data_size > sizeof(sps->data)) { av_log(avctx, AV_LOG_DEBUG, "Truncating likely oversized SPS\n"); sps->data_size = sizeof(sps->data); @@ -712,7 +712,7 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct if (!pps) return AVERROR(ENOMEM); - pps->data_size = gb->buffer_end - gb->buffer; + pps->data_size = get_bits_bytesize(gb, 1); if (pps->data_size > sizeof(pps->data)) { av_log(avctx, AV_LOG_DEBUG, "Truncating likely oversized PPS " "(%"SIZE_SPECIFIER" > %"SIZE_SPECIFIER")\n", diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 797c9c76c9..21ecf063c5 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -2752,7 +2752,7 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) const HEVCPPS *const pps = s->pps; const HEVCSPS *const sps = pps->sps; const uint8_t *slice_data = gb->buffer + s->sh.data_offset; - const size_t slice_size = gb->buffer_end - gb->buffer - s->sh.data_offset; + const size_t slice_size = get_bits_bytesize(gb, 1) - s->sh.data_offset; int ctb_size = 1 << sps->log2_ctb_size; int more_data = 1; int x_ctb = 0; diff --git a/libavcodec/hevc/ps.c b/libavcodec/hevc/ps.c index 4b021ea9c1..57125d59c1 100644 --- a/libavcodec/hevc/ps.c +++ b/libavcodec/hevc/ps.c @@ -763,7 +763,7 @@ int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, { int i; int vps_id = get_bits(gb, 4); - ptrdiff_t nal_size = gb->buffer_end - gb->buffer; + ptrdiff_t nal_size = get_bits_bytesize(gb, 1); int ret = AVERROR_INVALIDDATA; uint64_t layer1_id_included = 0; unsigned vps_base_layer_internal_flag, vps_base_layer_available_flag; @@ -1710,7 +1710,7 @@ int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, av_log(avctx, AV_LOG_DEBUG, "Decoding SPS\n"); - sps->data_size = gb->buffer_end - gb->buffer; + sps->data_size = get_bits_bytesize(gb, 1); sps->data = av_memdup(gb->buffer, sps->data_size); if (!sps->data) { ret = AVERROR(ENOMEM); @@ -2165,7 +2165,7 @@ int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, const HEVCSPS *sps = NULL; const HEVCVPS *vps = NULL; int i, ret = 0; - ptrdiff_t nal_size = gb->buffer_end - gb->buffer; + ptrdiff_t nal_size = get_bits_bytesize(gb, 1); unsigned int pps_id = get_ue_golomb_long(gb); unsigned log2_parallel_merge_level_minus2; HEVCPPS *pps; diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 998f6aa2e5..3ea8d02e1b 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1635,6 +1635,7 @@ static int slice_decode_thread(AVCodecContext *c, void *arg) { Mpeg12SliceContext *const s = *(void **) arg; const uint8_t *buf = s->gb.buffer; + const uint8_t *end = buf + get_bits_bytesize(&s->gb, 0); int mb_y = s->c.start_mb_y; const int field_pic = s->c.picture_structure != PICT_FRAME; @@ -1644,7 +1645,7 @@ static int slice_decode_thread(AVCodecContext *c, void *arg) uint32_t start_code; int ret; - ret = mpeg_decode_slice(s, mb_y, &buf, s->gb.buffer_end - buf); + ret = mpeg_decode_slice(s, mb_y, &buf, end - buf); emms_c(); ff_dlog(c, "ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n", ret, s->c.resync_mb_x, s->c.resync_mb_y, s->c.mb_x, s->c.mb_y, @@ -1666,7 +1667,7 @@ static int slice_decode_thread(AVCodecContext *c, void *arg) return 0; start_code = -1; - buf = avpriv_find_start_code(buf, s->gb.buffer_end, &start_code); + buf = avpriv_find_start_code(buf, end, &start_code); if (start_code < SLICE_MIN_START_CODE || start_code > SLICE_MAX_START_CODE) return AVERROR_INVALIDDATA; mb_y = start_code - SLICE_MIN_START_CODE; -- ffmpeg-codebot _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".