summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-06 18:44:26 +0000
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-06 18:44:26 +0000
commite15d11c89edfddaabd460a0c87a4d6d379d59189 (patch)
treee7f6eb358e1b3e5a1d3b2133cbe0c70cc8b34235 /libmpcodecs
parent89e3a7b845b45d7dd4770965d9e0e8908590d99b (diff)
downloadmpv-e15d11c89edfddaabd460a0c87a4d6d379d59189.tar.bz2
mpv-e15d11c89edfddaabd460a0c87a4d6d379d59189.tar.xz
Speed up ASS subtitles display by detecting changes between two consecutive
rendering results. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@21522 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/vf_ass.c2
-rw-r--r--libmpcodecs/vf_vo.c15
2 files changed, 12 insertions, 5 deletions
diff --git a/libmpcodecs/vf_ass.c b/libmpcodecs/vf_ass.c
index 88fbd2eab5..04f131d4cb 100644
--- a/libmpcodecs/vf_ass.c
+++ b/libmpcodecs/vf_ass.c
@@ -326,7 +326,7 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts)
{
ass_image_t* images = 0;
if (sub_visibility && vf->priv->ass_priv && ass_track && (pts != MP_NOPTS_VALUE))
- images = ass_render_frame(vf->priv->ass_priv, ass_track, (pts+sub_delay) * 1000 + .5);
+ images = ass_render_frame(vf->priv->ass_priv, ass_track, (pts+sub_delay) * 1000 + .5, NULL);
prepare_image(vf, mpi);
if (images) render_frame(vf, mpi, images);
diff --git a/libmpcodecs/vf_vo.c b/libmpcodecs/vf_vo.c
index 8d9b8e97d2..bb4d1bb87d 100644
--- a/libmpcodecs/vf_vo.c
+++ b/libmpcodecs/vf_vo.c
@@ -26,6 +26,7 @@ struct vf_priv_s {
vo_functions_t *vo;
#ifdef USE_ASS
ass_renderer_t* ass_priv;
+ int prev_visibility;
#endif
};
#define video_out (vf->priv->vo)
@@ -116,11 +117,12 @@ static int control(struct vf_instance_s* vf, int request, void* data)
vf->priv->ass_priv = ass_renderer_init((ass_library_t*)data);
if (!vf->priv->ass_priv) return CONTROL_FALSE;
ass_configure_fonts(vf->priv->ass_priv);
+ vf->priv->prev_visibility = 0;
return CONTROL_TRUE;
}
case VFCTRL_DRAW_EOSD:
{
- ass_image_t* images = 0;
+ mp_eosd_images_t images = {NULL, 2};
double pts = vf->priv->pts;
if (!vo_config_count || !vf->priv->ass_priv) return CONTROL_FALSE;
if (sub_visibility && vf->priv->ass_priv && ass_track && (pts != MP_NOPTS_VALUE)) {
@@ -132,9 +134,14 @@ static int control(struct vf_instance_s* vf, int request, void* data)
ass_set_aspect_ratio(vf->priv->ass_priv, (double)res.w / res.h);
}
- images = ass_render_frame(vf->priv->ass_priv, ass_track, (pts+sub_delay) * 1000 + .5);
- }
- return (video_out->control(VOCTRL_DRAW_EOSD, images) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
+ images.imgs = ass_render_frame(vf->priv->ass_priv, ass_track, (pts+sub_delay) * 1000 + .5, &images.changed);
+ if (!vf->priv->prev_visibility)
+ images.changed = 2;
+ vf->priv->prev_visibility = 1;
+ } else
+ vf->priv->prev_visibility = 0;
+ vf->priv->prev_visibility = sub_visibility;
+ return (video_out->control(VOCTRL_DRAW_EOSD, &images) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
}
#endif
case VFCTRL_GET_PTS: