From dcb8df09a2bb04c9798e63c760413dd38cea3393 Mon Sep 17 00:00:00 2001 From: iive Date: Mon, 19 Feb 2007 11:38:19 +0000 Subject: [PATCH] Don't free and then allocate surfaces when config() is called again with same resolution and format. In this case properly clean surfaces from locking flags and empty the queue. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22275 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/vo_xvmc.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libvo/vo_xvmc.c b/libvo/vo_xvmc.c index 6fc415cb24..bb19e898f6 100644 --- a/libvo/vo_xvmc.c +++ b/libvo/vo_xvmc.c @@ -55,6 +55,7 @@ static int bob_deinterlace; static int top_field_first; static int image_width,image_height; +static int image_format; static uint32_t drwX,drwY; #define NO_SUBPICTURE 0 @@ -108,6 +109,7 @@ static const struct{ }; static void xvmc_free(void); +static void xvmc_clean_surfaces(void); static int count_free_surfaces(); static xvmc_render_state_t * find_free_surface(); @@ -450,6 +452,10 @@ static uint32_t vm_height; // Find free port that supports MC, by querying adaptors if( xv_port != 0 || number_of_surfaces != 0 ){ + if( height==image_height && width==image_width && image_format==format){ + xvmc_clean_surfaces(); + goto skip_surface_allocation; + } xvmc_free(); }; numblocks=((width+15)/16)*((height+15)/16); @@ -604,6 +610,8 @@ found_subpic: image_height = height; image_width = width; +skip_surface_allocation: + vo_mouse_autohide = 1; #ifdef HAVE_XF86VM @@ -752,6 +760,7 @@ found_subpic: first_frame = 1; vo_directrendering = 1;//ugly hack, coz xvmc works only with direct rendering + image_format=format; return 0; } @@ -1326,6 +1335,23 @@ xvmc_render_state_t * visible_rndr; return NULL; } +static void xvmc_clean_surfaces(void){ +int i; + + for(i=0; i