diff options
author | eugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-12-06 18:44:26 +0000 |
---|---|---|
committer | eugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-12-06 18:44:26 +0000 |
commit | e15d11c89edfddaabd460a0c87a4d6d379d59189 (patch) | |
tree | e7f6eb358e1b3e5a1d3b2133cbe0c70cc8b34235 /libmpcodecs | |
parent | 89e3a7b845b45d7dd4770965d9e0e8908590d99b (diff) | |
download | mpv-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.c | 2 | ||||
-rw-r--r-- | libmpcodecs/vf_vo.c | 15 |
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: |