[FFmpeg-devel] [PATCH v2] libavfi/vf_drawtext: fix memory management when destroying font face

Marton Balint cus at passwd.hu
Wed Nov 20 00:46:50 EET 2024



On Thu, 14 Nov 2024, Leandro Santiago wrote:

> Just as a ping, to know whether anyone is able to have a look at this patch :-)
>
> Please let me know if you folks need extra context or info.

Will apply with some cosmetic changes.

Thanks,
Marton

>
> 31 Oct 2024 21:48:31 Leandro Santiago <leandrosansilva at gmail.com>:
>
>> Ref https://trac.ffmpeg.org/ticket/11152
>> 
>> According to harfbuzz docs, hb_ft_font_set_funcs() does not need to be
>> called, as, quoted:
>> 
>> ```
>> An #hb_font_t object created with hb_ft_font_create()
>> is preconfigured for FreeType font functions and does not
>> require this function to be used.
>> ```
>> 
>> Using this function seems to cause memory management issues between
>> harfbuzz and freetype, and could be eliminated.
>> 
>> This commit also call hb_ft_font_changed() when the underlying FC_Face
>> changes size, as stated on hardbuzz:
>> 
>> ```
>> HarfBuzz also provides a utility function called hb_ft_font_changed() that you should call
>> whenever you have altered the properties of your underlying FT_Face, as well as a hb_ft_get_face()
>> that you can call on an hb_font_t font object to fetch its underlying FT_Face.
>> ```
>> 
>> Finally, the execution order between hb_font_destroy() and
>> hb_buffer_destroy() is flipped to match the order of creation of
>> the respective objects.
>> 
>> Signed-off-by: Leandro Santiago <leandrosansilva at gmail.com>
>> ---
>> libavfilter/vf_drawtext.c | 15 ++++++++++++---
>> 1 file changed, 12 insertions(+), 3 deletions(-)
>> 
>> diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
>> index 2b0a21a4b4..cf99b4e59e 100644
>> --- a/libavfilter/vf_drawtext.c
>> +++ b/libavfilter/vf_drawtext.c
>> @@ -445,6 +445,7 @@ static int glyph_cmp(const void *key, const void *b)
>> static av_cold int set_fontsize(AVFilterContext *ctx, unsigned int fontsize)
>> {
>>      int err;
>> +    int line;
>>      DrawTextContext *s = ctx->priv;
>> 
>>      if ((err = FT_Set_Pixel_Sizes(s->face, 0, fontsize))) {
>> @@ -453,6 +454,12 @@ static av_cold int set_fontsize(AVFilterContext *ctx, unsigned int fontsize)
>>          return AVERROR(EINVAL);
>>      }
>> 
>> +    // Whenever the underlying FT_Face changes, harfbuzz has to be notified of the change.
>> +    for (line = 0; line < s->line_count; line++) {
>> +      TextLine *cur_line = &s->lines[line];
>> +      hb_ft_font_changed(cur_line->hb_data.font);
>> +    }
>> +
>>      s->fontsize = fontsize;
>> 
>>      return 0;
>> @@ -1365,15 +1372,17 @@ static int shape_text_hb(DrawTextContext *s, HarfbuzzData* hb, const char* text,
>>      if(!hb_buffer_allocation_successful(hb->buf)) {
>>          return AVERROR(ENOMEM);
>>      }
>> +
>>      hb_buffer_set_direction(hb->buf, HB_DIRECTION_LTR);
>>      hb_buffer_set_script(hb->buf, HB_SCRIPT_LATIN);
>>      hb_buffer_set_language(hb->buf, hb_language_from_string("en", -1));
>>      hb_buffer_guess_segment_properties(hb->buf);
>> -    hb->font = hb_ft_font_create(s->face, NULL);
>> +
>> +    hb->font = hb_ft_font_create_referenced(s->face);
>>      if(hb->font == NULL) {
>>          return AVERROR(ENOMEM);
>>      }
>> -    hb_ft_font_set_funcs(hb->font);
>> +
>>      hb_buffer_add_utf8(hb->buf, text, textLen, 0, -1);
>>      hb_shape(hb->font, hb->buf, NULL, 0);
>>      hb->glyph_info = hb_buffer_get_glyph_infos(hb->buf, &hb->glyph_count);
>> @@ -1384,8 +1393,8 @@ static int shape_text_hb(DrawTextContext *s, HarfbuzzData* hb, const char* text,
>> 
>> static void hb_destroy(HarfbuzzData *hb)
>> {
>> -    hb_buffer_destroy(hb->buf);
>>      hb_font_destroy(hb->font);
>> +    hb_buffer_destroy(hb->buf);
>>      hb->buf = NULL;
>>      hb->font = NULL;
>>      hb->glyph_info = NULL;
>> -- 
>> 2.46.1
> _______________________________________________
> 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