Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
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".

  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