# HG changeset patch # User reimar # Date 1353959432 0 # Node ID 67de02ade8af2ca650d491d90cb4eff65310dfd4 # Parent 092c40fbd33d14f97b7f81e86a95007c18da7420 Fix vo_gl sometimes drawing a black image instead of the video. diff -r 092c40fbd33d -r 67de02ade8af libvo/vo_gl.c --- a/libvo/vo_gl.c Mon Nov 26 19:30:58 2012 +0000 +++ b/libvo/vo_gl.c Mon Nov 26 19:50:32 2012 +0000 @@ -170,6 +170,8 @@ // performance statistics static int imgcnt, dr_imgcnt, dr_rejectcnt; +static int did_render; + static void redraw(void); static void resize(int x,int y){ @@ -899,24 +901,33 @@ } if (is_yuv || custom_prog) glDisableYUVConversion(gl_target, yuvconvtype); + did_render = 1; } static void flip_page(void) { + // We might get an expose event between draw_image and its + // corresponding flip_page. + // For double-buffering we would then flip in a clear backbuffer. + // Easiest way to handle it is by keeping track if the + // current GL buffer contains a properly rendered video. + // did_render will always be false for single buffer. + if (!did_render) { + do_render(); + do_render_osd(RENDER_OSD | RENDER_EOSD); + } if (vo_doublebuffering) { if (use_glFinish) mpglFinish(); glctx.swapGlBuffers(&glctx); if (aspect_scaling() && use_aspect) mpglClear(GL_COLOR_BUFFER_BIT); } else { - do_render(); - do_render_osd(RENDER_OSD | RENDER_EOSD); if (use_glFinish) mpglFinish(); else mpglFlush(); } + did_render = 0; } static void redraw(void) { - if (vo_doublebuffering) { do_render(); do_render_osd(RENDER_OSD | RENDER_EOSD); } flip_page(); }