ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinha...@outlook.com> | Sat Mar 1 22:36:35 2025 +0100| [4d8b706b1d33e75eb30b289c152280d4535c40e6] | committer: Andreas Rheinhardt
avcodec/mpeg12dec: Don't count errors from first thread twice Compilers can not perform this optimization on their own given that they don't know that the different thread_context pointers don't alias. Also avoid using sequentially consistent operations with atomics when only a single thread accesses them. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=4d8b706b1d33e75eb30b289c152280d4535c40e6 --- libavcodec/mpeg12dec.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 14c028379e..92772acf5f 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -29,6 +29,7 @@ #define UNCHECKED_BITSTREAM_READER 1 #include <inttypes.h> +#include <stdatomic.h> #include "libavutil/attributes.h" #include "libavutil/emms.h" @@ -46,7 +47,6 @@ #include "hwaccel_internal.h" #include "hwconfig.h" #include "idctdsp.h" -#include "internal.h" #include "mpeg_er.h" #include "mpeg12.h" #include "mpeg12codecs.h" @@ -2252,6 +2252,7 @@ static int decode_chunks(AVCodecContext *avctx, AVFrame *picture, if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE) && !avctx->hwaccel) { + int error_count = 0; int i; av_assert0(avctx->thread_count > 1); @@ -2259,7 +2260,10 @@ static int decode_chunks(AVCodecContext *avctx, AVFrame *picture, &s2->thread_context[0], NULL, s->slice_count, sizeof(void *)); for (i = 0; i < s->slice_count; i++) - s2->er.error_count += s2->thread_context[i]->er.error_count; + error_count += atomic_load_explicit(&s2->thread_context[i]->er.error_count, + memory_order_relaxed); + atomic_store_explicit(&s2->er.error_count, error_count, + memory_order_relaxed); } ret = slice_end(avctx, picture, got_output); @@ -2321,13 +2325,17 @@ static int decode_chunks(AVCodecContext *avctx, AVFrame *picture, } if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE) && !avctx->hwaccel && s->slice_count) { + int error_count = 0; int i; avctx->execute(avctx, slice_decode_thread, s2->thread_context, NULL, s->slice_count, sizeof(void *)); for (i = 0; i < s->slice_count; i++) - s2->er.error_count += s2->thread_context[i]->er.error_count; + error_count += atomic_load_explicit(&s2->thread_context[i]->er.error_count, + memory_order_relaxed); + atomic_store_explicit(&s2->er.error_count, error_count, + memory_order_relaxed); s->slice_count = 0; } if (last_code == 0 || last_code == SLICE_MIN_START_CODE) { _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".