summaryrefslogtreecommitdiffstats
path: root/video/out/vo_rpi.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-08-18 22:59:22 +0200
committerwm4 <wm4@nowhere>2015-08-18 23:09:37 +0200
commit5eb6466e54ac2e8d4a5265418b04644d15302ece (patch)
tree687fbf9a4bad1430542c5444908c4a31ef90b0ee /video/out/vo_rpi.c
parent58ba2a9087dfa6bf6a81177c77f86e01acd33286 (diff)
downloadmpv-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.c19
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: