-
-
Save rcombs/f562ee1e07a529cfe44e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/libavcodec/ass_split.c b/libavcodec/ass_split.c | |
index 2458cb9..7a28909 100644 | |
--- a/libavcodec/ass_split.c | |
+++ b/libavcodec/ass_split.c | |
@@ -426,30 +426,37 @@ int ff_ass_split_override_codes(const ASSCodesCallbacks *callbacks, void *priv, | |
const char *text = NULL; | |
char new_line[2]; | |
int text_len = 0; | |
+ int drawing = 0; | |
while (buf && *buf) { | |
if (text && callbacks->text && | |
- (sscanf(buf, "\\%1[nN]", new_line) == 1 || | |
- !strncmp(buf, "{\\", 2))) { | |
- callbacks->text(priv, text, text_len); | |
+ (sscanf(buf, "\\%1[nNh]", new_line) == 1 || | |
+ *buf == '{')) { | |
+ if (!drawing) | |
+ callbacks->text(priv, text, text_len); | |
text = NULL; | |
} | |
- if (sscanf(buf, "\\%1[nN]", new_line) == 1) { | |
+ if (sscanf(buf, "\\%1[h]", new_line) == 1) { | |
+ callbacks->text(priv, "\u00A0", 1); | |
+ buf += 2; | |
+ } else if (sscanf(buf, "\\%1[nN]", new_line) == 1) { | |
if (callbacks->new_line) | |
callbacks->new_line(priv, new_line[0] == 'N'); | |
buf += 2; | |
- } else if (!strncmp(buf, "{\\", 2)) { | |
- buf++; | |
+ } else if (*buf == '{' && strchr(buf, '}')) { | |
+ buf += strcspn(buf, "\\}"); // skip comments | |
while (*buf == '\\') { | |
char style[2], c[2], sep[2], c_num[2] = "0", tmp[128] = {0}; | |
unsigned int color = 0xFFFFFFFF; | |
- int len, size = -1, an = -1, alpha = -1; | |
+ int len = 2, size = -1, an = -1, alpha = -1; | |
int x1, y1, x2, y2, t1 = -1, t2 = -1; | |
if (sscanf(buf, "\\%1[bisu]%1[01\\}]%n", style, c, &len) > 1) { | |
int close = c[0] == '0' ? 1 : c[0] == '1' ? 0 : -1; | |
len += close != -1; | |
if (callbacks->style) | |
callbacks->style(priv, style[0], close); | |
+ } else if (sscanf(buf, "\\p%u%1[\\}]%n", &size, sep, &len) > 1) { | |
+ drawing = (size > 0); | |
} else if (sscanf(buf, "\\c%1[\\}]%n", sep, &len) > 0 || | |
sscanf(buf, "\\c&H%X&%1[\\}]%n", &color, sep, &len) > 1 || | |
sscanf(buf, "\\%1[1234]c%1[\\}]%n", c_num, sep, &len) > 1 || | |
@@ -492,13 +499,11 @@ int ff_ass_split_override_codes(const ASSCodesCallbacks *callbacks, void *priv, | |
} else if (sscanf(buf, "\\org(%d,%d)%1[\\}]%n", &x1, &y1, sep, &len) > 2) { | |
if (callbacks->origin) | |
callbacks->origin(priv, x1, y1); | |
- } else { | |
- len = strcspn(buf+1, "\\}") + 2; /* skip unknown code */ | |
} | |
buf += len - 1; | |
+ buf += strcspn(buf, "\\}"); // skip comments | |
} | |
- if (*buf++ != '}') | |
- return AVERROR_INVALIDDATA; | |
+ buf++; // skip } | |
} else { | |
if (!text) { | |
text = buf; | |
@@ -508,7 +513,7 @@ int ff_ass_split_override_codes(const ASSCodesCallbacks *callbacks, void *priv, | |
buf++; | |
} | |
} | |
- if (text && callbacks->text) | |
+ if (text && callbacks->text && !drawing) | |
callbacks->text(priv, text, text_len); | |
if (callbacks->end) | |
callbacks->end(priv); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment