Mercurial > mplayer.hg
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"); |