From c8e37be59a7f3e32c6e309dffb04c8834925b647 Mon Sep 17 00:00:00 2001 From: iive Date: Mon, 21 Jul 2003 21:02:34 +0000 Subject: sync to ffmpeg, updates, cleanups git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10453 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/vo_xvmc.c | 68 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 27 deletions(-) (limited to 'libvo') diff --git a/libvo/vo_xvmc.c b/libvo/vo_xvmc.c index 0f07e05747..cdd5b42d0e 100644 --- a/libvo/vo_xvmc.c +++ b/libvo/vo_xvmc.c @@ -57,7 +57,7 @@ static XvMCMacroBlockArray mv_blocks; #define MAX_SURFACES 8 static int number_of_surfaces=0; static XvMCSurface surface_array[MAX_SURFACES]; -static xvmc_render_state_t surface_render[MAX_SURFACES];//these one are used in mpi->priv +static xvmc_render_state_t * surface_render; static xvmc_render_state_t * p_render_surface_to_show=NULL; static xvmc_render_state_t * p_render_surface_visible=NULL; @@ -113,13 +113,13 @@ int attrib_count,i; //from vo_xmga static void mDrawColorKey(uint32_t x,uint32_t y, uint32_t w, uint32_t h) { - if( (keycolor_handling != 2) || (keycolor_handling != 3) ) + if( (keycolor_handling != 2) && (keycolor_handling != 3) ) return ;//unknow method XSetBackground( mDisplay,vo_gc,0 ); XClearWindow( mDisplay,vo_window ); - if(keycolor_handling == 2){ + if(keycolor_handling == 3){ XSetForeground( mDisplay,vo_gc,keycolor ); XFillRectangle( mDisplay,vo_window,vo_gc,x,y,w,h); } @@ -255,8 +255,9 @@ int mc_ver,mc_rev; } xv_port = 0; number_of_surfaces = 0; - keycolor_handling = 1; - + keycolor_handling = 1;//!!fixme + surface_render=NULL; + return 0; } @@ -326,6 +327,9 @@ static uint32_t vm_height; } printf("vo_xvmc: mv_blocks allocated\n"); + if(surface_render==NULL) + surface_render=malloc(MAX_SURFACES*sizeof(xvmc_render_state_t));//easy mem debug + for(i=0; imagic == MP_XVMC_RENDER_MAGIC ); - +//fixme assert( p_render_surface_to_show != p_render_surface_visible); + // make sure the rendering is done - XvMCSyncSurface(mDisplay,p_render_surface_to_show->p_surface);//!! + xvmc_sync_surface(p_render_surface_to_show->p_surface); + //the visible surface won't be displayed anymore, mark it as free if( p_render_surface_visible!=NULL ) p_render_surface_visible->state &= ~MP_XVMC_STATE_DISPLAY_PENDING; - assert(p_render_surface_to_show->state & MP_XVMC_STATE_DISPLAY_PENDING); +//!!fixme assert(p_render_surface_to_show->state & MP_XVMC_STATE_DISPLAY_PENDING); // show it // if(benchmark) @@ -617,6 +642,8 @@ int i; printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i, surface_render[i].state); } + + free(surface_render);surface_render=NULL; XvMCDestroyContext(mDisplay,&ctx); if( verbose > 3) printf("vo_xvmc: Context sucessfuly freed\n"); @@ -660,19 +687,6 @@ int mode_id; return flags; } -static void xvmc_sync_surface(XvMCSurface * srf){ -int status,rez; - rez = XvMCGetSurfaceStatus(mDisplay,srf,&status); - assert(rez==Success); - if( status & XVMC_RENDERING ) - XvMCSyncSurface(mDisplay, srf); -/* - do { - unsleep(10); - XvMCGetSurfaceStatus(mDisplay,&surface_array[srf],&status); - } while (status & XVMC_RENDERING) -*/ -} static uint32_t draw_slice(uint8_t *image[], int stride[], int w, int h, int x, int y){ @@ -685,11 +699,6 @@ int rez; rndr = (xvmc_render_state_t*)image[2];//this is copy of priv-ate assert( rndr != NULL ); assert( rndr->magic == MP_XVMC_RENDER_MAGIC ); - //!!todo make check for beggining of frame/field - if(rndr->p_past_surface!=NULL) - xvmc_sync_surface(rndr->p_past_surface); - if(rndr->p_future_surface!=NULL) - xvmc_sync_surface(rndr->p_future_surface); rez = XvMCRenderSurface(mDisplay,&ctx,rndr->picture_structure, rndr->p_surface, @@ -728,6 +737,7 @@ int rez; } #endif assert(rez==Success); + if(verbose > 3 ) printf("vo_xvmc: flush surface\n"); rez = XvMCFlushSurface(mDisplay, rndr->p_surface); assert(rez==Success); @@ -782,6 +792,10 @@ int getsrf; return VO_FALSE; } +assert(surface_render[getsrf].start_mv_blocks_num == 0); +assert(surface_render[getsrf].filled_mv_blocks_num == 0); +assert(surface_render[getsrf].next_free_data_block_num == 0); + mpi->flags |= MP_IMGFLAG_DIRECT; //keep strides 0 to avoid field manipulations mpi->stride[0] = 0; -- cgit v1.2.3