[FFmpeg-devel] [PATCH 3/4] avcodec/mpegutils: consolidate single byte av_log()

James Almer jamrial at gmail.com
Sat Sep 4 19:37:26 EEST 2021


On 9/4/2021 12:28 PM, Michael Niedermayer wrote:
> On Fri, Sep 03, 2021 at 03:45:55PM -0300, James Almer wrote:
>> On 9/3/2021 3:39 PM, Michael Niedermayer wrote:
>>> Fixes: Timeout (56sec -> 15sec)
>>> Fixes: 37141/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_MPEG4_fuzzer-6192122867875840
>>>
>>> Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
>>> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
>>> ---
>>>    libavcodec/mpegutils.c | 56 ++++++++++++++++++++++++------------------
>>>    1 file changed, 32 insertions(+), 24 deletions(-)
>>>
>>> diff --git a/libavcodec/mpegutils.c b/libavcodec/mpegutils.c
>>> index e5105ecc58..e91c554781 100644
>>> --- a/libavcodec/mpegutils.c
>>> +++ b/libavcodec/mpegutils.c
>>> @@ -187,7 +187,6 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_
>>>            av_freep(&mvs);
>>>        }
>>> -
>>
>> Stray change.
>>
>>>        /* TODO: export all the following to make them accessible for users (and filters) */
>>>        if (avctx->hwaccel || !mbtype_table)
>>>            return;
>>> @@ -195,71 +194,80 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_
>>>        if (avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
>>>            int x,y;
>>> +#define MB_STRING_SIZE 6
>>> +        char *mbstring = av_malloc(MB_STRING_SIZE * mb_width + 1);
>>> +        if (!mbstring)
>>> +            return;
>>>            av_log(avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
>>>                   av_get_picture_type_char(pict->pict_type));
>>>            for (y = 0; y < mb_height; y++) {
>>> +            char *mbs = mbstring;
>>>                for (x = 0; x < mb_width; x++) {
>>> +                av_assert0(mbs - mbstring <= MB_STRING_SIZE * x);
>>>                    if (avctx->debug & FF_DEBUG_SKIP) {
>>>                        int count = mbskip_table ? mbskip_table[x + y * mb_stride] : 0;
>>>                        if (count > 9)
>>>                            count = 9;
>>> -                    av_log(avctx, AV_LOG_DEBUG, "%1d", count);
>>> +                    *mbs++ = '0' + count;
>>
>> This is ugly and not very obvious at first glance. Can you use lavu's bprint
>> or something like that instead?
> 
> the whole point of the patch is to eliminate the string formating overhead.
> (which surprisingly is significant)
> so as long as we have a "%d" style format in there, it at least feels like we
> arent doing a good job at eliminating it

Is the string formatting the problem, or the constant calls to av_log()?

av_bprintf() would do the string formatting, but append each character 
into a buffer you can then use to call av_log() once at the end.
Something like

av_bprint_init(&bp, MB_STRING_SIZE * mb_width + 1, UINT_MAX);
[...]
av_bprintf(&bp, "%1d", count);
av_bprint_chars(&bp, 'P', 1);
[...]
av_bprint_finalize(&bp, &buf);
av_log(avctx, AV_LOG_DEBUG, "%s\n" buf);
av_free(buf);

> 
> would moving this in a seperate function resolve this concern too ?

If the above doesn't perform well (Or you don't feel like trying it), 
then an inline function or macro should be fine.

> 
> thx
> 
> [...]
> 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 



More information about the ffmpeg-devel mailing list