From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH 2/9] fftools/textformat: Quality improvements Date: Wed, 16 Apr 2025 06:50:44 +0200 Message-ID: <GV1P250MB073716AA776C301A980CB90B8FBD2@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM> (raw) In-Reply-To: <DM8P223MB03659AF3483E00EC43597670BAB22@DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM> softworkz .: > > >> -----Original Message----- >> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of >> Andreas Rheinhardt >> Sent: Dienstag, 15. April 2025 03:06 >> To: ffmpeg-devel@ffmpeg.org >> Subject: Re: [FFmpeg-devel] [PATCH 2/9] fftools/textformat: Quality >> improvements >> >> softworkz: >>> From: softworkz <softworkz@hotmail.com> >>> >>> Signed-off-by: softworkz <softworkz@hotmail.com> >>> --- >>> fftools/textformat/avtextformat.c | 121 +++++++++++++++++++-------- >> --- >>> fftools/textformat/avtextformat.h | 6 +- >>> fftools/textformat/tf_default.c | 8 +- >>> fftools/textformat/tf_ini.c | 2 +- >>> fftools/textformat/tf_json.c | 8 +- >>> fftools/textformat/tf_xml.c | 3 - >>> fftools/textformat/tw_avio.c | 9 ++- >>> 7 files changed, 101 insertions(+), 56 deletions(-) >>> >>> diff --git a/fftools/textformat/avtextformat.c >> b/fftools/textformat/avtextformat.c >>> index 1ce51d11e2..406025d19d 100644 >>> --- a/fftools/textformat/avtextformat.c >>> +++ b/fftools/textformat/avtextformat.c >>> @@ -93,9 +93,8 @@ static const AVClass textcontext_class = { >>> >>> static void bprint_bytes(AVBPrint *bp, const uint8_t *ubuf, size_t >> ubuf_size) >>> { >>> - int i; >>> av_bprintf(bp, "0X"); >>> - for (i = 0; i < ubuf_size; i++) >>> + for (unsigned i = 0; i < ubuf_size; i++) >> >> Why not size_t? > > Because it creates more warnings about narrowing conversions. > > > >>> av_bprintf(bp, "%02X", ubuf[i]); >>> } >>> >>> @@ -110,8 +109,6 @@ int avtext_context_close(AVTextFormatContext >> **ptctx) >>> >>> av_hash_freep(&tctx->hash); >>> >>> - av_hash_freep(&tctx->hash); >>> - >>> if (tctx->formatter->uninit) >>> tctx->formatter->uninit(tctx); >>> for (i = 0; i < SECTION_MAX_NB_LEVELS; i++) >>> @@ -141,12 +138,18 @@ int avtext_context_open(AVTextFormatContext >> **ptctx, >>> AVTextFormatContext *tctx; >>> int i, ret = 0; >>> >>> - if (!(tctx = av_mallocz(sizeof(AVTextFormatContext)))) { >>> + if (!ptctx || !formatter) >>> + return AVERROR(EINVAL); >> >> Can this happen? > > see below > >>> + >>> + if (!formatter->priv_size && formatter->priv_class) >>> + return AVERROR(EINVAL); >> >> Stuff like this should never happen and should not be checked (or >> actually: the proper place to check stuff like this is in test tools >> like lavc/tests/avcodec.c, but I don't think it is worth it for >> fftools). > > I probably overdid it a bit with checks, but the goal for this API > is still to become public at some point (like in avutil), so I > tried to move towards that direction already. > > > > >>> + >>> + if (!((tctx = av_mallocz(sizeof(AVTextFormatContext))))) { >>> ret = AVERROR(ENOMEM); >>> goto fail; >>> } >>> >>> - if (!(tctx->priv = av_mallocz(formatter->priv_size))) { >>> + if (formatter->priv_size && !((tctx->priv = >> av_mallocz(formatter->priv_size)))) { >>> ret = AVERROR(ENOMEM); >>> goto fail; >>> } >>> @@ -215,15 +218,15 @@ int avtext_context_open(AVTextFormatContext >> **ptctx, >>> >>> /* validate replace string */ >>> { >>> - const uint8_t *p = tctx->string_validation_replacement; >>> - const uint8_t *endp = p + strlen(p); >>> + const uint8_t *p = (uint8_t *)tctx- >>> string_validation_replacement; >>> + const uint8_t *endp = p + strlen((const char *)p); >>> while (*p) { >>> const uint8_t *p0 = p; >>> int32_t code; >>> ret = av_utf8_decode(&code, &p, endp, tctx- >>> string_validation_utf8_flags); >>> if (ret < 0) { >>> AVBPrint bp; >>> - av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC); >>> + av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); >> >> This adds a memleak on data where it makes a difference. > > Why? The string_validation_replacement string should be short enough > to fit into the stack-allocated memory, no? > > >>> bprint_bytes(&bp, p0, p - p0), >>> av_log(tctx, AV_LOG_ERROR, >>> "Invalid UTF8 sequence %s found in >> string validation replace '%s'\n", >>> @@ -259,6 +262,9 @@ static const char unit_bit_per_second_str[] = >> "bit/s"; >>> >>> void avtext_print_section_header(AVTextFormatContext *tctx, const >> void *data, int section_id) >>> { >>> + if (!tctx || section_id < 0 || section_id >= tctx->nb_sections) >>> + return; >> >> Can this happen? > > For a public API - many things can happen... > > >>> tctx->level++; >>> av_assert0(tctx->level < SECTION_MAX_NB_LEVELS); >>> >>> @@ -272,6 +278,9 @@ void >> avtext_print_section_header(AVTextFormatContext *tctx, const void >> *data, in >>> >>> void avtext_print_section_footer(AVTextFormatContext *tctx) >>> { >>> + if (!tctx || tctx->level < 0 || tctx->level >= >> SECTION_MAX_NB_LEVELS) >>> + return; >> >> Can this happen? > > Yes - when somewhere in FFmpeg some output is changed without thinking > about that there's a nesting limit of SECTION_MAX_NB_LEVELS. > Even when only 2 or 3 section types are defined, the level can go beyond > that value. > > >> >>> + >>> int section_id = tctx->section[tctx->level]->id; >>> int parent_section_id = tctx->level >>> ? tctx->section[tctx->level - 1]->id >>> @@ -289,7 +298,12 @@ void >> avtext_print_section_footer(AVTextFormatContext *tctx) >>> >>> void avtext_print_integer(AVTextFormatContext *tctx, const char >> *key, int64_t val) >>> { >>> - const struct AVTextFormatSection *section = tctx->section[tctx- >>> level]; >>> + const AVTextFormatSection *section; >>> + >>> + if (!tctx || !key || tctx->level < 0 || tctx->level >= >> SECTION_MAX_NB_LEVELS) >>> + return; >> >> Can this happen? > > > see above > > >> >>> + >>> + section = tctx->section[tctx->level]; >>> >>> if (section->show_all_entries || av_dict_get(section- >>> entries_to_show, key, NULL, 0)) { >>> tctx->formatter->print_integer(tctx, key, val); >>> @@ -299,24 +313,28 @@ void avtext_print_integer(AVTextFormatContext >> *tctx, const char *key, int64_t va >>> >>> static inline int validate_string(AVTextFormatContext *tctx, char >> **dstp, const char *src) >>> { >>> - const uint8_t *p, *endp; >>> + const uint8_t *p, *endp, *srcp = (const uint8_t *)src; >>> AVBPrint dstbuf; >>> + AVBPrint bp; >>> int invalid_chars_nb = 0, ret = 0; >>> >>> + if (!tctx || !dstp || !src) >>> + return AVERROR(EINVAL); >>> + >> >> Can this happen? >> >>> + *dstp = NULL; >>> av_bprint_init(&dstbuf, 0, AV_BPRINT_SIZE_UNLIMITED); >>> + av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); >>> >>> - endp = src + strlen(src); >>> - for (p = src; *p;) { >>> - uint32_t code; >>> + endp = srcp + strlen(src); >>> + for (p = srcp; *p;) { >>> + int32_t code; >>> int invalid = 0; >>> const uint8_t *p0 = p; >>> >>> if (av_utf8_decode(&code, &p, endp, tctx- >>> string_validation_utf8_flags) < 0) { >>> - AVBPrint bp; >>> - av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC); >>> - bprint_bytes(&bp, p0, p-p0); >>> - av_log(tctx, AV_LOG_DEBUG, >>> - "Invalid UTF-8 sequence %s found in string >> '%s'\n", bp.str, src); >>> + av_bprint_clear(&bp); >>> + bprint_bytes(&bp, p0, p - p0); >>> + av_log(tctx, AV_LOG_DEBUG, "Invalid UTF-8 sequence %s >> found in string '%s'\n", bp.str, src); >>> invalid = 1; >>> } >>> >>> @@ -336,7 +354,7 @@ static inline int >> validate_string(AVTextFormatContext *tctx, char **dstp, const >>> } >>> >>> if (!invalid || tctx->string_validation == >> AV_TEXTFORMAT_STRING_VALIDATION_IGNORE) >>> - av_bprint_append_data(&dstbuf, p0, p-p0); >>> + av_bprint_append_data(&dstbuf, (const char *)p0, p - >> p0); >>> } >>> >>> if (invalid_chars_nb && tctx->string_validation == >> AV_TEXTFORMAT_STRING_VALIDATION_REPLACE) >>> @@ -346,6 +364,7 @@ static inline int >> validate_string(AVTextFormatContext *tctx, char **dstp, const >>> >>> end: >>> av_bprint_finalize(&dstbuf, dstp); >>> + av_bprint_finalize(&bp, NULL); >>> return ret; >>> } >>> >>> @@ -358,17 +377,18 @@ struct unit_value { >>> const char *unit; >>> }; >>> >>> -static char *value_string(AVTextFormatContext *tctx, char *buf, int >> buf_size, struct unit_value uv) >>> +static char *value_string(const AVTextFormatContext *tctx, char >> *buf, int buf_size, struct unit_value uv) >>> { >>> double vald; >>> - int64_t vali; >>> + int64_t vali = 0; >>> int show_float = 0; >>> >>> if (uv.unit == unit_second_str) { >>> vald = uv.val.d; >>> show_float = 1; >>> } else { >>> - vald = vali = uv.val.i; >>> + vald = (double)uv.val.i; >>> + vali = uv.val.i; >>> } >>> >>> if (uv.unit == unit_second_str && tctx- >>> use_value_sexagesimal_format) { >>> @@ -387,17 +407,17 @@ static char *value_string(AVTextFormatContext >> *tctx, char *buf, int buf_size, st >>> int64_t index; >>> >>> if (uv.unit == unit_byte_str && tctx- >>> use_byte_value_binary_prefix) { >>> - index = (int64_t) (log2(vald)) / 10; >>> - index = av_clip(index, 0, >> FF_ARRAY_ELEMS(si_prefixes) - 1); >>> + index = (int64_t)(log2(vald) / 10); >>> + index = av_clip64(index, 0, >> FF_ARRAY_ELEMS(si_prefixes) - 1); >>> vald /= si_prefixes[index].bin_val; >>> prefix_string = si_prefixes[index].bin_str; >>> } else { >>> - index = (int64_t) (log10(vald)) / 3; >>> - index = av_clip(index, 0, >> FF_ARRAY_ELEMS(si_prefixes) - 1); >>> + index = (int64_t)(log10(vald) / 3); >>> + index = av_clip64(index, 0, >> FF_ARRAY_ELEMS(si_prefixes) - 1); >>> vald /= si_prefixes[index].dec_val; >>> prefix_string = si_prefixes[index].dec_str; >>> } >>> - vali = vald; >>> + vali = (int64_t)vald; >>> } >>> >>> if (show_float || (tctx->use_value_prefix && vald != >> (int64_t)vald)) >>> @@ -425,9 +445,14 @@ void avtext_print_unit_int(AVTextFormatContext >> *tctx, const char *key, int value >>> >>> int avtext_print_string(AVTextFormatContext *tctx, const char *key, >> const char *val, int flags) >>> { >>> - const struct AVTextFormatSection *section = tctx->section[tctx- >>> level]; >>> + const AVTextFormatSection *section; >>> int ret = 0; >>> >>> + if (!tctx || !key || !val || tctx->level < 0 || tctx->level >= >> SECTION_MAX_NB_LEVELS) >>> + return AVERROR(EINVAL); >> >> Can this happen? >> >>> + >>> + section = tctx->section[tctx->level]; >>> + >>> if (tctx->show_optional_fields == SHOW_OPTIONAL_FIELDS_NEVER || >>> (tctx->show_optional_fields == SHOW_OPTIONAL_FIELDS_AUTO >>> && (flags & AV_TEXTFORMAT_PRINT_STRING_OPTIONAL) >>> @@ -462,7 +487,7 @@ int avtext_print_string(AVTextFormatContext >> *tctx, const char *key, const char * >>> void avtext_print_rational(AVTextFormatContext *tctx, const char >> *key, AVRational q, char sep) >>> { >>> AVBPrint buf; >>> - av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC); >>> + av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED); >> >> This is strictly worse than what was here before: With UNLIMITED you >> would have a memleak in case the internal buffer wouldn't suffice. >> (But anyway, this should use snprintf. I just sent a patch for this.) > > To be honest, I don't see much value in AV_BPRINT_SIZE_AUTOMATIC. > When I would need to check the return values of all bprint operations, > all the convenience would go over board instantly. Using > AV_BPRINT_SIZE_AUTOMATIC without return value checking is error-prone > and can cause errors which might be hard to identify. > On the other side, identifying places in code where AV_BPRINT_SIZE_UNLIMITED > is used and finalize is needed is a lot easier and doesn't even need > a specific case and/or debugging to find out. > > In the worst case, I'd still prefer a memory leak over incorrect > behavior (or well - always depends on the case). By that I don't mean > errors that are reported and causing failure but those things that are > failing silently and are hard to notice or trace back when noticing. > > Surely others may see it differently. > > > >> >>> av_bprintf(&buf, "%d%c%d", q.num, sep, q.den); >>> avtext_print_string(tctx, key, buf.str, 0); >>> } >>> @@ -470,12 +495,11 @@ void avtext_print_rational(AVTextFormatContext >> *tctx, const char *key, AVRationa >>> void avtext_print_time(AVTextFormatContext *tctx, const char *key, >>> int64_t ts, const AVRational *time_base, int >> is_duration) >>> { >>> - char buf[128]; >>> - >>> if ((!is_duration && ts == AV_NOPTS_VALUE) || (is_duration && >> ts == 0)) { >>> avtext_print_string(tctx, key, "N/A", >> AV_TEXTFORMAT_PRINT_STRING_OPTIONAL); >>> } else { >>> - double d = ts * av_q2d(*time_base); >>> + char buf[128]; >>> + double d = av_q2d(*time_base) * (double)ts; >> >> We actually try to avoid explicit casts where possible. > > > I'll answer that separately. > > > >>> struct unit_value uv; >>> uv.val.d = d; >>> uv.unit = unit_second_str; >>> @@ -496,7 +520,8 @@ void avtext_print_data(AVTextFormatContext >> *tctx, const char *name, >>> const uint8_t *data, int size) >>> { >>> AVBPrint bp; >>> - int offset = 0, l, i; >>> + unsigned offset = 0; >>> + int l, i; >>> >>> av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); >>> av_bprintf(&bp, "\n"); >>> @@ -523,25 +548,29 @@ void avtext_print_data(AVTextFormatContext >> *tctx, const char *name, >>> void avtext_print_data_hash(AVTextFormatContext *tctx, const char >> *name, >>> const uint8_t *data, int size) >>> { >>> - char *p, buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 }; >>> + char buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 }; >>> + int len; >>> >>> if (!tctx->hash) >>> return; >>> >>> av_hash_init(tctx->hash); >>> av_hash_update(tctx->hash, data, size); >>> - snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(tctx- >>> hash)); >>> - p = buf + strlen(buf); >>> - av_hash_final_hex(tctx->hash, p, buf + sizeof(buf) - p); >>> + len = snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(tctx- >>> hash)); >>> + av_hash_final_hex(tctx->hash, (uint8_t *)&buf[len], >> (int)sizeof(buf) - len); >> >> Is it guaranteed that the output of snprintf() is not truncated? > > MAX_HASH_NAME_SIZE is 11 and AV_HASH_MAX_SIZE 64, make 192 - 11 > 0 > > >> >>> avtext_print_string(tctx, name, buf, 0); >>> } >>> >>> void avtext_print_integers(AVTextFormatContext *tctx, const char >> *name, >>> - uint8_t *data, int size, const >> char *format, >>> - int columns, int bytes, int >> offset_add) >>> + uint8_t *data, int size, const char >> *format, >>> + int columns, int bytes, int offset_add) >>> { >>> AVBPrint bp; >>> - int offset = 0, l, i; >>> + unsigned offset = 0; >>> + int l, i; >>> + >>> + if (!name || !data || !format || columns <= 0 || bytes <= 0) >>> + return; >> >> Can this happen? > > Sure, as a public API. Of course, one can spend time, trying to determine > which conditions are realistically possible or not. But that introduces > potential of human error, so - unless it's a really hot path, one check > to many is better than one too less. > > >> >>> >>> av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED); >>> av_bprintf(&bp, "\n"); >>> @@ -607,12 +636,18 @@ int >> avtextwriter_context_open(AVTextWriterContext **pwctx, const >> AVTextWriter *w >>> AVTextWriterContext *wctx; >>> int ret = 0; >>> >>> - if (!(wctx = av_mallocz(sizeof(AVTextWriterContext)))) { >>> + if (!pwctx || !writer) >>> + return AVERROR(EINVAL); >>> + >>> + if (!writer->priv_size && writer->priv_class) >> >> Stuff like this should never happen and should therefore not be >> checked. > > OK. > >> >>> + return AVERROR(EINVAL); >>> + >>> + if (!((wctx = av_mallocz(sizeof(AVTextWriterContext))))) { >>> ret = AVERROR(ENOMEM); >>> goto fail; >>> } >>> >>> - if (!(wctx->priv = av_mallocz(writer->priv_size))) { >>> + if (writer->priv_size && !((wctx->priv = av_mallocz(writer- >>> priv_size)))) { >>> ret = AVERROR(ENOMEM); >>> goto fail; >>> } >>> diff --git a/fftools/textformat/avtextformat.h >> b/fftools/textformat/avtextformat.h >>> index 03564d14a7..e519094f4f 100644 >>> --- a/fftools/textformat/avtextformat.h >>> +++ b/fftools/textformat/avtextformat.h >>> @@ -21,9 +21,7 @@ >>> #ifndef FFTOOLS_TEXTFORMAT_AVTEXTFORMAT_H >>> #define FFTOOLS_TEXTFORMAT_AVTEXTFORMAT_H >>> >>> -#include <stddef.h> >>> #include <stdint.h> >>> -#include "libavutil/attributes.h" >>> #include "libavutil/dict.h" >>> #include "libavformat/avio.h" >>> #include "libavutil/bprint.h" >>> @@ -103,7 +101,7 @@ struct AVTextFormatContext { >>> unsigned int >> nb_item_type[SECTION_MAX_NB_LEVELS][SECTION_MAX_NB_SECTIONS]; >>> >>> /** section per each level */ >>> - const struct AVTextFormatSection >> *section[SECTION_MAX_NB_LEVELS]; >>> + const AVTextFormatSection *section[SECTION_MAX_NB_LEVELS]; >>> AVBPrint section_pbuf[SECTION_MAX_NB_LEVELS]; ///< generic >> print buffer dedicated to each section, >>> /// used by >> various formatters >>> >>> @@ -124,7 +122,7 @@ struct AVTextFormatContext { >>> #define AV_TEXTFORMAT_PRINT_STRING_VALIDATE 2 >>> >>> int avtext_context_open(AVTextFormatContext **ptctx, const >> AVTextFormatter *formatter, AVTextWriterContext *writer_context, const >> char *args, >>> - const struct AVTextFormatSection *sections, >> int nb_sections, >>> + const AVTextFormatSection *sections, int >> nb_sections, >>> int show_value_unit, >>> int use_value_prefix, >>> int use_byte_value_binary_prefix, >>> diff --git a/fftools/textformat/tf_default.c >> b/fftools/textformat/tf_default.c >>> index 14ef9fe8f9..3b05d25f36 100644 >>> --- a/fftools/textformat/tf_default.c >>> +++ b/fftools/textformat/tf_default.c >>> @@ -70,9 +70,10 @@ DEFINE_FORMATTER_CLASS(default); >>> /* lame uppercasing routine, assumes the string is lower case ASCII >> */ >>> static inline char *upcase_string(char *dst, size_t dst_size, const >> char *src) >>> { >>> - int i; >>> + unsigned i; >>> + >> >> Why not size_t? > > see above. > >> >>> for (i = 0; src[i] && i < dst_size - 1; i++) >>> - dst[i] = av_toupper(src[i]); >>> + dst[i] = (char)av_toupper(src[i]); >>> dst[i] = 0; >>> return dst; >>> } >>> @@ -108,6 +109,9 @@ static void >> default_print_section_footer(AVTextFormatContext *wctx) >>> const struct AVTextFormatSection *section = wctx->section[wctx- >>> level]; >>> char buf[32]; >>> >>> + if (!section) >>> + return; >> >> Can this happen? > > No, but here it should actually call the function in tf_internal and with > that it can happen. This must have gotten lost from rebasing. > > >>> + >>> if (def->noprint_wrappers || def->nested_section[wctx->level]) >>> return; >>> >>> diff --git a/fftools/textformat/tf_ini.c >> b/fftools/textformat/tf_ini.c >>> index 9e1aa60e09..ec471fd480 100644 >>> --- a/fftools/textformat/tf_ini.c >>> +++ b/fftools/textformat/tf_ini.c >>> @@ -92,7 +92,7 @@ static char *ini_escape_str(AVBPrint *dst, const >> char *src) >>> /* fallthrough */ >>> default: >>> if ((unsigned char)c < 32) >>> - av_bprintf(dst, "\\x00%02x", c & 0xff); >>> + av_bprintf(dst, "\\x00%02x", (unsigned char)c); >>> else >>> av_bprint_chars(dst, c, 1); >>> break; >>> diff --git a/fftools/textformat/tf_json.c >> b/fftools/textformat/tf_json.c >>> index 24838b35ec..f286838d3c 100644 >>> --- a/fftools/textformat/tf_json.c >>> +++ b/fftools/textformat/tf_json.c >>> @@ -82,13 +82,18 @@ static const char *json_escape_str(AVBPrint >> *dst, const char *src, void *log_ctx >>> static const char json_subst[] = { '"', '\\', 'b', 'f', >> 'n', 'r', 't', 0 }; >>> const char *p; >>> >>> + if (!src) { >>> + av_log(log_ctx, AV_LOG_ERROR, "json_escape_str: NULL source >> string\n"); >>> + return NULL; >>> + } >> >> Can this even happen? >> >>> + >>> for (p = src; *p; p++) { >>> char *s = strchr(json_escape, *p); >>> if (s) { >>> av_bprint_chars(dst, '\\', 1); >>> av_bprint_chars(dst, json_subst[s - json_escape], 1); >>> } else if ((unsigned char)*p < 32) { >>> - av_bprintf(dst, "\\u00%02x", *p & 0xff); >>> + av_bprintf(dst, "\\u00%02x", (unsigned char)*p); >>> } else { >>> av_bprint_chars(dst, *p, 1); >>> } >>> @@ -107,6 +112,7 @@ static void >> json_print_section_header(AVTextFormatContext *wctx, const void *dat >>> wctx->section[wctx->level-1] : NULL; >>> >>> if (wctx->level && wctx->nb_item[wctx->level-1]) >>> + if (wctx->level && wctx->nb_item[wctx->level - 1]) >>> writer_put_str(wctx, ",\n"); >>> >>> if (section->flags & AV_TEXTFORMAT_SECTION_FLAG_IS_WRAPPER) { >>> diff --git a/fftools/textformat/tf_xml.c >> b/fftools/textformat/tf_xml.c >>> index 76271dbaa6..eceeda81e5 100644 >>> --- a/fftools/textformat/tf_xml.c >>> +++ b/fftools/textformat/tf_xml.c >>> @@ -18,10 +18,7 @@ >>> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA >> 02110-1301 USA >>> */ >>> >>> -#include <limits.h> >>> -#include <stdarg.h> >>> #include <stdint.h> >>> -#include <stdio.h> >>> #include <string.h> >>> >>> #include "avtextformat.h" >>> diff --git a/fftools/textformat/tw_avio.c >> b/fftools/textformat/tw_avio.c >>> index d335d35a56..3c7492aa06 100644 >>> --- a/fftools/textformat/tw_avio.c >>> +++ b/fftools/textformat/tw_avio.c >>> @@ -63,7 +63,7 @@ static void io_w8(AVTextWriterContext *wctx, int >> b) >>> static void io_put_str(AVTextWriterContext *wctx, const char *str) >>> { >>> IOWriterContext *ctx = wctx->priv; >>> - avio_write(ctx->avio_context, str, strlen(str)); >>> + avio_write(ctx->avio_context, (const unsigned char *)str, >> (int)strlen(str)); >>> } >>> >>> static void io_printf(AVTextWriterContext *wctx, const char *fmt, >> ...) >>> @@ -89,10 +89,12 @@ const AVTextWriter avtextwriter_avio = { >>> >>> int avtextwriter_create_file(AVTextWriterContext **pwctx, const >> char *output_filename, int close_on_uninit) >>> { >>> + if (!pwctx || !output_filename || !output_filename[0]) >>> + return AVERROR(EINVAL); >> >> Can this happen? > > When public - yes. Can it happen now? > > > Generally, I wonder: don't you find it risky to make decisions about > function implementations that are based on knowledge about the calling > code? ("can this happen?") > I mean, the calling code doesn't know about the assumptions you > were making and on which behavior the implementation might be relying on. Not providing a pointer to store the AVTextWriterContext* is insane and a programmer error. It should never happen. Doing so should lead to undefined behavior (just as e.g. passing a NULL pointer to strlen() does), even when public. > > For this patchset - most importantly for everything in graphprint.c, > I had worked with the deliberate intention for checking everything that > can be checked. You should rather look at the callsites and ensure that they don't call these functions in an insane way. The motivation here is the fact that graph-printing > is always run (when configured), even when the FFmpeg run has failed > or errored, because those are often the most interesting cases for > viewing the graph or getting the data. > But in case of errors and abortion, we cannot make any assumptions > anymore and the answer to "can this happen?" might be more often "yes" > than usual. Of course we can make assumptions. All we need to do is check the ones that can happen at the call site. Where they belong. > > I hope you don't mind to postpone the removal of checks a little bit. "Removal of checks"? This patch is about adding checks. Checks which IMO should not be there in the first place. > It doesn't feel right to me now, to go over and just blindly remove > all of them. I would rather like to discuss a strategy/pattern in this > regard about which checks should be made at which places and where > not, also in the light of possibly being promoted to a public API. > Finally, I'd also like to hear Stefanos opinion - it's mostly his > code that we're moving around here 😊 - 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".
next prev parent reply other threads:[~2025-04-16 5:05 UTC|newest] Thread overview: 240+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-04-14 12:46 [FFmpeg-devel] [PATCH 0/9] Execution Graph Printing ffmpegagent 2025-04-14 12:46 ` [FFmpeg-devel] [PATCH 1/9] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-21 16:52 ` Stefano Sabatini 2025-04-21 17:12 ` softworkz . 2025-04-14 12:46 ` [FFmpeg-devel] [PATCH 2/9] fftools/textformat: Quality improvements softworkz 2025-04-15 1:05 ` Andreas Rheinhardt 2025-04-15 3:19 ` softworkz . 2025-04-16 4:50 ` Andreas Rheinhardt [this message] 2025-04-16 6:27 ` softworkz . 2025-04-16 9:52 ` softworkz . 2025-04-14 12:47 ` [FFmpeg-devel] [PATCH 3/9] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-14 12:47 ` [FFmpeg-devel] [PATCH 4/9] fftools/textformat: Add function avtext_print_integer_flags() softworkz 2025-04-14 12:47 ` [FFmpeg-devel] [PATCH 5/9] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-14 12:47 ` [FFmpeg-devel] [PATCH 6/9] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-14 12:47 ` [FFmpeg-devel] [PATCH 7/9] fftools/resources: Add resource manager files softworkz 2025-04-14 12:47 ` [FFmpeg-devel] [PATCH 8/9] fftools/graphprint: Add execution graph printing softworkz 2025-04-14 12:47 ` [FFmpeg-devel] [PATCH 9/9] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 00/10] Execution Graph Printing ffmpegagent 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 01/10] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 02/10] fftools/textformat: Quality improvements softworkz 2025-04-16 10:49 ` Andreas Rheinhardt 2025-04-16 11:33 ` softworkz . 2025-04-18 2:48 ` softworkz . 2025-04-18 5:41 ` softworkz . 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 03/10] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 04/10] fftools/tf_internal: Use ac_default_item_name softworkz 2025-04-16 10:50 ` Andreas Rheinhardt 2025-04-16 11:11 ` softworkz . 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 05/10] fftools/textformat: Add function avtext_print_integer_flags() softworkz 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 06/10] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 07/10] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 08/10] fftools/resources: Add resource manager files softworkz 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 09/10] fftools/graphprint: Add execution graph printing softworkz 2025-04-17 18:41 ` Michael Niedermayer 2025-04-18 2:45 ` softworkz . 2025-04-16 10:12 ` [FFmpeg-devel] [PATCH v2 10/10] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-04-16 10:21 ` [FFmpeg-devel] [PATCH v2 00/10] Execution Graph Printing softworkz . 2025-04-18 2:56 ` [FFmpeg-devel] [PATCH v3 00/11] " ffmpegagent 2025-04-18 2:56 ` [FFmpeg-devel] [PATCH v3 01/11] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-18 2:56 ` [FFmpeg-devel] [PATCH v3 02/11] fftools/textformat: Quality improvements softworkz 2025-04-18 2:56 ` [FFmpeg-devel] [PATCH v3 03/11] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-18 2:56 ` [FFmpeg-devel] [PATCH v3 04/11] fftools/tf_internal: Use ac_default_item_name softworkz 2025-04-18 2:56 ` [FFmpeg-devel] [PATCH v3 05/11] fftools/textformat: Add function avtext_print_integer_flags() softworkz 2025-04-18 2:56 ` [FFmpeg-devel] [PATCH v3 06/11] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-18 2:57 ` [FFmpeg-devel] [PATCH v3 07/11] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-18 2:57 ` [FFmpeg-devel] [PATCH v3 08/11] fftools/resources: Add resource manager files softworkz 2025-04-18 2:57 ` [FFmpeg-devel] [PATCH v3 09/11] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-04-18 2:57 ` [FFmpeg-devel] [PATCH v3 10/11] fftools/graphprint: Add execution graph printing softworkz 2025-04-18 2:57 ` [FFmpeg-devel] [PATCH v3 11/11] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-04-20 10:11 ` Michael Niedermayer 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 00/11] Execution Graph Printing ffmpegagent 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 01/11] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 02/11] fftools/textformat: Quality improvements softworkz 2025-04-21 17:16 ` Stefano Sabatini 2025-04-21 17:21 ` Nicolas George 2025-04-21 17:40 ` softworkz . 2025-04-21 17:29 ` softworkz . 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 03/11] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-21 17:28 ` Stefano Sabatini 2025-04-21 17:31 ` softworkz . 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 04/11] fftools/tf_internal: Use ac_default_item_name softworkz 2025-04-21 17:31 ` Stefano Sabatini 2025-04-22 21:10 ` softworkz . 2025-04-23 22:36 ` softworkz . 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 05/11] fftools/textformat: Add function avtext_print_integer_flags() softworkz 2025-04-23 22:56 ` Stefano Sabatini 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 06/11] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 07/11] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 08/11] fftools/resources: Add resource manager files softworkz 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 09/11] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 10/11] fftools/graphprint: Add execution graph printing softworkz 2025-04-20 22:59 ` [FFmpeg-devel] [PATCH v4 11/11] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 00/14] Execution Graph Printing ffmpegagent 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 01/14] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-23 22:08 ` Stefano Sabatini 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 02/14] fftools/textformat: Apply quality improvements softworkz 2025-04-23 22:34 ` Stefano Sabatini 2025-04-23 22:53 ` softworkz . 2025-04-23 22:56 ` Nicolas George 2025-04-23 23:04 ` softworkz . 2025-04-23 23:16 ` softworkz . 2025-04-23 23:54 ` softworkz . 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 03/14] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-04-23 22:45 ` Stefano Sabatini 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 04/14] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-04-23 22:48 ` Stefano Sabatini 2025-04-23 22:55 ` softworkz . 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 05/14] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-23 22:49 ` Stefano Sabatini 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 06/14] fftools/textformat: AVTextWriter change writer_printf signature softworkz 2025-04-23 23:07 ` Stefano Sabatini 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 07/14] fftools/tf_internal: Use av_default_item_name softworkz 2025-04-23 22:57 ` Stefano Sabatini 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 08/14] fftools/textformat: Add function avtext_print_integer_flags() softworkz 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 09/14] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 10/14] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 11/14] fftools/resources: Add resource manager files softworkz 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 12/14] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 13/14] fftools/graphprint: Add execution graph printing softworkz 2025-04-22 21:55 ` [FFmpeg-devel] [PATCH v5 14/14] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-04-24 1:12 ` [FFmpeg-devel] [PATCH v6 00/13] Execution Graph Printing ffmpegagent 2025-04-24 1:12 ` [FFmpeg-devel] [PATCH v6 01/13] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 02/13] fftools/textformat: Apply quality improvements softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 03/13] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 04/13] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 05/13] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 06/13] fftools/tf_internal: Use av_default_item_name softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 07/13] fftools/textformat: Add function avtext_print_integer_flags() softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 08/13] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 09/13] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 10/13] fftools/resources: Add resource manager files softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 11/13] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 12/13] fftools/graphprint: Add execution graph printing softworkz 2025-04-25 22:26 ` Michael Niedermayer 2025-04-25 23:17 ` softworkz . 2025-04-24 1:13 ` [FFmpeg-devel] [PATCH v6 13/13] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-04-25 23:30 ` [FFmpeg-devel] [PATCH v7 00/13] Execution Graph Printing ffmpegagent 2025-04-25 23:30 ` [FFmpeg-devel] [PATCH v7 01/13] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-27 10:47 ` Stefano Sabatini 2025-04-25 23:30 ` [FFmpeg-devel] [PATCH v7 02/13] fftools/textformat: Apply quality improvements softworkz 2025-04-28 19:56 ` Stefano Sabatini 2025-04-28 20:05 ` softworkz . 2025-04-28 20:24 ` Stefano Sabatini 2025-04-28 20:40 ` softworkz . 2025-04-28 21:47 ` Stefano Sabatini 2025-04-28 22:49 ` softworkz . 2025-04-25 23:30 ` [FFmpeg-devel] [PATCH v7 03/13] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-04-25 23:30 ` [FFmpeg-devel] [PATCH v7 04/13] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 05/13] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 06/13] fftools/tf_internal: Use av_default_item_name softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 07/13] fftools/textformat: Add function avtext_print_integer_flags() softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 08/13] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 09/13] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 10/13] fftools/resources: Add resource manager files softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 11/13] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 12/13] fftools/graphprint: Add execution graph printing softworkz 2025-04-25 23:31 ` [FFmpeg-devel] [PATCH v7 13/13] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 00/15] Execution Graph Printing ffmpegagent 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 01/15] fftools/textformat: Formatting and whitespace changes softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 02/15] fftools/textformat: Apply quality improvements softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 03/15] fftools/textformat: Remove unused print_rational() pointer from AVTextFormatter softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 04/15] fftools/textformat: Rename name param to key for API consistency softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 05/15] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 06/15] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 07/15] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 08/15] fftools/tf_internal: Use av_default_item_name softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 09/15] fftools/textformat: Add flags param to function avtext_print_integer() softworkz 2025-04-29 0:59 ` [FFmpeg-devel] [PATCH v8 10/15] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-04-29 1:00 ` [FFmpeg-devel] [PATCH v8 11/15] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-04-29 1:00 ` [FFmpeg-devel] [PATCH v8 12/15] fftools/resources: Add resource manager files softworkz 2025-04-29 1:00 ` [FFmpeg-devel] [PATCH v8 13/15] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-04-29 20:25 ` Michael Niedermayer 2025-04-29 1:00 ` [FFmpeg-devel] [PATCH v8 14/15] fftools/graphprint: Add execution graph printing softworkz 2025-04-29 19:35 ` Michael Niedermayer 2025-04-29 20:33 ` softworkz . 2025-05-02 0:11 ` Michael Niedermayer 2025-05-02 0:48 ` softworkz . 2025-05-03 5:08 ` softworkz . 2025-04-29 1:00 ` [FFmpeg-devel] [PATCH v8 15/15] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 00/15] Execution Graph Printing ffmpegagent 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 01/15] fftools/textformat: Formatting and whitespace changes softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 02/15] fftools/textformat: Apply quality improvements softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 03/15] fftools/textformat: Remove unused print_rational() pointer from AVTextFormatter softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 04/15] fftools/textformat: Rename name param to key for API consistency softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 05/15] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 06/15] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 07/15] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 08/15] fftools/tf_internal: Use av_default_item_name softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 09/15] fftools/textformat: Add flags param to function avtext_print_integer() softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 10/15] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 11/15] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 12/15] fftools/resources: Add resource manager files with build-time compression softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 13/15] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 14/15] fftools/graphprint: Add execution graph printing softworkz 2025-05-03 23:57 ` Michael Niedermayer 2025-05-04 2:55 ` softworkz . 2025-05-03 8:22 ` [FFmpeg-devel] [PATCH v9 15/15] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 00/15] Execution Graph Printing ffmpegagent 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 01/15] fftools/textformat: Formatting and whitespace changes softworkz 2025-05-07 23:44 ` Stefano Sabatini 2025-05-07 23:59 ` softworkz . 2025-05-08 0:14 ` Stefano Sabatini 2025-05-08 0:20 ` softworkz . 2025-05-07 23:47 ` Stefano Sabatini 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 02/15] fftools/textformat: Apply quality improvements softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 03/15] fftools/textformat: Remove unused print_rational() pointer from AVTextFormatter softworkz 2025-05-07 23:49 ` Stefano Sabatini 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 04/15] fftools/textformat: Rename name param to key for API consistency softworkz 2025-05-07 23:50 ` Stefano Sabatini 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 05/15] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-05-07 23:58 ` Stefano Sabatini 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 06/15] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-05-08 0:05 ` Stefano Sabatini 2025-05-08 0:25 ` softworkz . 2025-05-08 21:38 ` Stefano Sabatini 2025-05-09 11:31 ` softworkz . 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 07/15] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 08/15] fftools/tf_internal: Use av_default_item_name softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 09/15] fftools/textformat: Add flags param to function avtext_print_integer() softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 10/15] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 11/15] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 12/15] fftools/resources: Add resource manager files with build-time compression softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 13/15] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 14/15] fftools/graphprint: Add execution graph printing softworkz 2025-05-04 2:57 ` [FFmpeg-devel] [PATCH v10 15/15] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 00/15] Execution Graph Printing ffmpegagent 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 01/15] fftools/textformat: Formatting and whitespace changes softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 02/15] fftools/textformat: Apply quality improvements softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 03/15] fftools/textformat: Remove unused print_rational() pointer from AVTextFormatter softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 04/15] fftools/textformat: Rename name param to key for API consistency softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 05/15] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 06/15] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 07/15] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 08/15] fftools/tf_internal: Use av_default_item_name softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 09/15] fftools/textformat: Add flags param to function avtext_print_integer() softworkz 2025-05-04 22:34 ` [FFmpeg-devel] [PATCH v11 10/15] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-05-04 22:35 ` [FFmpeg-devel] [PATCH v11 11/15] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-05-04 22:35 ` [FFmpeg-devel] [PATCH v11 12/15] fftools/resources: Add resource manager files with build-time compression softworkz 2025-05-04 22:35 ` [FFmpeg-devel] [PATCH v11 13/15] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-05-04 22:35 ` [FFmpeg-devel] [PATCH v11 14/15] fftools/graphprint: Add execution graph printing softworkz 2025-05-04 22:35 ` [FFmpeg-devel] [PATCH v11 15/15] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-05-07 2:06 ` [FFmpeg-devel] [PATCH v11 00/15] Execution Graph Printing softworkz . 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 " ffmpegagent 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 01/15] fftools/textformat: Apply formatting and whitespace changes softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 02/15] fftools/textformat: Apply quality improvements softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 03/15] fftools/textformat: Remove unused print_rational() pointer from AVTextFormatter softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 04/15] fftools/textformat: Rename name param to key for API consistency softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 05/15] fftools/avtextformat: Re-use BPrint in loop softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 06/15] fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open() softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 07/15] fftools/textformat: Introduce common header and deduplicate code softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 08/15] fftools/tf_internal: Use av_default_item_name softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 09/15] fftools/textformat: Add flags param to function avtext_print_integer() softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 10/15] fftools/ffmpeg_filter: Move some declaration to new header file softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 11/15] avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx() softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 12/15] fftools/resources: Add resource manager files with build-time compression softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 13/15] fftools/ffmpeg_mux: Make ms_from_ost() inline softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 14/15] fftools/graphprint: Add execution graph printing softworkz 2025-05-08 1:36 ` [FFmpeg-devel] [PATCH v12 15/15] fftools/graphprint: Now, make it a Killer-Feature! softworkz 2025-05-13 14:03 ` [FFmpeg-devel] [PATCH v12 00/15] Execution Graph Printing softworkz . 2025-05-15 21:46 ` softworkz .
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=GV1P250MB073716AA776C301A980CB90B8FBD2@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM \ --to=andreas.rheinhardt@outlook.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
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