diff options
author | wm4 <wm4@nowhere> | 2015-08-18 22:59:22 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-08-18 23:09:37 +0200 |
commit | 5eb6466e54ac2e8d4a5265418b04644d15302ece (patch) | |
tree | 687fbf9a4bad1430542c5444908c4a31ef90b0ee /video/out/vo_rpi.c | |
parent | 58ba2a9087dfa6bf6a81177c77f86e01acd33286 (diff) | |
download | mpv-5eb6466e54ac2e8d4a5265418b04644d15302ece.tar.bz2 mpv-5eb6466e54ac2e8d4a5265418b04644d15302ece.tar.xz |
vo_rpi: redraw subtitles only on change
Since vo_rpi uses MMAL for video output, which is completely
independent from the GLES overlay, we can just not redraw the
GLES screen if subtitles do not change.
(As a furhter optimization, the dispmanx overlay could be removed
if nothing is visible. But I'm not sure if adding and removing the
overlay frequently is a good idea for performance, so this could
just as well go the other way.)
Diffstat (limited to 'video/out/vo_rpi.c')
-rw-r--r-- | video/out/vo_rpi.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/video/out/vo_rpi.c b/video/out/vo_rpi.c index 95627d4073..f3dfab3af6 100644 --- a/video/out/vo_rpi.c +++ b/video/out/vo_rpi.c @@ -56,6 +56,7 @@ struct priv { struct mp_egl_rpi egl; struct gl_shader_cache *sc; struct mpgl_osd *osd; + int64_t osd_change_counter; MMAL_COMPONENT_T *renderer; bool renderer_enabled; @@ -117,6 +118,16 @@ static void update_osd(struct vo *vo) mpgl_osd_generate(p->osd, p->osd_res, p->osd_pts, 0, 0); + int64_t osd_change_counter = mpgl_get_change_counter(p->osd); + if (p->osd_change_counter == osd_change_counter) { + p->skip_osd = true; + return; + } + p->osd_change_counter = osd_change_counter; + + p->egl.gl->ClearColor(0, 0, 0, 0); + p->egl.gl->Clear(GL_COLOR_BUFFER_BIT); + for (int n = 0; n < MAX_OSD_PARTS; n++) { enum sub_bitmap_format fmt = mpgl_osd_get_part_format(p->osd, n); if (!fmt) @@ -331,11 +342,9 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame) // Redraw only if the OSD has meaningfully changed, which we assume it // hasn't when a frame is merely repeated for display sync. p->skip_osd = !frame->redraw && frame->repeat; - if (!p->skip_osd && p->egl.gl) { - p->egl.gl->ClearColor(0, 0, 0, 0); - p->egl.gl->Clear(GL_COLOR_BUFFER_BIT); + + if (!p->skip_osd && p->egl.gl) update_osd(vo); - } p->display_synced = frame->display_synced; @@ -519,8 +528,10 @@ static int control(struct vo *vo, uint32_t request, void *data) case VOCTRL_SET_PANSCAN: if (p->renderer_enabled) resize(vo); + vo->want_redraw = true; return VO_TRUE; case VOCTRL_REDRAW_FRAME: + p->osd_change_counter = -1; update_osd(vo); return VO_TRUE; case VOCTRL_SCREENSHOT_WIN: |