[FFmpeg-devel] [PATCH 3/4] avcodec/mpegutils: consolidate single byte av_log()
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Sat Sep 4 18:32:14 EEST 2021
Michael Niedermayer:
> On Fri, Sep 03, 2021 at 09:00:22PM +0200, Andreas Rheinhardt wrote:
>> Michael Niedermayer:
>>> 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);
>>> }
>>> -
>>> /* 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);
>>
>> Is it guaranteed that mb_width can't be huge? (I wouldn't be surprised
>> if there were a compile-time bound for it; this could be used for a
>> stack allocation.)
>
> i had no major problem creating a file with a mb_width above 40k, the failure
> was from allocating the image if the size was increased not anything inherent
> to mb_width
> not every codec and container allows this but some do, i picked
> msmpeg4v3 in nut but that is not a unique choice at all
>
Forget what I said above in parentheses: I thought that the size of a
single macroblock is bounded for all codecs using this function. But
mb_width is apparently the width of the picture in macroblocks.
>
>>
>>> + 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;
>>> }
>>> if (avctx->debug & FF_DEBUG_QP) {
>>> - av_log(avctx, AV_LOG_DEBUG, "%2d",
>>> - qscale_table[x + y * mb_stride]);
>>> + int q = qscale_table[x + y * mb_stride];
>>> + *mbs++ = '0' + q/10;
>>> + *mbs++ = '0' + q%10;
>>
>> This is only equivalent to the old code if the value is in the range
>> 0-99. Is this guaranteed?
>
> the code prior to this assumed so, if it exceeded it, the output would
> become difficult to read. So if this assumtation is wrong we would need to
> already fix that, Do you know of a case where this is wrong ?
>
No.
- Andreas
More information about the ffmpeg-devel
mailing list