# HG changeset patch # User eugeni # Date 1157305351 0 # Node ID 2c016957360a55f7265c30cb1eca7bc9ac8357da # Parent 8135cbd2dbc591ec3a3c4a170e7805a7908e18b5 Add -ass-styles option. It allows to load styles from a file and use them for plain text subtitles rendering. diff -r 8135cbd2dbc5 -r 2c016957360a cfg-common.h --- a/cfg-common.h Sun Sep 03 17:36:29 2006 +0000 +++ b/cfg-common.h Sun Sep 03 17:42:31 2006 +0000 @@ -318,6 +318,7 @@ {"ass-force-style", &ass_force_style_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, {"ass-color", &ass_color, CONF_TYPE_STRING, 0, 0, 0, NULL}, {"ass-border-color", &ass_border_color, CONF_TYPE_STRING, 0, 0, 0, NULL}, + {"ass-styles", &ass_styles_file, CONF_TYPE_STRING, 0, 0, 0, NULL}, #endif #ifdef HAVE_FONTCONFIG {"fontconfig", &font_fontconfig, CONF_TYPE_FLAG, 0, 0, 1, NULL}, diff -r 8135cbd2dbc5 -r 2c016957360a libass/ass.c --- a/libass/ass.c Sun Sep 03 17:36:29 2006 +0000 +++ b/libass/ass.c Sun Sep 03 17:42:31 2006 +0000 @@ -28,8 +28,10 @@ char *get_path(char *); +typedef enum {PST_UNKNOWN = 0, PST_INFO, PST_STYLES, PST_EVENTS, PST_FONTS} parser_state_t; + struct parser_priv_s { - enum {PST_UNKNOWN = 0, PST_INFO, PST_STYLES, PST_EVENTS, PST_FONTS} state; + parser_state_t state; char* fontname; char* fontdata; int fontdata_size; @@ -844,18 +846,15 @@ #endif // ICONV /** - * \brief Read subtitles from file. - * \param fname file name - * \return newly allocated track -*/ -ass_track_t* ass_read_file(char* fname) + * \brief read file contents into newly allocated buffer, recoding to utf-8 + */ +static char* read_file(char* fname) { int res; long sz; long bytes_read; char* buf; - ass_track_t* track; - + FILE* fp = fopen(fname, "rb"); if (!fp) { mp_msg(MSGT_GLOBAL, MSGL_WARN, "ass_read_file(%s): fopen failed\n", fname); @@ -899,11 +898,25 @@ if (sub_cp) { char* tmpbuf = sub_recode(buf, sz); free(buf); - if (!tmpbuf) - return 0; buf = tmpbuf; } #endif + return buf; +} + +/** + * \brief Read subtitles from file. + * \param fname file name + * \return newly allocated track +*/ +ass_track_t* ass_read_file(char* fname) +{ + char* buf; + ass_track_t* track; + + buf = read_file(fname); + if (!buf) + return 0; track = ass_new_track(); track->name = strdup(fname); @@ -930,6 +943,26 @@ return track; } +/** + * \brief read styles from file into already initialized track + */ +int ass_read_styles(ass_track_t* track, char* fname) +{ + char* buf; + parser_state_t old_state; + + buf = read_file(fname); + if (!buf) + return 1; + + old_state = track->parser_priv->state; + track->parser_priv->state = PST_STYLES; + process_text(track, buf); + track->parser_priv->state = old_state; + + return 0; +} + static char* validate_fname(char* name) { char* fname; diff -r 8135cbd2dbc5 -r 2c016957360a libass/ass.h --- a/libass/ass.h Sun Sep 03 17:36:29 2006 +0000 +++ b/libass/ass.h Sun Sep 03 17:42:31 2006 +0000 @@ -130,6 +130,12 @@ ass_track_t* ass_read_file(char* fname); /** + * \brief read styles from file into already initialized track + * \return 0 on success + */ +int ass_read_styles(ass_track_t* track, char* fname); + +/** * \brief Process embedded matroska font. Saves it to ~/.mplayer/fonts. * \param name attachment name * \param data binary font data diff -r 8135cbd2dbc5 -r 2c016957360a libass/ass_mp.c --- a/libass/ass_mp.c Sun Sep 03 17:36:29 2006 +0000 +++ b/libass/ass_mp.c Sun Sep 03 17:42:31 2006 +0000 @@ -19,6 +19,7 @@ int ass_use_margins = 0; char* ass_color = NULL; char* ass_border_color = NULL; +char* ass_styles_file = NULL; extern int font_fontconfig; extern char* font_name; @@ -30,10 +31,6 @@ ass_track_t* ass_default_track() { ass_track_t* track = ass_new_track(); - ass_style_t* style; - int sid; - double fs; - uint32_t c1, c2; track->track_type = TRACK_TYPE_ASS; track->Timer = 100.; @@ -41,6 +38,15 @@ track->PlayResY = 288; track->WrapStyle = 0; + if (ass_styles_file) + ass_read_styles(track, ass_styles_file); + + if (track->n_styles == 0) { + ass_style_t* style; + int sid; + double fs; + uint32_t c1, c2; + sid = ass_alloc_style(track); style = track->styles + sid; style->Name = strdup("Default"); @@ -71,6 +77,7 @@ style->MarginV = 20; style->ScaleX = 1.; style->ScaleY = 1.; + } return track; } diff -r 8135cbd2dbc5 -r 2c016957360a libass/ass_mp.h --- a/libass/ass_mp.h Sun Sep 03 17:36:29 2006 +0000 +++ b/libass/ass_mp.h Sun Sep 03 17:42:31 2006 +0000 @@ -13,6 +13,7 @@ extern int ass_use_margins; extern char* ass_color; extern char* ass_border_color; +extern char* ass_styles_file; ass_track_t* ass_default_track(); int ass_process_subtitle(ass_track_t* track, subtitle* sub);