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 B42744F0D7 for ; Sun, 15 Jun 2025 17:03:16 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id EF00B68DA03; Sun, 15 Jun 2025 19:58:53 +0300 (EEST) Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 4720068D9F1 for ; Sun, 15 Jun 2025 19:58:47 +0300 (EEST) Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-313a188174fso4002048a91.1 for ; Sun, 15 Jun 2025 09:58:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750006725; x=1750611525; 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=DXAf5K5d7BDnfPga9rC9sigTM9iYquvsY5FWlfLjcf4=; b=iPESU143mslZlK6zL3yQ4mwDn99nyQTNl+bG9g98+QuQYXdb3he1N+kjg6DL8km+Jm rtcNZI/7QIXT1LDy71FzO2eYFTdYIUvt0fQKJF9NyJSvIGrriehtAkjWaId6Qf+j7V7k mgCEWVbNIJrruI/coToKWIp5Nb5UnGuXb4g/UZ+HMPaAOgpdgTJPfcCIywrjJERvpdWh aDQvVbi/QjPFsWr3x5jcJapRzgvo2+NTBunk5FcDhDA0RLcCW3+4fxlYY6BwsuW7pXMm Jnh+twJ2OC65mLg5h4imngOrnnXqUDcUQqXu75Mww775n530FTfZNwsvQVbOFWmewiph sWSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750006725; x=1750611525; 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=DXAf5K5d7BDnfPga9rC9sigTM9iYquvsY5FWlfLjcf4=; b=Hns7QFngB7NiAPGFcHuzQvFG1nSpJD/qmV4eFUaVCoPNS0gVFPZASWz5L4x669EvAB R9OV5SJFK4f4BD1lVdA+qxnM0xFMs9ttww404CHe81hrFM3iwMxOCma0/XZz9wk4vMdN qy9suNLrJqQXFYLx4aET4ccUgkUYeV6Yhi2bDTMaLMJG7tcwh7hDhEXltl6wj2HwFtOu akppgiK9ekC9MMjNjHkDOTGp5fNhAbyqIebfePXTftkZERzDJRYt0zzBpIUsnayNjEBi a6iTQ8wH2+BxCzEKSWyuxtBBMDEToHnKzbdT9Tk6kQ+MoHZSP5SZVgFHMfbCcOpS+3nE U6fw== X-Gm-Message-State: AOJu0YxiftEsPoXLshuzQYsJHIUoRTbNnO2AXqGykIsduiG2m5Pi+CNG pyLkwb7J4xHmKFQpGTSDNcw2juvPgNa7uZ2zxHQ15RY2OOrLaDhSce2BqWhYDQ== X-Gm-Gg: ASbGncvpi7IphvYy+H9wYo81Dox6A8G2HDU6P8gBdH+SDsu6lugthhyYz+HripvmfoO UHPL5Ef5piyH2BZxZpfCq4c9PIn5/tvlGvwT33HKsrgyRg96u6IyqPQzQI+HEEN/Somi1s48gie 0tMgcHS0aiDFF0lfCZNasJ09DfKfkgQBdPgXoa1PiZgMLuE6qja57CZykwjyGp0SvBt9jkwu/i9 1bNnCzWZQoOG7pigpUfMYtpLp3aeNRRZAtvxardv1Q/HOvnvn9pQMhZH8+t0ZoK7NkYM5yXX+09 /dMv03HGD1abJmzx2vGerMzwpAKB4dLoBjR8wUWMC0Mz2W75VJ0bh1Pl5LJCTBMdgS4Now5r2U8 3WdWJDJC3lprQXzMm X-Google-Smtp-Source: AGHT+IFRqCrx+JffscEcI9Q0hqgGMegDDaQABUN/ftmu/hUBkjzJamsiQUvADAqr/VlAOj+XWgO/Lw== X-Received: by 2002:a17:90a:d604:b0:312:e73e:cded with SMTP id 98e67ed59e1d1-313e90c92c3mr10713598a91.16.1750006725474; Sun, 15 Jun 2025 09:58:45 -0700 (PDT) Received: from [127.0.0.1] (master.gitmailbox.com. [34.83.118.50]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-313c1b6d560sm6858759a91.49.2025.06.15.09.58.45 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 15 Jun 2025 09:58:45 -0700 (PDT) From: Andreas Rheinhardt X-Google-Original-From: Andreas Rheinhardt Message-Id: In-Reply-To: References: Date: Sun, 15 Jun 2025 16:54:33 +0000 Fcc: Sent MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 42/47] avcodec/mpegvideo: Allocate dc_val for each encoder slice 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 This fixes data races (which are UB) in the MPEG-4 and H.263+ encoder when predicting DC values; these encoders unconditionally read values from the line above the current line and only check lateron (via first_slice_line) whether said prediction can be used at all. It will also allow to remove said checks (by setting the entries to 1024 upon opening a new slice). The vsynth{1,2,3,_lena}-mpeg4-thread FATE tests were affected by this: https://fate.ffmpeg.org/report.cgi?slot=x86_64-archlinux-gcc-tsan-slices&time=20250613002615 Signed-off-by: Andreas Rheinhardt --- libavcodec/mpegvideo.c | 15 ++++++++++++--- libavcodec/mpegvideo_enc.c | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 6c76a382cc..4701267d81 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -179,6 +179,7 @@ static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src) COPY(block); COPY(start_mb_y); COPY(end_mb_y); + COPY(dc_val); COPY(ac_val); #undef COPY } @@ -235,7 +236,7 @@ av_cold int ff_mpv_init_context_frame(MpegEncContext *s) s->avctx->active_thread_type & FF_THREAD_SLICE) ? s->avctx->thread_count : 1; BufferPoolContext *const pools = &s->buffer_pools; - int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y; + int y_size, c_size, yc_size, mb_array_size, mv_table_size, x, y; int mb_height; if (s->encoding && s->avctx->slices) @@ -337,6 +338,9 @@ av_cold int ff_mpv_init_context_frame(MpegEncContext *s) } if (s->h263_pred || s->h263_aic || !s->encoding) { + // When encoding, each slice (and therefore each thread) + // gets its own ac_val and dc_val buffers in order to avoid + // races. size_t allslice_yc_size = yc_size * (s->encoding ? nb_slices : 1); if (s->out_format == FMT_H263) { /* ac values */ @@ -349,10 +353,15 @@ av_cold int ff_mpv_init_context_frame(MpegEncContext *s) // MN: we need these for error resilience of intra-frames // Allocating them unconditionally for decoders also means // that we don't need to reinitialize when e.g. h263_aic changes. - if (!FF_ALLOC_TYPED_ARRAY(s->dc_val_base, yc_size)) + + // y_size and therefore yc_size is always odd; allocate one element + // more for each encoder slice in order to be able to align each slice's + // dc_val to four in order to use aligned stores when cleaning dc_val. + allslice_yc_size += s->encoding * nb_slices; + if (!FF_ALLOC_TYPED_ARRAY(s->dc_val_base, allslice_yc_size)) return AVERROR(ENOMEM); s->dc_val = s->dc_val_base + s->b8_stride + 1; - for (i = 0; i < yc_size; i++) + for (size_t i = 0; i < allslice_yc_size; ++i) s->dc_val_base[i] = 1024; } diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index b4e0099567..1f581ec500 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -545,6 +545,7 @@ static av_cold int init_slice_buffers(MPVMainEncContext *const m) } if (s2->c.ac_val) { + s2->c.dc_val += offset + i; s2->c.ac_val += offset; offset += yc_size; } -- 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".