summaryrefslogtreecommitdiffstats
path: root/libass/ass.c
diff options
context:
space:
mode:
Diffstat (limited to 'libass/ass.c')
-rw-r--r--libass/ass.c26
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