[FFmpeg-devel] [PATCH] avfilter/framepool: use av_image_fill_plane_sizes() to calculate pool sizes

James Almer jamrial at gmail.com
Thu Mar 3 18:57:53 EET 2022



On 3/3/2022 1:46 PM, Paul B Mahol wrote:
> On 3/3/22, James Almer <jamrial at gmail.com> wrote:
>>
>>
>> On 3/3/2022 10:56 AM, Paul B Mahol wrote:
>>> On 3/3/22, James Almer <jamrial at gmail.com> wrote:
>>>>
>>>>
>>>> On 3/1/2022 11:23 AM, James Almer wrote:
>>>>> Signed-off-by: James Almer <jamrial at gmail.com>
>>>>> ---
>>>>>     libavfilter/framepool.c | 20 ++++++++++++++------
>>>>>     1 file changed, 14 insertions(+), 6 deletions(-)
>>>>>
>>>>> diff --git a/libavfilter/framepool.c b/libavfilter/framepool.c
>>>>> index 5b510c9af9..cf6a1d0ea0 100644
>>>>> --- a/libavfilter/framepool.c
>>>>> +++ b/libavfilter/framepool.c
>>>>> @@ -57,6 +57,8 @@ FFFramePool *ff_frame_pool_video_init(AVBufferRef*
>>>>> (*alloc)(size_t size),
>>>>>         int i, ret;
>>>>>         FFFramePool *pool;
>>>>>         const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format);
>>>>> +    ptrdiff_t linesizes[4];
>>>>> +    size_t sizes[4];
>>>>>
>>>>>         if (!desc)
>>>>>             return NULL;
>>>>> @@ -89,13 +91,19 @@ FFFramePool *ff_frame_pool_video_init(AVBufferRef*
>>>>> (*alloc)(size_t size),
>>>>>             }
>>>>>         }
>>>>>
>>>>> -    for (i = 0; i < 4 && pool->linesize[i]; i++) {
>>>>> -        int h = pool->height;
>>>>> -        if (i == 1 || i == 2)
>>>>> -            h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
>>>>> +    for (i = 0; i < 4; i++)
>>>>> +        linesizes[i] = pool->linesize[i];
>>>>>
>>>>> -        pool->pools[i] = av_buffer_pool_init(pool->linesize[i] * h +
>>>>> align,
>>>>> -                                             alloc);
>>>>> +    if (av_image_fill_plane_sizes(sizes, pool->format,
>>>>> +                                  FFALIGN(pool->height, align),
>>>>> +                                  linesizes) < 0) {
>>>>> +        goto fail;
>>>>> +    }
>>>>> +
>>>>> +    for (i = 0; i < 4 && sizes[i]; i++) {
>>>>> +        if (sizes[i] > SIZE_MAX - align)
>>>>> +            goto fail;
>>>>> +        pool->pools[i] = av_buffer_pool_init(sizes[i] + align, alloc);
>>>>>             if (!pool->pools[i])
>>>>>                 goto fail;
>>>>>         }
>>>>
>>>> Ping. I can also remove the height padding if preferred.
>>>
>>> It does not work. No?
>>
>> It doesn't fix the mpeg encoder issue with yuv422p streams and 64 stride
>> alignment, no, but it's not strictly about that either. It's a
>> simplification using existing helpers.
> 
> Ok, if you need it.

Applied without the vertical padding, to not change the behavior your 
introduced in 17a59a634c.


More information about the ffmpeg-devel mailing list