diff options
Diffstat (limited to 'libass/ass.c')
-rw-r--r-- | libass/ass.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/libass/ass.c b/libass/ass.c index e08a76a..ef3b471 100644 --- a/libass/ass.c +++ b/libass/ass.c @@ -681,6 +681,26 @@ static int process_styles_line(ASS_Track *track, char *str) return ret; } +static inline void parse_script_type(ASS_Track *track, const char *str) +{ + // VSF compat: don't check for leading 'v' and + // parse value from the last non-space backwards + const char *p = str + strlen(str); + rskip_spaces((char **) &p, (char *) str); + size_t len = p - str; + if (len < 4) // rskip_spaces stops _at_ last space + return; + + int ver = TRACK_TYPE_SSA; + if (*(p-1) == '+') { + ver = TRACK_TYPE_ASS; + --len; --p; + } + + if (len >= 4 && !strncmp(p-4, "4.00", 4)) + track->track_type = ver; +} + static inline void check_duplicate_info_line(const ASS_Track *const track, const ScriptInfo si, const char *const name) @@ -723,6 +743,9 @@ static int process_info_line(ASS_Track *track, char *str) while (*p && ass_isspace(*p)) p++; free(track->Language); track->Language = strndup(p, 2); + } else if (!strncmp(str, "ScriptType:", 11)) { + check_duplicate_info_line(track, SINFO_SCRIPTTYPE, "ScriptType"); + parse_script_type(track, str + 11); } else if (!strncmp(str, "; Script generated by ", 22)) { if (!strncmp(str + 22,"FFmpeg/Lavc", 11)) track->parser_priv->header_flags |= GENBY_FFMPEG; @@ -783,9 +806,8 @@ static bool detect_legacy_conv_subs(ASS_Track *track) */ // GENBY_FFMPEG and exact ffmpeg headers required - // Note: If there's SINFO_SCRIPTTYPE in the future this needs to be updated if (track->parser_priv->header_flags - ^ (SINFO_PLAYRESX | SINFO_PLAYRESY | GENBY_FFMPEG)) + != (SINFO_SCRIPTTYPE | SINFO_PLAYRESX | SINFO_PLAYRESY | GENBY_FFMPEG)) return false; // Legacy ffmpeg only ever has one style |