sd_ass: fix some corner cases in tag stripping

This behavior is implied by VSFilter.
This commit is contained in:
wm4 2015-02-12 12:18:19 +01:00
parent 7bbc617019
commit 545a0e59df
1 changed files with 14 additions and 5 deletions

View File

@ -181,6 +181,7 @@ static void append(struct buf *b, char c)
static void ass_to_plaintext(struct buf *b, const char *in) static void ass_to_plaintext(struct buf *b, const char *in)
{ {
bool in_tag = false; bool in_tag = false;
const char *open_tag_pos = NULL;
bool in_drawing = false; bool in_drawing = false;
while (*in) { while (*in) {
if (in_tag) { if (in_tag) {
@ -189,11 +190,13 @@ static void ass_to_plaintext(struct buf *b, const char *in)
in_tag = false; in_tag = false;
} else if (in[0] == '\\' && in[1] == 'p') { } else if (in[0] == '\\' && in[1] == 'p') {
in += 2; in += 2;
// skip text between \pN and \p0 tags // Skip text between \pN and \p0 tags. A \p without a number
if (in[0] == '0') { // is the same as \p0, and leading 0s are also allowed.
in_drawing = false; in_drawing = false;
} else if (in[0] >= '1' && in[0] <= '9') { while (in[0] >= '0' && in[0] <= '9') {
in_drawing = true; if (in[0] != '0')
in_drawing = true;
in += 1;
} }
} else { } else {
in += 1; in += 1;
@ -206,6 +209,7 @@ static void ass_to_plaintext(struct buf *b, const char *in)
in += 2; in += 2;
append(b, ' '); append(b, ' ');
} else if (in[0] == '{') { } else if (in[0] == '{') {
open_tag_pos = in;
in += 1; in += 1;
in_tag = true; in_tag = true;
} else { } else {
@ -215,6 +219,11 @@ static void ass_to_plaintext(struct buf *b, const char *in)
} }
} }
} }
// A '{' without a closing '}' is always visible.
if (in_tag) {
while (*open_tag_pos)
append(b, *open_tag_pos++);
}
} }
// Empty string counts as whitespace. Reads s[len-1] even if there are \0s. // Empty string counts as whitespace. Reads s[len-1] even if there are \0s.