summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-03-06 22:23:01 +0100
committerwm4 <wm4@nowhere>2014-03-06 22:31:48 +0100
commitcee08d6b19cecb96dbbec6648d9cb36bee98156a (patch)
tree8548833e910f3ff7b2dcfa4fccf5a3ab8aecf80f
parent029d6320123721951f32c2ff6936311b22931f3b (diff)
downloadlibass-cee08d6b19cecb96dbbec6648d9cb36bee98156a.tar.bz2
libass-cee08d6b19cecb96dbbec6648d9cb36bee98156a.tar.xz
Fix change detection in presence of vector clips
Fixes this test case: Dialogue: 0,0:00:00.00,0:00:02.00,,,0,0,0,,{\fs50\pos(250,250)\iclip(m 0 0 l 400 0 l 400 220 l0 220)}Hello Dialogue: 0,0:00:02.00,0:10:00.00,,,0,0,0,,{\fs50\pos(250,250)\iclip(m 0 0 l 400 0 l 400 230 l0 230)}Hello The problem here is that the rendered output bitmap list itself does not change, only its contents (due to the different vector clip). ass_render_frame() will not set *detect_change correctly, and an application using this flag (like mplayer or mpv) will not update the screen as needed. Fix this with a very cheap hack: always report a full change if there's a vector clip. This is basically an emergency fix until we have a proper way to detect the change.
-rw-r--r--libass/ass_render.c5
-rw-r--r--libass/ass_render.h1
2 files changed, 5 insertions, 1 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index f553b90..dc6d058 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -534,6 +534,8 @@ static void blend_vector_clip(ASS_Renderer *render_priv,
int aleft, atop, bleft, btop;
unsigned char *abuffer, *bbuffer, *nbuffer;
+ render_priv->state.has_vector_clip = 1;
+
abuffer = cur->bitmap;
bbuffer = clip_bm->buffer;
ax = cur->dst_x;
@@ -794,6 +796,7 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event)
render_priv->state.event = event;
render_priv->state.style = render_priv->track->styles + event->Style;
render_priv->state.parsed_tags = 0;
+ render_priv->state.has_vector_clip = 0;
reset_render_context(render_priv, render_priv->state.style);
render_priv->state.wrap_style = render_priv->track->WrapStyle;
@@ -2830,7 +2833,7 @@ static int ass_detect_change(ASS_Renderer *priv)
ASS_Image *img, *img2;
int diff;
- if (priv->cache_cleared)
+ if (priv->cache_cleared || priv->state.has_vector_clip)
return 2;
img = priv->prev_images_root;
diff --git a/libass/ass_render.h b/libass/ass_render.h
index 7b3b6d7..f17ad5f 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -231,6 +231,7 @@ typedef struct {
ASS_Event *event;
ASS_Style *style;
int parsed_tags;
+ int has_vector_clip;
ASS_Font *font;
double font_size;