comparison libvo/vo_xvmc.c @ 28202:b2e17894b4d0

Sync with latest round of xvmc changes in FFmpeg.
author diego
date Fri, 02 Jan 2009 17:06:09 +0000
parents 94bab93a8d17
children 8df85ad26746
comparison
equal deleted inserted replaced
28201:4ff973912251 28202:b2e17894b4d0
82 static XvMCMacroBlockArray mv_blocks; 82 static XvMCMacroBlockArray mv_blocks;
83 83
84 #define MAX_SURFACES 8 84 #define MAX_SURFACES 8
85 static int number_of_surfaces=0; 85 static int number_of_surfaces=0;
86 static XvMCSurface surface_array[MAX_SURFACES]; 86 static XvMCSurface surface_array[MAX_SURFACES];
87 static xvmc_render_state_t * surface_render; 87 static struct xvmc_render_state * surface_render;
88 88
89 static xvmc_render_state_t * p_render_surface_to_show=NULL; 89 static struct xvmc_render_state * p_render_surface_to_show=NULL;
90 static xvmc_render_state_t * p_render_surface_visible=NULL; 90 static struct xvmc_render_state * p_render_surface_visible=NULL;
91 91
92 //display queue, kinda render ahead 92 //display queue, kinda render ahead
93 static xvmc_render_state_t * show_queue[MAX_SURFACES]; 93 static struct xvmc_render_state * show_queue[MAX_SURFACES];
94 static int free_element; 94 static int free_element;
95 95
96 96
97 static void (*draw_osd_fnc)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride); 97 static void (*draw_osd_fnc)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride);
98 static void (*clear_osd_fnc)(int x0,int y0, int w,int h); 98 static void (*clear_osd_fnc)(int x0,int y0, int w,int h);
116 }; 116 };
117 117
118 static void xvmc_free(void); 118 static void xvmc_free(void);
119 static void xvmc_clean_surfaces(void); 119 static void xvmc_clean_surfaces(void);
120 static int count_free_surfaces(); 120 static int count_free_surfaces();
121 static xvmc_render_state_t * find_free_surface(); 121 static struct xvmc_render_state * find_free_surface();
122 122
123 static const vo_info_t info = { 123 static const vo_info_t info = {
124 "XVideo Motion Compensation", 124 "XVideo Motion Compensation",
125 "xvmc", 125 "xvmc",
126 "Ivan Kalvachev <iive@users.sf.net>", 126 "Ivan Kalvachev <iive@users.sf.net>",
344 mc_surf_list[s].surface_type_id,p,i); 344 mc_surf_list[s].surface_type_id,p,i);
345 return mc_surf_list[s].surface_type_id; 345 return mc_surf_list[s].surface_type_id;
346 } 346 }
347 347
348 static uint32_t xvmc_draw_image(mp_image_t *mpi){ 348 static uint32_t xvmc_draw_image(mp_image_t *mpi){
349 xvmc_render_state_t * rndr; 349 struct xvmc_render_state * rndr;
350 350
351 assert(mpi!=NULL); 351 assert(mpi!=NULL);
352 assert(mpi->flags &MP_IMGFLAG_DIRECT); 352 assert(mpi->flags &MP_IMGFLAG_DIRECT);
353 // assert(mpi->flags &MP_IMGFLAGS_DRAWBACK); 353 // assert(mpi->flags &MP_IMGFLAGS_DRAWBACK);
354 354
355 rndr = (xvmc_render_state_t*)mpi->priv;//there is copy in plane[2] 355 rndr = (struct xvmc_render_state*)mpi->priv;//there is copy in plane[2]
356 assert( rndr != NULL ); 356 assert( rndr != NULL );
357 assert( rndr->magic == MP_XVMC_RENDER_MAGIC ); 357 assert( rndr->magic == MP_XVMC_RENDER_MAGIC );
358 if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) 358 if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
359 printf("vo_xvmc: draw_image(show rndr=%p)\n",rndr); 359 printf("vo_xvmc: draw_image(show rndr=%p)\n",rndr);
360 // the surface have passed vf system without been skiped, it will be displayed 360 // the surface have passed vf system without been skiped, it will be displayed
518 return -1; 518 return -1;
519 } 519 }
520 printf("vo_xvmc: mv_blocks allocated\n"); 520 printf("vo_xvmc: mv_blocks allocated\n");
521 521
522 if(surface_render==NULL) 522 if(surface_render==NULL)
523 surface_render=malloc(MAX_SURFACES*sizeof(xvmc_render_state_t));//easy mem debug 523 surface_render=malloc(MAX_SURFACES*sizeof(struct xvmc_render_state));//easy mem debug
524 memset(surface_render,0,MAX_SURFACES*sizeof(xvmc_render_state_t)); 524 memset(surface_render,0,MAX_SURFACES*sizeof(struct xvmc_render_state));
525 525
526 for(i=0; i<MAX_SURFACES; i++){ 526 for(i=0; i<MAX_SURFACES; i++){
527 rez=XvMCCreateSurface(mDisplay,&ctx,&surface_array[i]); 527 rez=XvMCCreateSurface(mDisplay,&ctx,&surface_array[i]);
528 if( rez != Success ) 528 if( rez != Success )
529 break; 529 break;
848 assert(0); 848 assert(0);
849 } 849 }
850 } 850 }
851 851
852 static void draw_osd(void){ 852 static void draw_osd(void){
853 xvmc_render_state_t * osd_rndr; 853 struct xvmc_render_state * osd_rndr;
854 int osd_has_changed; 854 int osd_has_changed;
855 int have_osd_to_draw; 855 int have_osd_to_draw;
856 int rez; 856 int rez;
857 857
858 if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) 858 if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
943 } 943 }
944 944
945 XvMCSyncSurface(mDisplay, srf); 945 XvMCSyncSurface(mDisplay, srf);
946 } 946 }
947 947
948 static void put_xvmc_image(xvmc_render_state_t * p_render_surface, int draw_ck){ 948 static void put_xvmc_image(struct xvmc_render_state * p_render_surface,
949 int draw_ck){
949 int rez; 950 int rez;
950 int clipX,clipY,clipW,clipH; 951 int clipX,clipY,clipW,clipH;
951 int i; 952 int i;
952 953
953 if(p_render_surface == NULL) 954 if(p_render_surface == NULL)
1069 (p_render_surface_visible != &surface_render[i]) ) 1070 (p_render_surface_visible != &surface_render[i]) )
1070 printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i, 1071 printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i,
1071 surface_render[i].state); 1072 surface_render[i].state);
1072 } 1073 }
1073 1074
1074 memset(surface_render,0,MAX_SURFACES*sizeof(xvmc_render_state_t));//for debuging 1075 memset(surface_render,0,MAX_SURFACES*sizeof(struct xvmc_render_state));//for debuging
1075 free(surface_render);surface_render=NULL; 1076 free(surface_render);surface_render=NULL;
1076 1077
1077 XvMCDestroyContext(mDisplay,&ctx); 1078 XvMCDestroyContext(mDisplay,&ctx);
1078 number_of_surfaces = 0; 1079 number_of_surfaces = 0;
1079 1080
1125 } 1126 }
1126 1127
1127 1128
1128 static int draw_slice(uint8_t *image[], int stride[], 1129 static int draw_slice(uint8_t *image[], int stride[],
1129 int w, int h, int x, int y){ 1130 int w, int h, int x, int y){
1130 xvmc_render_state_t * rndr; 1131 struct xvmc_render_state * rndr;
1131 int rez; 1132 int rez;
1132 1133
1133 if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) 1134 if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
1134 printf("vo_xvmc: draw_slice y=%d\n",y); 1135 printf("vo_xvmc: draw_slice y=%d\n",y);
1135 1136
1136 rndr = (xvmc_render_state_t*)image[2];//this is copy of priv-ate 1137 rndr = (struct xvmc_render_state*)image[2];//this is copy of priv-ate
1137 assert( rndr != NULL ); 1138 assert( rndr != NULL );
1138 assert( rndr->magic == MP_XVMC_RENDER_MAGIC ); 1139 assert( rndr->magic == MP_XVMC_RENDER_MAGIC );
1139 1140
1140 rez = XvMCRenderSurface(mDisplay,&ctx,rndr->picture_structure, 1141 rez = XvMCRenderSurface(mDisplay,&ctx,rndr->picture_structure,
1141 rndr->p_surface, 1142 rndr->p_surface,
1185 return VO_TRUE; 1186 return VO_TRUE;
1186 } 1187 }
1187 1188
1188 //XvMCHide hides the surface on next retrace, so 1189 //XvMCHide hides the surface on next retrace, so
1189 //check if the surface is not still displaying 1190 //check if the surface is not still displaying
1190 static void check_osd_source(xvmc_render_state_t * src_rndr){ 1191 static void check_osd_source(struct xvmc_render_state * src_rndr){
1191 xvmc_render_state_t * osd_rndr; 1192 struct xvmc_render_state * osd_rndr;
1192 int stat; 1193 int stat;
1193 //If this is source surface, check does the OSD rendering is compleate 1194 //If this is source surface, check does the OSD rendering is compleate
1194 if(src_rndr->state & MP_XVMC_STATE_OSD_SOURCE){ 1195 if(src_rndr->state & MP_XVMC_STATE_OSD_SOURCE){
1195 if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) 1196 if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
1196 printf("vo_xvmc: OSD surface=%p quering\n",src_rndr); 1197 printf("vo_xvmc: OSD surface=%p quering\n",src_rndr);
1209 num++; 1210 num++;
1210 } 1211 }
1211 return num; 1212 return num;
1212 } 1213 }
1213 1214
1214 static xvmc_render_state_t * find_free_surface(){ 1215 static struct xvmc_render_state * find_free_surface(){
1215 int i,t; 1216 int i,t;
1216 int stat; 1217 int stat;
1217 xvmc_render_state_t * visible_rndr; 1218 struct xvmc_render_state * visible_rndr;
1218 1219
1219 visible_rndr = NULL; 1220 visible_rndr = NULL;
1220 for(i=0; i<number_of_surfaces; i++){ 1221 for(i=0; i<number_of_surfaces; i++){
1221 1222
1222 check_osd_source(&surface_render[i]); 1223 check_osd_source(&surface_render[i]);
1262 } 1263 }
1263 free_element=0;//clean up the queue 1264 free_element=0;//clean up the queue
1264 } 1265 }
1265 1266
1266 static uint32_t get_image(mp_image_t *mpi){ 1267 static uint32_t get_image(mp_image_t *mpi){
1267 xvmc_render_state_t * rndr; 1268 struct xvmc_render_state * rndr;
1268 1269
1269 rndr = find_free_surface(); 1270 rndr = find_free_surface();
1270 1271
1271 if(rndr == NULL){ 1272 if(rndr == NULL){
1272 printf("vo_xvmc: get_image failed\n"); 1273 printf("vo_xvmc: get_image failed\n");