* [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
@ 2025-05-07 11:58 Andreas Rheinhardt
2025-05-07 17:57 ` softworkz .
2025-05-16 14:06 ` Andreas Rheinhardt
0 siblings, 2 replies; 10+ messages in thread
From: Andreas Rheinhardt @ 2025-05-07 11:58 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1: Type: text/plain, Size: 29 bytes --]
Patches attached.
- Andreas
[-- Attachment #2: 0001-avutil-avassert-Add-av_unreachable-and-av_assume-mac.patch --]
[-- Type: text/x-patch, Size: 2936 bytes --]
From dd62fb6eeb9a5bc9a870430a93c6de1aca4be1d6 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 14:03:25 +0200
Subject: [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume()
macros
Useful to let the compiler and static analyzers know that
something is unreachable without adding an av_assert
(which would be either dead for the compiler or add runtime
overhead) for this.
The implementation used here enforces the use of a message
to provide a reason why a particular code is supposed to be
unreachable.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
doc/APIchanges | 3 +++
libavutil/avassert.h | 42 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/doc/APIchanges b/doc/APIchanges
index 75d66f87f3..78dcaa8009 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2025-03-28
API changes, most recent first:
+2025-05-06 - xxxxxxxxxx - lavu 60.xx.100 - avassert.h
+ Add av_unreachable() and av_assume() macros.
+
2025-04-21 - xxxxxxxxxx - lavu 60.2.100 - log.h
Add AV_CLASS_CATEGORY_HWDEVICE.
diff --git a/libavutil/avassert.h b/libavutil/avassert.h
index 1895fb7551..d0d5aa0c7e 100644
--- a/libavutil/avassert.h
+++ b/libavutil/avassert.h
@@ -31,6 +31,7 @@
#ifdef HAVE_AV_CONFIG_H
# include "config.h"
#endif
+#include "attributes.h"
#include "log.h"
#include "macros.h"
@@ -75,4 +76,45 @@
*/
void av_assert0_fpu(void);
+/**
+ * Asserts that are used as compiler optimization hints depending
+ * upon ASSERT_LEVEL and NBDEBUG.
+ *
+ * Undefined behaviour occurs if execution reaches a point marked
+ * with av_unreachable() or if a condition used with av_assume()
+ * is false.
+ *
+ * The condition used with av_assume() should not have side-effects
+ * and should be visible to the compiler.
+ */
+#if defined(ASSERT_LEVEL) ? ASSERT_LEVEL > 0 : !defined(HAVE_AV_CONFIG_H) && !defined(NDEBUG)
+#define av_unreachable(msg) \
+do { \
+ av_log(NULL, AV_LOG_PANIC, \
+ "Code at %s:%d that was supposedly unreachable due to '%s' reached\n", \
+ __FILE__, __LINE__, msg); \
+ abort(); \
+} while (0)
+#define av_assume(cond) av_assert0(cond)
+#else
+#if AV_GCC_VERSION_AT_LEAST(4, 5) || AV_HAS_BUILTIN(__builtin_unreachable)
+#define av_unreachable(msg) __builtin_unreachable()
+#elif defined(_MSC_VER)
+#define av_unreachable(msg) __assume(0)
+#define av_assume(cond) __assume(cond)
+#elif __STDC_VERSION__ >= 202311L
+#include <stddef.h>
+#define av_unreachable(msg) unreachable()
+#else
+#define av_unreachable(msg) ((void)0)
+#endif
+
+#ifndef av_assume
+#define av_assume(cond) do { \
+ if (!(cond)) \
+ av_unreachable(); \
+} while (0)
+#endif
+#endif
+
#endif /* AVUTIL_AVASSERT_H */
--
2.45.2
[-- Attachment #3: 0002-avcodec-amrwbdec-Mark-default-switch-as-unreachable.patch --]
[-- Type: text/x-patch, Size: 1081 bytes --]
From 042dc507caa21b688e2fde067607ababd8df7c69 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 14:19:33 +0200
Subject: [PATCH 02/21] avcodec/amrwbdec: Mark default switch as unreachable
Alternative fix for Coverity issue #1473499
instead of a3bb269db92601e2dc0e99352468d02f7b26c7c2.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/amrwbdec.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index 929fc30a3c..91fb870a64 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -556,7 +556,8 @@ static void decode_fixed_vector(float *fixed_vector, const uint16_t *pulse_hi,
((int) pulse_hi[i] << 11), 4, 1);
break;
default:
- av_assert2(0);
+ av_unreachable("Everything >= MODE_SID is impossible: MODE_SID is patchwelcome,"
+ "> MODE_SID is invalid");
}
memset(fixed_vector, 0, sizeof(float) * AMRWB_SFR_SIZE);
--
2.45.2
[-- Attachment #4: 0003-avcodec-proresenc_anatoliy-Mark-impossible-case-as-u.patch --]
[-- Type: text/x-patch, Size: 2264 bytes --]
From ff5bf386642b1d4917455b035880a84b23b9b2a2 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 14:24:33 +0200
Subject: [PATCH 03/21] avcodec/proresenc_anatoliy: Mark impossible case as
unreachable
Alternative fix for fix Coverity issue 1440385 (instead of
6106177ad66ab28f44520534f386239d2405eeab).
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/proresenc_anatoliy.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/libavcodec/proresenc_anatoliy.c b/libavcodec/proresenc_anatoliy.c
index fc69b94780..2abb554bd4 100644
--- a/libavcodec/proresenc_anatoliy.c
+++ b/libavcodec/proresenc_anatoliy.c
@@ -27,6 +27,7 @@
* Known FOURCCs: 'ap4h' (444), 'apch' (HQ), 'apcn' (422), 'apcs' (LT), 'acpo' (Proxy)
*/
+#include "libavutil/avassert.h"
#include "libavutil/mem.h"
#include "libavutil/mem_internal.h"
#include "libavutil/opt.h"
@@ -845,20 +846,25 @@ static av_cold int prores_encode_init(AVCodecContext *avctx)
}
if (avctx->profile == AV_PROFILE_UNKNOWN) {
- if (avctx->pix_fmt == AV_PIX_FMT_YUV422P10) {
+ switch (avctx->pix_fmt) {
+ case AV_PIX_FMT_YUV422P10:
avctx->profile = AV_PROFILE_PRORES_STANDARD;
av_log(avctx, AV_LOG_INFO,
"encoding with ProRes standard (apcn) profile\n");
- } else if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10) {
+ break;
+ case AV_PIX_FMT_YUV444P10:
avctx->profile = AV_PROFILE_PRORES_4444;
av_log(avctx, AV_LOG_INFO,
"encoding with ProRes 4444 (ap4h) profile\n");
- } else if (avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) {
+ break;
+ case AV_PIX_FMT_YUVA444P10:
avctx->profile = AV_PROFILE_PRORES_4444;
av_log(avctx, AV_LOG_INFO,
"encoding with ProRes 4444+ (ap4h) profile\n");
- } else
- av_assert0(0);
+ break;
+ default:
+ av_unreachable("Already checked via AVCodec.pix_fmts");
+ }
} else if (avctx->profile < AV_PROFILE_PRORES_PROXY
|| avctx->profile > AV_PROFILE_PRORES_XQ) {
av_log(
--
2.45.2
[-- Attachment #5: 0004-avcodec-mpeg4videodec-Mark-impossible-switch-case-as.patch --]
[-- Type: text/x-patch, Size: 1348 bytes --]
From da05e644ba3f3e7b44e13c2ec36823fbe783db23 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 14:35:31 +0200
Subject: [PATCH 04/21] avcodec/mpeg4videodec: Mark impossible switch case as
unreachable
Alternative to 8fc649b931a3cbc3a2dd9b50b75a9261a2fb4b49.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/mpeg4videodec.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
index e21f1d24a2..45087f3650 100644
--- a/libavcodec/mpeg4videodec.c
+++ b/libavcodec/mpeg4videodec.c
@@ -24,6 +24,7 @@
#include "config_components.h"
+#include "libavutil/avassert.h"
#include "libavutil/internal.h"
#include "libavutil/opt.h"
#include "libavutil/thread.h"
@@ -605,7 +606,9 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g
ctx->sprite_shift[1] = alpha + beta + rho - min_ab + 2;
break;
default:
- av_assert0(0);
+ av_unreachable("num_sprite_warping_points outside of 0..3 results in an error"
+ "in which num_sprite_warping_points is reset to zero");
+ break;
}
/* try to simplify the situation */
if (sprite_delta[0][0] == a << ctx->sprite_shift[0] &&
--
2.45.2
[-- Attachment #6: 0005-avcodec-pcm-dvdenc-Mark-unreachable-default-cases-as.patch --]
[-- Type: text/x-patch, Size: 1518 bytes --]
From 987145fd34dba2266f9bc489cb4f9cba308fecd7 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 14:49:59 +0200
Subject: [PATCH 05/21] avcodec/pcm-dvdenc: Mark unreachable default cases as
unreachable
Fixes a Clang warning when asserts are disabled:
"variable 'quant' is used uninitialized whenever switch default is taken
[-Wsometimes-uninitialized]"
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/pcm-dvdenc.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/libavcodec/pcm-dvdenc.c b/libavcodec/pcm-dvdenc.c
index b1f01ee323..10ce478125 100644
--- a/libavcodec/pcm-dvdenc.c
+++ b/libavcodec/pcm-dvdenc.c
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "avcodec.h"
#include "bytestream.h"
@@ -45,7 +46,7 @@ static av_cold int pcm_dvd_encode_init(AVCodecContext *avctx)
freq = 1;
break;
default:
- av_assert1(0);
+ av_unreachable("Already checked via AVCodec.supported_samplerates");
}
switch (avctx->sample_fmt) {
@@ -58,7 +59,7 @@ static av_cold int pcm_dvd_encode_init(AVCodecContext *avctx)
quant = 2;
break;
default:
- av_assert1(0);
+ av_unreachable("Already checked via AVCodec.sample_fmts");
}
avctx->bits_per_coded_sample = 16 + quant * 4;
--
2.45.2
[-- Attachment #7: 0006-avcodec-vlc-Make-code-more-readable-with-av_unreacha.patch --]
[-- Type: text/x-patch, Size: 1258 bytes --]
From a082a95be463337f8e10342b7eec380cf54d2ea6 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 15:18:45 +0200
Subject: [PATCH 06/21] avcodec/vlc: Make code more readable with
av_unreachable
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/vlc.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/libavcodec/vlc.c b/libavcodec/vlc.c
index c49c801181..ee6ea37736 100644
--- a/libavcodec/vlc.c
+++ b/libavcodec/vlc.c
@@ -49,10 +49,11 @@
v = *(const uint16_t *)ptr; \
break; \
case 4: \
- default: \
- av_assert1(size == 4); \
v = *(const uint32_t *)ptr; \
break; \
+ default: \
+ av_unreachable("Only uint8/16/32_t are used"); \
+ break; \
} \
}
--
2.45.2
[-- Attachment #8: 0007-avcodec-utvideoenc-Remove-always-false-pixel-format-.patch --]
[-- Type: text/x-patch, Size: 1184 bytes --]
From 595ea69554f46aee7924c0fe89d6bf344cc4bf38 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 15:32:18 +0200
Subject: [PATCH 07/21] avcodec/utvideoenc: Remove always-false pixel format
check
Mark it as unreachable instead.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/utvideoenc.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/libavcodec/utvideoenc.c b/libavcodec/utvideoenc.c
index be503d78c6..e35f0a82f4 100644
--- a/libavcodec/utvideoenc.c
+++ b/libavcodec/utvideoenc.c
@@ -24,6 +24,7 @@
* Ut Video encoder
*/
+#include "libavutil/avassert.h"
#include "libavutil/imgutils.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mem.h"
@@ -143,9 +144,7 @@ static av_cold int utvideo_encode_init(AVCodecContext *avctx)
original_format = UTVIDEO_444;
break;
default:
- av_log(avctx, AV_LOG_ERROR, "Unknown pixel format: %d\n",
- avctx->pix_fmt);
- return AVERROR_INVALIDDATA;
+ av_unreachable("Already checked via AVCodec.pix_fmts");
}
ff_bswapdsp_init(&c->bdsp);
--
2.45.2
[-- Attachment #9: 0008-avcodec-dolby_e_parse-Use-av_unreachable-instead-of-.patch --]
[-- Type: text/x-patch, Size: 1170 bytes --]
From a4d92e242acb6c840b61577d2850483f3946a938 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 15:51:32 +0200
Subject: [PATCH 08/21] avcodec/dolby_e_parse: Use av_unreachable instead of
av_assert0(0)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/dolby_e_parse.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libavcodec/dolby_e_parse.c b/libavcodec/dolby_e_parse.c
index ffedcd99a4..fc20eae5b4 100644
--- a/libavcodec/dolby_e_parse.c
+++ b/libavcodec/dolby_e_parse.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "libavutil/avassert.h"
#include "get_bits.h"
#include "put_bits.h"
#include "dolby_e.h"
@@ -88,7 +89,7 @@ int ff_dolby_e_convert_input(DBEContext *s, int nb_words, int key)
AV_WB24(dst, AV_RB24(src) ^ key);
break;
default:
- av_assert0(0);
+ av_unreachable("ff_dolby_e_parse_header() only sets 16, 20, 24 and errors out otherwise");
}
return init_get_bits(&s->gb, s->buffer, nb_words * s->word_bits);
--
2.45.2
[-- Attachment #10: 0009-avcodec-put_bits-Allow-to-mark-places-where-PutBitCo.patch --]
[-- Type: text/x-patch, Size: 1198 bytes --]
From 9b87978fb97f8bed9d53c41830c1bf457dd63703 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 24 May 2024 16:33:47 +0200
Subject: [PATCH 09/21] avcodec/put_bits: Allow to mark places where
PutBitContext is flushed
This will allow the compiler to optimize the "is the cache full?"
branches away from some put_bits().
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/put_bits.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/libavcodec/put_bits.h b/libavcodec/put_bits.h
index 56c3f4cc6d..c3eee622d4 100644
--- a/libavcodec/put_bits.h
+++ b/libavcodec/put_bits.h
@@ -74,6 +74,16 @@ static inline void init_put_bits(PutBitContext *s, uint8_t *buffer,
s->bit_buf = 0;
}
+/**
+ * Inform the compiler that a PutBitContext is flushed (i.e. if it has just
+ * been initialized or flushed). Undefined behaviour occurs if this is used
+ * with a PutBitContext for which this is not true.
+ */
+static inline void put_bits_assume_flushed(const PutBitContext *s)
+{
+ av_assume(s->bit_left == BUF_BITS);
+}
+
/**
* @return the total number of bits written to the bitstream.
*/
--
2.45.2
[-- Attachment #11: 0010-avcodec-e-ac3enc-Inform-compiler-about-PutBitContext.patch --]
[-- Type: text/x-patch, Size: 1622 bytes --]
From acddc7a58f3f36f9360282938e935079666865f4 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 24 May 2024 16:43:31 +0200
Subject: [PATCH 10/21] avcodec/e?ac3enc: Inform compiler about PutBitContext
being blank
This turned out to be very beneficial: For GCC 13, the codesize
of ac3_output_frame_header went down from 4522B to 1247B and
from 10762B to 9298B for eac3_output_frame_header. For Clang 17,
the numbers went down from 3923B to 2477B and from 8338B to 6548B
(always with -O3).
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/ac3enc.c | 2 ++
libavcodec/eac3enc.c | 2 ++
2 files changed, 4 insertions(+)
diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c
index 3649289865..a1783577c5 100644
--- a/libavcodec/ac3enc.c
+++ b/libavcodec/ac3enc.c
@@ -1638,6 +1638,8 @@ static void ac3_output_frame_header(AC3EncodeContext *s, PutBitContext *pb)
{
AC3EncOptions *opt = &s->options;
+ put_bits_assume_flushed(pb);
+
put_bits(pb, 16, 0x0b77); /* frame header */
put_bits(pb, 16, 0); /* crc1: will be filled later */
put_bits(pb, 2, s->bit_alloc.sr_code);
diff --git a/libavcodec/eac3enc.c b/libavcodec/eac3enc.c
index 3590b821a3..10b1ab337c 100644
--- a/libavcodec/eac3enc.c
+++ b/libavcodec/eac3enc.c
@@ -135,6 +135,8 @@ static void eac3_output_frame_header(AC3EncodeContext *s, PutBitContext *pb)
int blk, ch;
AC3EncOptions *opt = &s->options;
+ put_bits_assume_flushed(pb);
+
put_bits(pb, 16, 0x0b77); /* sync word */
/* BSI header */
--
2.45.2
[-- Attachment #12: 0011-avcodec-speedhqenc-Use-av_unreachable-for-unreachabl.patch --]
[-- Type: text/x-patch, Size: 1042 bytes --]
From 9948d8ca50aa17998218af236966d8cad7388bf4 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 24 May 2024 17:24:59 +0200
Subject: [PATCH 11/21] avcodec/speedhqenc: Use av_unreachable() for
unreachable condition
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/speedhqenc.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libavcodec/speedhqenc.c b/libavcodec/speedhqenc.c
index ecba2cd840..b2e5eda152 100644
--- a/libavcodec/speedhqenc.c
+++ b/libavcodec/speedhqenc.c
@@ -27,6 +27,7 @@
* SpeedHQ encoder.
*/
+#include "libavutil/avassert.h"
#include "libavutil/thread.h"
#include "avcodec.h"
@@ -259,7 +260,7 @@ static av_cold int speedhq_encode_init(AVCodecContext *avctx)
avctx->codec_tag = MKTAG('S','H','Q','4');
break;
default:
- av_assert0(0);
+ av_unreachable("Already checked via AVCodec.pix_fmts");
}
m->encode_picture_header = speedhq_encode_picture_header;
--
2.45.2
[-- Attachment #13: 0012-avcodec-wmaenc-Use-av_unreachable-instead-of-av_asse.patch --]
[-- Type: text/x-patch, Size: 2236 bytes --]
From 7b2f71bf623a7105b65ac1ca95186cbda80c8122 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sat, 25 May 2024 00:55:18 +0200
Subject: [PATCH 12/21] avcodec/wmaenc: Use av_unreachable() instead of
av_assert0(0)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/wmaenc.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libavcodec/wmaenc.c b/libavcodec/wmaenc.c
index 889306aebd..51487b72b5 100644
--- a/libavcodec/wmaenc.c
+++ b/libavcodec/wmaenc.c
@@ -79,7 +79,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
AV_WL32(extradata, flags1);
AV_WL16(extradata + 4, flags2);
} else {
- av_assert0(0);
+ av_unreachable("This function is only used with WMAV1/2 encoders");
}
avctx->extradata = extradata;
s->use_exp_vlc = flags2 & 0x0001;
@@ -206,7 +206,7 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
// FIXME remove duplication relative to decoder
if (s->use_variable_block_len) {
- av_assert0(0); // FIXME not implemented
+ av_unreachable("use_variable_block_len unimplemented, set to 0 during init");
} else {
/* fixed block len */
s->next_block_len_bits = s->frame_len_bits;
@@ -306,7 +306,8 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
if (s->use_exp_vlc) {
encode_exp_vlc(s, ch, fixed_exp);
} else {
- av_assert0(0); // FIXME not implemented
+ av_unreachable("use_exp_vlc always set to 1 during init");
+ // FIXME not implemented
// encode_exp_lsp(s, ch);
}
}
@@ -365,7 +366,7 @@ static int encode_frame(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
init_put_bits(&s->pb, buf, buf_size);
if (s->use_bit_reservoir)
- av_assert0(0); // FIXME not implemented
+ av_unreachable("use_bit_reseroir unimplemented, set to 0 during init");
else if (encode_block(s, src_coefs, total_gain) < 0)
return INT_MAX;
--
2.45.2
[-- Attachment #14: 0013-avcodec-mpegvideo_-dec-motion-Mark-unreachable-code-.patch --]
[-- Type: text/x-patch, Size: 1292 bytes --]
From bb47bd8cd86cbb9a5dd4567912895ad136ce4c73 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Fri, 24 May 2024 18:16:00 +0200
Subject: [PATCH 13/21] avcodec/mpegvideo_{dec,motion}: Mark unreachable code
as unreachable
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/mpegvideo_dec.c | 2 +-
libavcodec/mpegvideo_motion.c | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/libavcodec/mpegvideo_dec.c b/libavcodec/mpegvideo_dec.c
index 4019b4f0da..47b86d5897 100644
--- a/libavcodec/mpegvideo_dec.c
+++ b/libavcodec/mpegvideo_dec.c
@@ -834,7 +834,7 @@ static inline void MPV_motion_lowres(MpegEncContext *s,
}
break;
default:
- av_assert2(0);
+ av_unreachable("No other mpegvideo MV types exist");
}
}
diff --git a/libavcodec/mpegvideo_motion.c b/libavcodec/mpegvideo_motion.c
index edc4931092..a48b898dac 100644
--- a/libavcodec/mpegvideo_motion.c
+++ b/libavcodec/mpegvideo_motion.c
@@ -813,7 +813,8 @@ static av_always_inline void mpv_motion_internal(MpegEncContext *s,
}
break;
}
- default: av_assert2(0);
+ default:
+ av_unreachable("No other mpegvideo MV types exist");
}
}
--
2.45.2
[-- Attachment #15: 0014-avcodec-bitstream-Make-assert-check-more-strict.patch --]
[-- Type: text/x-patch, Size: 957 bytes --]
From 7f4ef07e63ca348320017e826c97cfe31ceb7352 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 3 Oct 2021 15:19:06 +0200
Subject: [PATCH 14/21] avcodec/bitstream: Make assert check more strict
The earlier code allowed callers to use arbitrary crap as
symbols_size as long as no symbols were present.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/vlc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavcodec/vlc.c b/libavcodec/vlc.c
index ee6ea37736..af09e83132 100644
--- a/libavcodec/vlc.c
+++ b/libavcodec/vlc.c
@@ -261,7 +261,7 @@ int ff_vlc_init_sparse(VLC *vlc, int nb_bits, int nb_codes,
if (ret < 0)
return ret;
- av_assert0(symbols_size <= 2 || !symbols);
+ av_assert0(symbols_size <= 2U);
j = 0;
#define COPY(condition)\
for (int i = 0; i < nb_codes; i++) { \
--
2.45.2
[-- Attachment #16: 0015-avcodec-mpegvideo-encs-Add-put_bits_assume_flushed-t.patch --]
[-- Type: text/x-patch, Size: 7368 bytes --]
From c4dbee4a3f1166093abb370be7572e804a5a8ec9 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 May 2025 13:03:17 +0200
Subject: [PATCH 15/21] avcodec/mpegvideo encs: Add put_bits_assume_flushed()
to encode_header
This allows the compiler to remove the implicit "Do I need to output
the PutBitContext buffer here?" checks.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/flvenc.c | 3 ++-
libavcodec/h261enc.c | 3 ++-
libavcodec/ituh263enc.c | 5 +++--
libavcodec/mpeg12enc.c | 5 +++++
libavcodec/mpeg4videoenc.c | 3 +++
libavcodec/msmpeg4enc.c | 3 ++-
libavcodec/rv10enc.c | 2 +-
libavcodec/rv20enc.c | 2 ++
libavcodec/speedhqenc.c | 3 +++
libavcodec/wmv2enc.c | 3 +++
10 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/libavcodec/flvenc.c b/libavcodec/flvenc.c
index df1a650222..8f07c3c778 100644
--- a/libavcodec/flvenc.c
+++ b/libavcodec/flvenc.c
@@ -22,13 +22,14 @@
#include "flvenc.h"
#include "mpegvideo.h"
#include "mpegvideoenc.h"
+#include "put_bits.h"
int ff_flv_encode_picture_header(MPVMainEncContext *const m)
{
MPVEncContext *const s = &m->s;
int format;
- align_put_bits(&s->pb);
+ put_bits_assume_flushed(&s->pb);
put_bits(&s->pb, 17, 1);
/* 0: H.263 escape codes 1: 11-bit escape codes */
diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c
index 70f5f2b09c..c217fb6233 100644
--- a/libavcodec/h261enc.c
+++ b/libavcodec/h261enc.c
@@ -35,6 +35,7 @@
#include "h261.h"
#include "h261enc.h"
#include "mpegvideoenc.h"
+#include "put_bits.h"
#define H261_MAX_RUN 26
#define H261_MAX_LEVEL 15
@@ -72,7 +73,7 @@ static int h261_encode_picture_header(MPVMainEncContext *const m)
MPVEncContext *const s = &h->s.s;
int temp_ref;
- align_put_bits(&s->pb);
+ put_bits_assume_flushed(&s->pb);
put_bits(&s->pb, 20, 0x10); /* PSC */
diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c
index 8be7ee4636..b9d903a220 100644
--- a/libavcodec/ituh263enc.c
+++ b/libavcodec/ituh263enc.c
@@ -46,6 +46,7 @@
#include "mathops.h"
#include "mpegutils.h"
#include "internal.h"
+#include "put_bits.h"
/**
* Table of number of bits a motion vector component needs.
@@ -230,6 +231,8 @@ static int h263_encode_picture_header(MPVMainEncContext *const m)
int best_error= INT_MAX;
int custom_pcf;
+ put_bits_assume_flushed(&s->pb);
+
if(s->c.h263_plus){
for(i=0; i<2; i++){
int div, error;
@@ -247,8 +250,6 @@ static int h263_encode_picture_header(MPVMainEncContext *const m)
coded_frame_rate= 1800000;
coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
- align_put_bits(&s->pb);
-
put_bits(&s->pb, 22, 0x20); /* PSC */
temp_ref= s->c.picture_number * (int64_t)coded_frame_rate * s->c.avctx->time_base.num / //FIXME use timestamp
(coded_frame_rate_base * (int64_t)s->c.avctx->time_base.den);
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index 8364368fde..e045a64d49 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -49,6 +49,7 @@
#include "mpegvideo.h"
#include "mpegvideoenc.h"
#include "profiles.h"
+#include "put_bits.h"
#include "rl.h"
#if CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER
@@ -155,6 +156,8 @@ static void mpeg1_encode_sequence_header(MPEG12EncContext *mpeg12)
AVRational aspect_ratio = s->c.avctx->sample_aspect_ratio;
int aspect_ratio_info;
+ put_bits_assume_flushed(&s->pb);
+
if (!(s->c.cur_pic.ptr->f->flags & AV_FRAME_FLAG_KEY))
return;
@@ -339,6 +342,8 @@ static int mpeg1_encode_picture_header(MPVMainEncContext *const m)
MPVEncContext *const s = &m->s;
const AVFrameSideData *side_data;
+ put_bits_assume_flushed(&s->pb);
+
mpeg1_encode_sequence_header(mpeg12);
/* MPEG-1 picture header */
diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c
index 775dab0d4a..f16dae8bf9 100644
--- a/libavcodec/mpeg4videoenc.c
+++ b/libavcodec/mpeg4videoenc.c
@@ -35,6 +35,7 @@
#include "mpeg4videoenc.h"
#include "mpegvideoenc.h"
#include "profiles.h"
+#include "put_bits.h"
#include "version.h"
/**
@@ -1070,6 +1071,8 @@ static int mpeg4_encode_picture_header(MPVMainEncContext *const m)
uint64_t time_incr;
int64_t time_div, time_mod;
+ put_bits_assume_flushed(&s->pb);
+
if (s->c.pict_type == AV_PICTURE_TYPE_I) {
if (!(s->c.avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)) {
if (s->c.avctx->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) // HACK, the reference sw is buggy
diff --git a/libavcodec/msmpeg4enc.c b/libavcodec/msmpeg4enc.c
index 4b03a7c10b..991d166c53 100644
--- a/libavcodec/msmpeg4enc.c
+++ b/libavcodec/msmpeg4enc.c
@@ -221,7 +221,8 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m)
find_best_tables(ms);
- align_put_bits(&s->pb);
+ put_bits_assume_flushed(&s->pb);
+
put_bits(&s->pb, 2, s->c.pict_type - 1);
put_bits(&s->pb, 5, s->c.qscale);
diff --git a/libavcodec/rv10enc.c b/libavcodec/rv10enc.c
index 984fe3379d..534b93fd81 100644
--- a/libavcodec/rv10enc.c
+++ b/libavcodec/rv10enc.c
@@ -36,7 +36,7 @@ int ff_rv10_encode_picture_header(MPVMainEncContext *const m)
MPVEncContext *const s = &m->s;
int full_frame= 0;
- align_put_bits(&s->pb);
+ put_bits_assume_flushed(&s->pb);
put_bits(&s->pb, 1, 1); /* marker */
diff --git a/libavcodec/rv20enc.c b/libavcodec/rv20enc.c
index 3211700f76..c91a2db57f 100644
--- a/libavcodec/rv20enc.c
+++ b/libavcodec/rv20enc.c
@@ -38,6 +38,8 @@ int ff_rv20_encode_picture_header(MPVMainEncContext *const m)
{
MPVEncContext *const s = &m->s;
+ put_bits_assume_flushed(&s->pb);
+
put_bits(&s->pb, 2, s->c.pict_type); //I 0 vs. 1 ?
put_bits(&s->pb, 1, 0); /* unknown bit */
put_bits(&s->pb, 5, s->c.qscale);
diff --git a/libavcodec/speedhqenc.c b/libavcodec/speedhqenc.c
index b2e5eda152..71df115d58 100644
--- a/libavcodec/speedhqenc.c
+++ b/libavcodec/speedhqenc.c
@@ -37,6 +37,7 @@
#include "mpegvideo.h"
#include "mpegvideodata.h"
#include "mpegvideoenc.h"
+#include "put_bits.h"
#include "rl.h"
#include "speedhq.h"
#include "speedhqenc.h"
@@ -101,6 +102,8 @@ static int speedhq_encode_picture_header(MPVMainEncContext *const m)
SpeedHQEncContext *const ctx = (SpeedHQEncContext*)m;
MPVEncContext *const s = &m->s;
+ put_bits_assume_flushed(&s->pb);
+
put_bits_le(&s->pb, 8, 100 - s->c.qscale * 2); /* FIXME why doubled */
put_bits_le(&s->pb, 24, 4); /* no second field */
diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c
index f9fd918dbf..592d1060d3 100644
--- a/libavcodec/wmv2enc.c
+++ b/libavcodec/wmv2enc.c
@@ -28,6 +28,7 @@
#include "msmpeg4enc.h"
#include "msmpeg4data.h"
#include "msmpeg4_vc1_data.h"
+#include "put_bits.h"
#include "wmv2.h"
#define WMV2_EXTRADATA_SIZE 4
@@ -78,6 +79,8 @@ static int wmv2_encode_picture_header(MPVMainEncContext *const m)
MSMPEG4EncContext *const ms = &w->msmpeg4;
MPVEncContext *const s = &m->s;
+ put_bits_assume_flushed(&s->pb);
+
put_bits(&s->pb, 1, s->c.pict_type - 1);
if (s->c.pict_type == AV_PICTURE_TYPE_I)
put_bits(&s->pb, 7, 0);
--
2.45.2
[-- Attachment #17: 0016-avcodec-rv20enc-Use-av_assert1-instead-of-av_assert0.patch --]
[-- Type: text/x-patch, Size: 1312 bytes --]
From 86d3dc6b365e22c2c9fb4ce1525bb5e6918d5576 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 May 2025 13:23:48 +0200
Subject: [PATCH 16/21] avcodec/rv20enc: Use av_assert1() instead of
av_assert0()
There is really no good reason to perform these checks in
release builds.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/rv20enc.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/libavcodec/rv20enc.c b/libavcodec/rv20enc.c
index c91a2db57f..092dc7d75b 100644
--- a/libavcodec/rv20enc.c
+++ b/libavcodec/rv20enc.c
@@ -50,12 +50,12 @@ int ff_rv20_encode_picture_header(MPVMainEncContext *const m)
put_bits(&s->pb, 1, s->c.no_rounding);
- av_assert0(s->c.f_code == 1);
- av_assert0(!s->c.unrestricted_mv);
- av_assert0(!s->c.alt_inter_vlc);
- av_assert0(!s->c.umvplus);
- av_assert0(s->c.modified_quant==1);
- av_assert0(s->c.loop_filter==1);
+ av_assert1(s->c.f_code == 1);
+ av_assert1(!s->c.unrestricted_mv);
+ av_assert1(!s->c.alt_inter_vlc);
+ av_assert1(!s->c.umvplus);
+ av_assert1(s->c.modified_quant == 1);
+ av_assert1(s->c.loop_filter == 1);
s->c.h263_aic = s->c.pict_type == AV_PICTURE_TYPE_I;
if (s->c.h263_aic) {
--
2.45.2
[-- Attachment #18: 0017-avcodec-vp9-Replace-av_assert-0-by-av_unreachable.patch --]
[-- Type: text/x-patch, Size: 1039 bytes --]
From a32835e7db07ce1ac3c222b0e1cc738afb962a56 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 May 2025 16:06:40 +0200
Subject: [PATCH 17/21] avcodec/vp9: Replace av_assert(0) by av_unreachable()
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/vp9.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c
index fd416eed3a..141f0941b4 100644
--- a/libavcodec/vp9.c
+++ b/libavcodec/vp9.c
@@ -1140,7 +1140,8 @@ static void decode_sb(VP9TileData *td, int row, int col, VP9Filter *lflvl,
uvoff + (8 * hbs * bytesperpixel >> s->ss_h), bl + 1);
break;
default:
- av_assert0(0);
+ av_unreachable("ff_vp9_partition_tree only has "
+ "the four PARTITION_* terminal codes");
}
} else if (vpx_rac_get_prob_branchy(td->c, p[1])) {
bp = PARTITION_SPLIT;
--
2.45.2
[-- Attachment #19: 0018-avcodec-adpcm-Use-av_unreachable-instead-of-av_asser.patch --]
[-- Type: text/x-patch, Size: 909 bytes --]
From e92bf7933f70ae7c6fdcc5a40eb46a2a1e59f7a8 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 May 2025 16:27:44 +0200
Subject: [PATCH 18/21] avcodec/adpcm: Use av_unreachable() instead of
av_assert0()
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/adpcm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index e20b60e05f..622cf54b40 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -2319,7 +2319,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
) /* End of CASE */
default:
- av_assert0(0); // unsupported codec_id should not happen
+ av_unreachable("There are cases for all codec ids using adpcm_decode_frame");
}
if (avpkt->size && bytestream2_tell(&gb) == 0) {
--
2.45.2
[-- Attachment #20: 0019-avcodec-mjpegenc_common-Use-av_unreachable-instead-o.patch --]
[-- Type: text/x-patch, Size: 1540 bytes --]
From 2f457f8a6f0828c3479c89cc4405858fb74e640e Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 May 2025 17:06:15 +0200
Subject: [PATCH 19/21] avcodec/mjpegenc_common: Use av_unreachable() instead
of av_assert0(0)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/mjpegenc_common.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/libavcodec/mjpegenc_common.c b/libavcodec/mjpegenc_common.c
index e7a4f8f16a..21b3b19b93 100644
--- a/libavcodec/mjpegenc_common.c
+++ b/libavcodec/mjpegenc_common.c
@@ -304,7 +304,8 @@ void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb,
switch (avctx->codec_id) {
case AV_CODEC_ID_MJPEG: put_marker(pb, SOF0 ); break;
case AV_CODEC_ID_LJPEG: put_marker(pb, SOF3 ); break;
- default: av_assert0(0);
+ default: av_unreachable("ff_mjpeg_encode_picture_header only called by "
+ "AMV, LJPEG, MJPEG and the former has been ruled out");
}
put_bits(pb, 16, 8 + 3 * components);
@@ -375,7 +376,7 @@ void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb,
switch (avctx->codec_id) {
case AV_CODEC_ID_MJPEG: put_bits(pb, 8, 63); break; /* Se (not used) */
case AV_CODEC_ID_LJPEG: put_bits(pb, 8, 0); break; /* not used */
- default: av_assert0(0);
+ default: av_unreachable("Only LJPEG, MJPEG possible here");
}
put_bits(pb, 8, 0); /* Ah/Al (not used) */
--
2.45.2
[-- Attachment #21: 0020-avcodec-4xm-Use-av_unreachable-instead-of-av_assert0.patch --]
[-- Type: text/x-patch, Size: 847 bytes --]
From 43b37e3074a8ff298c1bbf7f0db320ef88c9bf49 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 May 2025 17:56:43 +0200
Subject: [PATCH 20/21] avcodec/4xm: Use av_unreachable() instead of
av_assert0(0)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/4xm.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c
index fd3a45f093..11a61a253e 100644
--- a/libavcodec/4xm.c
+++ b/libavcodec/4xm.c
@@ -337,7 +337,8 @@ static inline void mcdc(uint16_t *dst, const uint16_t *src, int log2w,
}
break;
default:
- av_assert0(0);
+ av_unreachable("log2w starts at 3 and gets only decremented during "
+ "recursive calls to decode_p_block");
}
}
--
2.45.2
[-- Attachment #22: 0021-avcodec-atrac3-Use-av_unreachable-instead-of-av_asse.patch --]
[-- Type: text/x-patch, Size: 840 bytes --]
From f2d151368382d8657c1a10d4a9edac619ff1ef7a Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 May 2025 18:03:59 +0200
Subject: [PATCH 21/21] avcodec/atrac3: Use av_unreachable() instead of
av_assert1(0)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/atrac3.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c
index faa3daa9e6..fe156fa482 100644
--- a/libavcodec/atrac3.c
+++ b/libavcodec/atrac3.c
@@ -526,7 +526,7 @@ static void reverse_matrixing(float *su1, float *su2, int *prev_code,
}
break;
default:
- av_assert1(0);
+ av_unreachable("curr_code/matrix_coeff_index_* values are stored in two bits");
}
}
}
--
2.45.2
[-- Attachment #23: Type: text/plain, Size: 251 bytes --]
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-07 11:58 [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros Andreas Rheinhardt
@ 2025-05-07 17:57 ` softworkz .
2025-05-07 18:29 ` James Almer
2025-05-16 14:06 ` Andreas Rheinhardt
1 sibling, 1 reply; 10+ messages in thread
From: softworkz . @ 2025-05-07 17:57 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Andreas
> Rheinhardt
> Sent: Mittwoch, 7. Mai 2025 13:59
> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
> Subject: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and
> av_assume() macros
>
> Patches attached.
>
> - Andreas
Hi Andreas,
from https://ffmpeg.org/developer.html#Submitting-patches-1
"..ensure the correct mime type is used (text/x-diff or text/x-patch or at least text/plain) and that only one patch is inline or attached per mail."
I'm saying that because the way you are submitting, Patchwork only ever recognizes the first attached patch, so - in this case - the remaining 20 patches are not checked by the CI runs.
It's also difficult to review patches that are submitted in this way, even more difficult to respond, as that requires to copy the patch into a text editor first, in order to add some synthetic quote marks ("> ") and when replying, it isn't clear to which of the patches the reply is corresponding to.
As long as there's no migration to a better way, why not try out making PRs to https://github.com/ffstaging/FFmpeg?
AFAIC, I'm quite happy with that route, it's totally painless (no SMTP trouble, no manual sending).
Best regards,
sw
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-07 17:57 ` softworkz .
@ 2025-05-07 18:29 ` James Almer
2025-05-07 18:54 ` softworkz .
0 siblings, 1 reply; 10+ messages in thread
From: James Almer @ 2025-05-07 18:29 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1.1.1: Type: text/plain, Size: 1452 bytes --]
On 5/7/2025 2:57 PM, softworkz . wrote:
>
>
>> -----Original Message-----
>> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Andreas
>> Rheinhardt
>> Sent: Mittwoch, 7. Mai 2025 13:59
>> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
>> Subject: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and
>> av_assume() macros
>>
>> Patches attached.
>>
>> - Andreas
>
> Hi Andreas,
>
> from https://ffmpeg.org/developer.html#Submitting-patches-1
>
> "..ensure the correct mime type is used (text/x-diff or text/x-patch or at least text/plain) and that only one patch is inline or attached per mail."
>
> I'm saying that because the way you are submitting, Patchwork only ever recognizes the first attached patch, so - in this case - the remaining 20 patches are not checked by the CI runs.
> It's also difficult to review patches that are submitted in this way, even more difficult to respond, as that requires to copy the patch into a text editor first, in order to add some synthetic quote marks ("> ") and when replying, it isn't clear to which of the patches the reply is corresponding to.
>
> As long as there's no migration to a better way, why not try out making PRs to https://github.com/ffstaging/FFmpeg?
I doubt "ffstaging" is affiliated with the project in any capacity.
He can make a MR to the Forgejo instance once we enable it for that purpose.
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-07 18:29 ` James Almer
@ 2025-05-07 18:54 ` softworkz .
2025-05-07 19:14 ` softworkz .
0 siblings, 1 reply; 10+ messages in thread
From: softworkz . @ 2025-05-07 18:54 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of James Almer
> Sent: Mittwoch, 7. Mai 2025 20:30
> To: ffmpeg-devel@ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable
> and av_assume() macros
>
> On 5/7/2025 2:57 PM, softworkz . wrote:
> >
> >
> >> -----Original Message-----
> >> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Andreas
> >> Rheinhardt
> >> Sent: Mittwoch, 7. Mai 2025 13:59
> >> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
> >> Subject: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable
> and
> >> av_assume() macros
> >>
> >> Patches attached.
> >>
> >> - Andreas
> >
> > Hi Andreas,
> >
> > from https://ffmpeg.org/developer.html#Submitting-patches-1
> >
> > "..ensure the correct mime type is used (text/x-diff or text/x-patch or at
> least text/plain) and that only one patch is inline or attached per mail."
> >
> > I'm saying that because the way you are submitting, Patchwork only ever
> recognizes the first attached patch, so - in this case - the remaining 20
> patches are not checked by the CI runs.
> > It's also difficult to review patches that are submitted in this way, even
> more difficult to respond, as that requires to copy the patch into a text
> editor first, in order to add some synthetic quote marks ("> ") and when
> replying, it isn't clear to which of the patches the reply is corresponding
> to.
> >
> > As long as there's no migration to a better way, why not try out making PRs
> to https://github.com/ffstaging/FFmpeg?
>
> I doubt "ffstaging" is affiliated with the project in any capacity.
Hi James,
it works like this:
- You make a PR to https://github.com/ffstaging/FFmpeg
- You make a comment with "/submit"
- The PR will be submitted to the ML as regular patches
Best regards
sw
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-07 18:54 ` softworkz .
@ 2025-05-07 19:14 ` softworkz .
2025-05-07 23:21 ` Michael Niedermayer
0 siblings, 1 reply; 10+ messages in thread
From: softworkz . @ 2025-05-07 19:14 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of softworkz .
> Sent: Mittwoch, 7. Mai 2025 20:54
> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable
> and av_assume() macros
>
>
>
> > -----Original Message-----
> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of James
> Almer
> > Sent: Mittwoch, 7. Mai 2025 20:30
> > To: ffmpeg-devel@ffmpeg.org
> > Subject: Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add
> av_unreachable
> > and av_assume() macros
> >
> > On 5/7/2025 2:57 PM, softworkz . wrote:
> > >
> > >
> > >> -----Original Message-----
> > >> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Andreas
> > >> Rheinhardt
> > >> Sent: Mittwoch, 7. Mai 2025 13:59
> > >> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
> > >> Subject: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable
> > and
> > >> av_assume() macros
> > >>
> > >> Patches attached.
> > >>
> > >> - Andreas
> > >
> > > Hi Andreas,
> > >
> > > from https://ffmpeg.org/developer.html#Submitting-patches-1
> > >
> > > "..ensure the correct mime type is used (text/x-diff or text/x-patch or at
> > least text/plain) and that only one patch is inline or attached per mail."
> > >
> > > I'm saying that because the way you are submitting, Patchwork only ever
> > recognizes the first attached patch, so - in this case - the remaining 20
> > patches are not checked by the CI runs.
> > > It's also difficult to review patches that are submitted in this way, even
> > more difficult to respond, as that requires to copy the patch into a text
> > editor first, in order to add some synthetic quote marks ("> ") and when
> > replying, it isn't clear to which of the patches the reply is corresponding
> > to.
> > >
> > > As long as there's no migration to a better way, why not try out making
> PRs
> > to https://github.com/ffstaging/FFmpeg?
> >
> > I doubt "ffstaging" is affiliated with the project in any capacity.
>
> Hi James,
>
> it works like this:
>
> - You make a PR to https://github.com/ffstaging/FFmpeg
> - You make a comment with "/submit"
> - The PR will be submitted to the ML as regular patches
More specifics:
- The PR message is sent as the cover-letter text [Patch 0/n]
Markdown is converted to ASCII
- Commit messages are checked for compliance
- CI builds are run on the last commit (yet you can submit
without waiting)
- To submit new versions of a patchset, simply force-push to
your PR branch and comment "/submit" again.
The patchset will automatically be submitted as a new version
(v2, v3, etc.)
- Comments made on the ML are automatically mirrored back as PR
comments on GH
- Cover-letters sent to the ML include a range-diff, showing
the changes from the previous version
They also include Git links to directly check out the patchset
Best,
sw
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-07 19:14 ` softworkz .
@ 2025-05-07 23:21 ` Michael Niedermayer
2025-05-07 23:38 ` softworkz .
0 siblings, 1 reply; 10+ messages in thread
From: Michael Niedermayer @ 2025-05-07 23:21 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 1644 bytes --]
On Wed, May 07, 2025 at 07:14:04PM +0000, softworkz . wrote:
[...]
> > > > As long as there's no migration to a better way, why not try out making
> > PRs
> > > to https://github.com/ffstaging/FFmpeg?
> > >
> > > I doubt "ffstaging" is affiliated with the project in any capacity.
> >
> > Hi James,
> >
> > it works like this:
> >
> > - You make a PR to https://github.com/ffstaging/FFmpeg
> > - You make a comment with "/submit"
> > - The PR will be submitted to the ML as regular patches
>
> More specifics:
>
> - The PR message is sent as the cover-letter text [Patch 0/n]
> Markdown is converted to ASCII
>
> - Commit messages are checked for compliance
>
> - CI builds are run on the last commit (yet you can submit
> without waiting)
>
> - To submit new versions of a patchset, simply force-push to
> your PR branch and comment "/submit" again.
> The patchset will automatically be submitted as a new version
> (v2, v3, etc.)
>
> - Comments made on the ML are automatically mirrored back as PR
> comments on GH
>
> - Cover-letters sent to the ML include a range-diff, showing
> the changes from the previous version
> They also include Git links to directly check out the patchset
Should this be added to doc/developer.texi ?
(which shows up as https://ffmpeg.org/developer.html)
We also should put forgejo in there too probably
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
For a strong democracy, genuine criticism is necessary, allegations benefit
noone, they just cause unnecessary conflicts. - Narendra Modi
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-07 23:21 ` Michael Niedermayer
@ 2025-05-07 23:38 ` softworkz .
0 siblings, 0 replies; 10+ messages in thread
From: softworkz . @ 2025-05-07 23:38 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Michael
> Niedermayer
> Sent: Donnerstag, 8. Mai 2025 01:22
> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable
> and av_assume() macros
>
> On Wed, May 07, 2025 at 07:14:04PM +0000, softworkz . wrote:
> [...]
> > > > > As long as there's no migration to a better way, why not try out
> making
> > > PRs
> > > > to https://github.com/ffstaging/FFmpeg?
> > > >
> > > > I doubt "ffstaging" is affiliated with the project in any capacity.
> > >
> > > Hi James,
> > >
> > > it works like this:
> > >
> > > - You make a PR to https://github.com/ffstaging/FFmpeg
> > > - You make a comment with "/submit"
> > > - The PR will be submitted to the ML as regular patches
> >
> > More specifics:
> >
> > - The PR message is sent as the cover-letter text [Patch 0/n]
> > Markdown is converted to ASCII
> >
> > - Commit messages are checked for compliance
> >
> > - CI builds are run on the last commit (yet you can submit
> > without waiting)
> >
> > - To submit new versions of a patchset, simply force-push to
> > your PR branch and comment "/submit" again.
> > The patchset will automatically be submitted as a new version
> > (v2, v3, etc.)
> >
> > - Comments made on the ML are automatically mirrored back as PR
> > comments on GH
> >
> > - Cover-letters sent to the ML include a range-diff, showing
> > the changes from the previous version
> > They also include Git links to directly check out the patchset
>
> Should this be added to doc/developer.texi ?
> (which shows up as https://ffmpeg.org/developer.html)
It depends on how far or close we are to move away from the
ML, as there can be only one "source of truth", where all patches
are moving through.
The setup on ffstaging is simply a tool that is useful for submitting
patches to the ML without the trouble (for some like me) of using
git send-email. It will become obsolete as soon as the ML won't be
the central hub for patches anymore.
But for the time being, I can surely propose a paragraph with a
description similar to the above.
I somehow assumed that most (regulars at least) would already know
what it is and what it does, but from Jame's response I've seen
that I was a wrong, so yea, let's do this.
Best,
sw
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-07 11:58 [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros Andreas Rheinhardt
2025-05-07 17:57 ` softworkz .
@ 2025-05-16 14:06 ` Andreas Rheinhardt
2025-05-16 14:52 ` Ramiro Polla
1 sibling, 1 reply; 10+ messages in thread
From: Andreas Rheinhardt @ 2025-05-16 14:06 UTC (permalink / raw)
To: ffmpeg-devel
Andreas Rheinhardt:
> Patches attached.
>
> - Andreas
>
Will apply this patchset tomorrow unless there are objections.
- Andreas
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-16 14:06 ` Andreas Rheinhardt
@ 2025-05-16 14:52 ` Ramiro Polla
2025-05-16 18:39 ` Andreas Rheinhardt
0 siblings, 1 reply; 10+ messages in thread
From: Ramiro Polla @ 2025-05-16 14:52 UTC (permalink / raw)
To: ffmpeg-devel
On 5/16/25 16:06, Andreas Rheinhardt wrote:
> Andreas Rheinhardt:
>> Patches attached.
>>
>> - Andreas
>>
>
> Will apply this patchset tomorrow unless there are objections.
[PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
> diff --git a/libavutil/avassert.h b/libavutil/avassert.h
> index 1895fb7551..d0d5aa0c7e 100644
> --- a/libavutil/avassert.h
> +++ b/libavutil/avassert.h
> @@ -75,4 +76,45 @@
> */
> void av_assert0_fpu(void);
>
> +/**
> + * Asserts that are used as compiler optimization hints depending
> + * upon ASSERT_LEVEL and NBDEBUG.
> + *
> + * Undefined behaviour occurs if execution reaches a point marked
> + * with av_unreachable() or if a condition used with av_assume()
> + * is false.
> + *
> + * The condition used with av_assume() should not have side-effects
> + * and should be visible to the compiler.
> + */
> +#if defined(ASSERT_LEVEL) ? ASSERT_LEVEL > 0 : !defined(HAVE_AV_CONFIG_H) && !defined(NDEBUG)
> +#define av_unreachable(msg) \
> +do { \
> + av_log(NULL, AV_LOG_PANIC, \
> + "Code at %s:%d that was supposedly unreachable due to '%s' reached\n", \
> + __FILE__, __LINE__, msg); \
The message sounds weird (especially that dangling "reached" at the
end). What about:
"Reached supposedly unreachable code at %s:%d: %s\n"
or any other variation where the reason message gets printed at the end.
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
2025-05-16 14:52 ` Ramiro Polla
@ 2025-05-16 18:39 ` Andreas Rheinhardt
0 siblings, 0 replies; 10+ messages in thread
From: Andreas Rheinhardt @ 2025-05-16 18:39 UTC (permalink / raw)
To: ffmpeg-devel
Ramiro Polla:
>
> On 5/16/25 16:06, Andreas Rheinhardt wrote:
>> Andreas Rheinhardt:
>>> Patches attached.
>>>
>>> - Andreas
>>>
>>
>> Will apply this patchset tomorrow unless there are objections.
>
> [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros
>> diff --git a/libavutil/avassert.h b/libavutil/avassert.h
>> index 1895fb7551..d0d5aa0c7e 100644
>> --- a/libavutil/avassert.h
>> +++ b/libavutil/avassert.h
>> @@ -75,4 +76,45 @@
>> */
>> void av_assert0_fpu(void);
>>
>> +/**
>> + * Asserts that are used as compiler optimization hints depending
>> + * upon ASSERT_LEVEL and NBDEBUG.
>> + *
>> + * Undefined behaviour occurs if execution reaches a point marked
>> + * with av_unreachable() or if a condition used with av_assume()
>> + * is false.
>> + *
>> + * The condition used with av_assume() should not have side-effects
>> + * and should be visible to the compiler.
>> + */
>> +#if defined(ASSERT_LEVEL) ? ASSERT_LEVEL > 0 : !
>> defined(HAVE_AV_CONFIG_H) && !defined(NDEBUG)
>> +#define av_unreachable(msg) \
>> +do { \
>> + av_log(NULL, AV_LOG_PANIC, \
>> + "Code at %s:%d that was supposedly unreachable due to '%s'
>> reached\n", \
>> + __FILE__, __LINE__, msg); \
>
> The message sounds weird (especially that dangling "reached" at the
> end). What about:
> "Reached supposedly unreachable code at %s:%d: %s\n"
> or any other variation where the reason message gets printed at the end.
Will change.
- Andreas
_______________________________________________
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".
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-05-16 18:40 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-07 11:58 [FFmpeg-devel] [PATCH 01/21] avutil/avassert: Add av_unreachable and av_assume() macros Andreas Rheinhardt
2025-05-07 17:57 ` softworkz .
2025-05-07 18:29 ` James Almer
2025-05-07 18:54 ` softworkz .
2025-05-07 19:14 ` softworkz .
2025-05-07 23:21 ` Michael Niedermayer
2025-05-07 23:38 ` softworkz .
2025-05-16 14:06 ` Andreas Rheinhardt
2025-05-16 14:52 ` Ramiro Polla
2025-05-16 18:39 ` Andreas Rheinhardt
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git