[FFmpeg-devel] [PATCH] lavfi/subtitles: load attached fonts to libass.

Clément Bœsch u at pkh.me
Tue Apr 8 14:42:52 CEST 2014


On Mon, Apr 07, 2014 at 11:35:01PM -0300, Facundo Gaich wrote:
> Videos with complex typesetting usually have font files embedded
> as attachment streams. vf_subtitles now finds all attachment
> streams with a MIME type associated with fonts and loads them
> to libass so it can use them for rendering.
> 
> The code was basically ported from mpv's loadfile.c at 929793be7
> 
> Signed-off-by: Facundo Gaich <facugaich at gmail.com>
> ---
>  libavfilter/vf_subtitles.c | 53 +++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 52 insertions(+), 1 deletion(-)
> 
> diff --git a/libavfilter/vf_subtitles.c b/libavfilter/vf_subtitles.c
> index e44f61d..8586304 100644
> --- a/libavfilter/vf_subtitles.c
> +++ b/libavfilter/vf_subtitles.c
> @@ -249,11 +249,34 @@ static const AVOption subtitles_options[] = {
>      {NULL},
>  };
>  
> +static const char *font_mimetypes[] = {
> +    "application/x-truetype-font",
> +    "application/vnd.ms-opentype",
> +    "application/x-font-ttf",
> +    "application/x-font",
> +    NULL
> +};
> +
> +static int attachment_is_font(AVStream * st)
> +{
> +    const AVDictionaryEntry *tag = NULL;
> +
> +    tag = av_dict_get(st->metadata, "mimetype", NULL, AV_DICT_MATCH_CASE);
> +
> +    if (tag) {
> +        for (int n = 0; font_mimetypes[n]; n++) {

int should be out of the loop (it's not supported by all the compilers
FFmpeg supports).

> +            if (strcmp(font_mimetypes[n], tag->value) == 0)
> +                return 1;
> +        }
> +    }
> +    return 0;
> +}
> +
>  AVFILTER_DEFINE_CLASS(subtitles);
>  
>  static av_cold int init_subtitles(AVFilterContext *ctx)
>  {
> -    int ret, sid;
> +    int ret, sid, loaded_fonts;
>      AVDictionary *codec_opts = NULL;
>      AVFormatContext *fmt = NULL;
>      AVCodecContext *dec_ctx = NULL;
> @@ -293,6 +316,34 @@ static av_cold int init_subtitles(AVFilterContext *ctx)
>      sid = ret;
>      st = fmt->streams[sid];
>  
> +    /* Load attached fonts */
> +    for (int j = 0; j < fmt->nb_streams; j++) {

ditto

> +        AVStream *st = fmt->streams[j];
> +        if ((st->codec->codec_type == AVMEDIA_TYPE_ATTACHMENT) &&

Extra parenthesis

> +            attachment_is_font(st)) {
> +            const AVDictionaryEntry *tag = NULL;
> +            tag = av_dict_get(st->metadata, "filename", NULL,
> +                              AV_DICT_MATCH_CASE);
> +
> +            if (tag) {
> +                av_log(ctx, AV_LOG_DEBUG, "Loading attached font: %s\n",
> +                       tag->value);
> +                ass_add_font(ass->library, tag->value,
> +                             st->codec->extradata,
> +                             st->codec->extradata_size);
> +                loaded_fonts = 1;
> +            } else {
> +                av_log(ctx, AV_LOG_WARNING,
> +                       "Font attachment has no filename, ignored.\n");
> +            }
> +        }
> +    }
> +    if (loaded_fonts) {
> +        /* Ideally this would be ass_fonts_update, but it seems to be broken
> +         * as of libass 0.11.1 */

Can you add a bug id or something for reference in the comment?

> +        ass_set_fonts(ass->renderer, NULL, NULL, 1, NULL, 1);
> +    }
> +
>      /* Open decoder */
>      dec_ctx = st->codec;
>      dec = avcodec_find_decoder(dec_ctx->codec_id);

Otherwise it looks OK.

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20140408/13ca2bd3/attachment.asc>


More information about the ffmpeg-devel mailing list