From b784346e789814362e196e513a8988cd02d96bac Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Tue, 1 Jun 2010 22:49:22 +0200 Subject: [PATCH] libass: match font attachments based on extension Instead of only relying on the MIME type, use the file extension as a fallback for deciding which attachments are fonts and should be fed to libass. This also refactors the check into a separate function in mpcommon. --- mencoder.c | 5 +---- mpcommon.c | 18 ++++++++++++++++++ mpcommon.h | 1 + mplayer.c | 5 +---- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/mencoder.c b/mencoder.c index 63c4e8bdd1..47f9979b0e 100644 --- a/mencoder.c +++ b/mencoder.c @@ -1060,10 +1060,7 @@ default: { if (ass_library) { for (i = 0; i < demuxer->num_attachments; ++i) { demux_attachment_t* att = demuxer->attachments + i; - if (use_embedded_fonts && - att->name && att->type && att->data && att->data_size && - (strcmp(att->type, "application/x-truetype-font") == 0 || - strcmp(att->type, "application/x-font") == 0)) + if (use_embedded_fonts && attachment_is_font(att)) ass_add_font(ass_library, att->name, att->data, att->data_size); } } diff --git a/mpcommon.c b/mpcommon.c index 61d61c743c..5756b8ad6a 100644 --- a/mpcommon.c +++ b/mpcommon.c @@ -297,6 +297,24 @@ int select_audio(demuxer_t* demuxer, int audio_id, char* audio_lang) return demuxer->audio->id; } +bool attachment_is_font(struct demux_attachment *att) +{ + if (!att->name || !att->type || !att->data || !att->data_size) + return false; + // match against MIME types + if (strcmp(att->type, "application/x-truetype-font") == 0 + || strcmp(att->type, "application/x-font") == 0) + return true; + // fallback: match against file extension + if (strlen(att->name) > 4) { + char *ext = att->name + strlen(att->name) - 4; + if (strcasecmp(ext, ".ttf") == 0 || strcasecmp(ext, ".ttc") == 0 + || strcasecmp(ext, ".otf") == 0) + return true; + } + return false; +} + /* Parse -noconfig common to both programs */ int disable_system_conf=0; int disable_user_conf=0; diff --git a/mpcommon.h b/mpcommon.h index d7894edf06..3c35b8221a 100644 --- a/mpcommon.h +++ b/mpcommon.h @@ -35,6 +35,7 @@ void update_subtitles(struct MPContext *mpctx, struct MPOpts *opts, void update_teletext(sh_video_t *sh_video, demuxer_t *demuxer, int reset); int select_audio(demuxer_t* demuxer, int audio_id, char* audio_lang); void set_osd_subtitle(struct MPContext *mpctx, subtitle *subs); +bool attachment_is_font(struct demux_attachment *att); extern int disable_system_conf; extern int disable_user_conf; diff --git a/mplayer.c b/mplayer.c index fdead085ba..6be87667cc 100644 --- a/mplayer.c +++ b/mplayer.c @@ -3756,10 +3756,7 @@ if (opts->ass_enabled && ass_library) { struct demuxer *d = mpctx->sources[j].demuxer; for (int i = 0; i < d->num_attachments; i++) { struct demux_attachment *att = d->attachments + i; - if (use_embedded_fonts - && att->name && att->type && att->data && att->data_size - && (strcmp(att->type, "application/x-truetype-font") == 0 - || strcmp(att->type, "application/x-font") == 0)) + if (use_embedded_fonts && attachment_is_font(att)) ass_add_font(ass_library, att->name, att->data, att->data_size); } }