[FFmpeg-devel] [PATCH v2] libavfi/vf_drawtext: fix memory management when destroying font face
Leandro Santiago
leandrosansilva at gmail.com
Thu Nov 14 16:52:40 EET 2024
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.
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
More information about the ffmpeg-devel
mailing list