changeset 22257:f979aa12d8cc

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.
author iive
date Mon, 19 Feb 2007 11:38:19 +0000
parents 3a30fc845a9c
children 9c1160622400
files libvo/vo_xvmc.c
diffstat 1 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_xvmc.c	Mon Feb 19 10:48:50 2007 +0000
+++ b/libvo/vo_xvmc.c	Mon Feb 19 11:38:19 2007 +0000
@@ -55,6 +55,7 @@
 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 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 @@
 
 // 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 @@
    image_height = height;
    image_width = width;
 
+skip_surface_allocation:
+
    vo_mouse_autohide = 1;
 
 #ifdef HAVE_XF86VM
@@ -752,6 +760,7 @@
    first_frame = 1;
 
    vo_directrendering = 1;//ugly hack, coz xvmc works only with direct rendering
+   image_format=format;
    return 0;		
 }
 
@@ -1326,6 +1335,23 @@
    return NULL;
 }
 
+static void xvmc_clean_surfaces(void){
+int i;
+
+  for(i=0; i<number_of_surfaces; i++){
+
+      surface_render[i].state&=!( MP_XVMC_STATE_DISPLAY_PENDING |
+                                  MP_XVMC_STATE_OSD_SOURCE |
+                                  0);
+      surface_render[i].p_osd_target_surface_render=NULL;
+      if(surface_render[i].state != 0){
+         mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: surface[%d].state=%d\n",
+                                   i,surface_render[i].state);
+      }
+   }
+   free_element=0;//clean up the queue
+}
+
 static uint32_t get_image(mp_image_t *mpi){
 xvmc_render_state_t * rndr;