mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
avcodec/movtextdec: Fix immediately adjacent styles
The checks for whether a style should be opened/closed at the current character position are as follows: A variable entry contained the index of the currently active or potentially next active style. If the current character position coincided with the start of style[entry], the style was activated; this was followed by a check whether the current character position coincided with the end of style[entry]; if so, the style was deactivated and entry incremented. Afterwards the char was processed. The order of the checks leads to problems in case the endChar of style A coincides with the startChar of the next style (say B): Style B was never opened. When we are at said common position, the currently active style is A and so the start pos check does not succeed; but the end pos check does and it closes the currently active style A and increments entry. At the next iteration of the loop, the current character position is bigger than the start position of style B (which is style[entry]) and therefore the style is not activated. The solution is of course to first check for whether a style needs to be closed (and increment entry if it does) before checking whether the next style needs to be opened. Reviewed-by: Philip Langdale <philipl@overt.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
40c16907bb
commit
dd80066c97
@ -373,7 +373,16 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end,
|
|||||||
|
|
||||||
if ((m->box_flags & STYL_BOX) && entry < m->style_entries) {
|
if ((m->box_flags & STYL_BOX) && entry < m->style_entries) {
|
||||||
const StyleBox *style = &m->s[entry];
|
const StyleBox *style = &m->s[entry];
|
||||||
if (text_pos == style->style_start) {
|
if (text_pos == style->style_end) {
|
||||||
|
if (style_active) {
|
||||||
|
av_bprintf(buf, "{\\r}");
|
||||||
|
style_active = 0;
|
||||||
|
color = m->d.color;
|
||||||
|
}
|
||||||
|
entry++;
|
||||||
|
style++;
|
||||||
|
}
|
||||||
|
if (entry < m->style_entries && text_pos == style->style_start) {
|
||||||
style_active = 1;
|
style_active = 1;
|
||||||
if (style->bold ^ m->d.bold)
|
if (style->bold ^ m->d.bold)
|
||||||
av_bprintf(buf, "{\\b%d}", style->bold);
|
av_bprintf(buf, "{\\b%d}", style->bold);
|
||||||
@ -395,14 +404,6 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end,
|
|||||||
if (m->d.alpha != style->alpha)
|
if (m->d.alpha != style->alpha)
|
||||||
av_bprintf(buf, "{\\1a&H%02X&}", 255 - style->alpha);
|
av_bprintf(buf, "{\\1a&H%02X&}", 255 - style->alpha);
|
||||||
}
|
}
|
||||||
if (text_pos == style->style_end) {
|
|
||||||
if (style_active) {
|
|
||||||
av_bprintf(buf, "{\\r}");
|
|
||||||
style_active = 0;
|
|
||||||
color = m->d.color;
|
|
||||||
}
|
|
||||||
entry++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (m->box_flags & HLIT_BOX) {
|
if (m->box_flags & HLIT_BOX) {
|
||||||
if (text_pos == m->h.hlit_start) {
|
if (text_pos == m->h.hlit_start) {
|
||||||
|
Loading…
Reference in New Issue
Block a user