Mercurial > mplayer.hg
changeset 28642:fd68de39e9f6
Cosmetics part 1. Reindent to 4 spaces.
Checked for equality with diff -b.
author | iive |
---|---|
date | Fri, 20 Feb 2009 22:13:31 +0000 |
parents | 531d876a808f |
children | fcc8d7b273d4 |
files | libvo/vo_xvmc.c |
diffstat | 1 files changed, 852 insertions(+), 852 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_xvmc.c Fri Feb 20 19:17:10 2009 +0000 +++ b/libvo/vo_xvmc.c Fri Feb 20 22:13:31 2009 +0000 @@ -119,15 +119,15 @@ static const struct{ - int id;//id as xvimages or as mplayer RGB|{8,15,16,24,32} - void (* init_func_ptr)(); - void (* draw_func_ptr)(); - void (* clear_func_ptr)(); - } osd_render[]={ - {0x34344149,init_osd_yuv_pal,draw_osd_AI44,clear_osd_subpic}, - {0x34344941,init_osd_yuv_pal,draw_osd_IA44,clear_osd_subpic}, - {0,NULL,NULL,NULL} - }; + int id;//id as xvimages or as mplayer RGB|{8,15,16,24,32} + void (* init_func_ptr)(); + void (* draw_func_ptr)(); + void (* clear_func_ptr)(); + } osd_render[]={ + {0x34344149,init_osd_yuv_pal,draw_osd_AI44,clear_osd_subpic}, + {0x34344941,init_osd_yuv_pal,draw_osd_IA44,clear_osd_subpic}, + {0,NULL,NULL,NULL} + }; static void xvmc_free(void); static void xvmc_clean_surfaces(void); @@ -135,10 +135,10 @@ static struct xvmc_pix_fmt *find_free_surface(void); static const vo_info_t info = { - "XVideo Motion Compensation", - "xvmc", - "Ivan Kalvachev <iive@users.sf.net>", - "" + "XVideo Motion Compensation", + "xvmc", + "Ivan Kalvachev <iive@users.sf.net>", + "" }; const LIBVO_EXTERN(xvmc); @@ -158,130 +158,130 @@ * mit-shm this will bomb... trzing to fix ::atmos */ #ifdef HAVE_SHM - if ( mLocalDisplay && XShmQueryExtension( mDisplay ) ) Shmem_Flag = 1; - else - { - Shmem_Flag = 0; - mp_msg(MSGT_VO,MSGL_INFO, "Shared memory not supported\nReverting to normal Xv\n" ); - } - if ( Shmem_Flag ) - { - xvimage = (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format, + if ( mLocalDisplay && XShmQueryExtension( mDisplay ) ) Shmem_Flag = 1; + else + { + Shmem_Flag = 0; + mp_msg(MSGT_VO,MSGL_INFO, "Shared memory not supported\nReverting to normal Xv\n" ); + } + if ( Shmem_Flag ) + { + xvimage = (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format, NULL, xvimage_width, xvimage_height, &Shminfo); - Shminfo.shmid = shmget(IPC_PRIVATE, xvimage->data_size, IPC_CREAT | 0777); - Shminfo.shmaddr = (char *) shmat(Shminfo.shmid, 0, 0); - Shminfo.readOnly = False; + Shminfo.shmid = shmget(IPC_PRIVATE, xvimage->data_size, IPC_CREAT | 0777); + Shminfo.shmaddr = (char *) shmat(Shminfo.shmid, 0, 0); + Shminfo.readOnly = False; - xvimage->data = Shminfo.shmaddr; - XShmAttach(mDisplay, &Shminfo); - XSync(mDisplay, False); - shmctl(Shminfo.shmid, IPC_RMID, 0); - } - else + xvimage->data = Shminfo.shmaddr; + XShmAttach(mDisplay, &Shminfo); + XSync(mDisplay, False); + shmctl(Shminfo.shmid, IPC_RMID, 0); + } + else #endif - { - xvimage = (XvImage *) XvCreateImage(mDisplay, xv_port, xv_format, NULL, xvimage_width, xvimage_height); - xvimage->data = malloc(xvimage->data_size); - XSync(mDisplay,False); - } + { + xvimage = (XvImage *) XvCreateImage(mDisplay, xv_port, xv_format, NULL, xvimage_width, xvimage_height); + xvimage->data = malloc(xvimage->data_size); + XSync(mDisplay,False); + } // memset(xvimage->data,128,xvimage->data_size); - return; + return; } static void deallocate_xvimage(void) { #ifdef HAVE_SHM - if ( Shmem_Flag ) - { - XShmDetach( mDisplay,&Shminfo ); - shmdt( Shminfo.shmaddr ); - } - else + if ( Shmem_Flag ) + { + XShmDetach( mDisplay,&Shminfo ); + shmdt( Shminfo.shmaddr ); + } + else #endif - { - free(xvimage->data); - } - XFree(xvimage); + { + free(xvimage->data); + } + XFree(xvimage); - XSync(mDisplay, False); - return; + XSync(mDisplay, False); + return; } //end of vo_xv shm/xvimage code static int xvmc_check_surface_format(uint32_t format, XvMCSurfaceInfo * surf_info){ - if ( format == IMGFMT_XVMC_IDCT_MPEG2 ){ - if( surf_info->mc_type != (XVMC_IDCT|XVMC_MPEG_2) ) return -1; - if( surf_info->chroma_format != XVMC_CHROMA_FORMAT_420 ) return -1; - return 0; - } - if ( format == IMGFMT_XVMC_MOCO_MPEG2 ){ - if(surf_info->mc_type != XVMC_MPEG_2) return -1; - if(surf_info->chroma_format != XVMC_CHROMA_FORMAT_420) return -1; - return 0; - } + if ( format == IMGFMT_XVMC_IDCT_MPEG2 ){ + if( surf_info->mc_type != (XVMC_IDCT|XVMC_MPEG_2) ) return -1; + if( surf_info->chroma_format != XVMC_CHROMA_FORMAT_420 ) return -1; + return 0; + } + if ( format == IMGFMT_XVMC_MOCO_MPEG2 ){ + if(surf_info->mc_type != XVMC_MPEG_2) return -1; + if(surf_info->chroma_format != XVMC_CHROMA_FORMAT_420) return -1; + return 0; + } return -1;//fail } //print all info needed to add new format static void print_xvimage_format_values(XvImageFormatValues *xifv){ int i; - printf("Format_ID = 0x%X\n",xifv->id); + printf("Format_ID = 0x%X\n",xifv->id); - printf(" type = "); - if(xifv->type == XvRGB) printf("RGB\n"); - else if(xifv->type == XvYUV) printf("YUV\n"); - else printf("Unknown\n"); + printf(" type = "); + if(xifv->type == XvRGB) printf("RGB\n"); + else if(xifv->type == XvYUV) printf("YUV\n"); + else printf("Unknown\n"); - printf(" byte_order = "); - if(xifv->byte_order == LSBFirst) printf("LSB First\n"); - else if(xifv->type == MSBFirst) printf("MSB First\n"); - else printf("Unknown\n");//yes Linux support other types too + printf(" byte_order = "); + if(xifv->byte_order == LSBFirst) printf("LSB First\n"); + else if(xifv->type == MSBFirst) printf("MSB First\n"); + else printf("Unknown\n");//yes Linux support other types too - printf(" guid = "); - for(i=0;i<16;i++) - printf("%02X ",(unsigned char)xifv->guid[i]); - printf("\n"); + printf(" guid = "); + for(i=0;i<16;i++) + printf("%02X ",(unsigned char)xifv->guid[i]); + printf("\n"); - printf(" bits_per_pixel = %d\n",xifv->bits_per_pixel); + printf(" bits_per_pixel = %d\n",xifv->bits_per_pixel); - printf(" format = "); - if(xifv->format == XvPacked) printf("XvPacked\n"); - else if(xifv->format == XvPlanar) printf("XvPlanar\n"); - else printf("Unknown\n"); + printf(" format = "); + if(xifv->format == XvPacked) printf("XvPacked\n"); + else if(xifv->format == XvPlanar) printf("XvPlanar\n"); + else printf("Unknown\n"); - printf(" num_planes = %d\n",xifv->num_planes); + printf(" num_planes = %d\n",xifv->num_planes); - if(xifv->type == XvRGB){ - printf(" red_mask = %0X\n", xifv->red_mask); - printf(" green_mask = %0X\n",xifv->green_mask); - printf(" blue_mask = %0X\n", xifv->blue_mask); - } - if(xifv->type == XvYUV){ - printf(" y_sample_bits = %d\n u_sample_bits = %d\n v_sample_bits = %d\n", - xifv->y_sample_bits,xifv->u_sample_bits,xifv->v_sample_bits); - printf(" horz_y_period = %d\n horz_u_period = %d\n horz_v_period = %d\n", - xifv->horz_y_period,xifv->horz_u_period,xifv->horz_v_period); - printf(" vert_y_period = %d\n vert_u_period = %d\n vert_v_period = %d\n", - xifv->vert_y_period,xifv->vert_u_period,xifv->vert_v_period); + if(xifv->type == XvRGB){ + printf(" red_mask = %0X\n", xifv->red_mask); + printf(" green_mask = %0X\n",xifv->green_mask); + printf(" blue_mask = %0X\n", xifv->blue_mask); + } + if(xifv->type == XvYUV){ + printf(" y_sample_bits = %d\n u_sample_bits = %d\n v_sample_bits = %d\n", + xifv->y_sample_bits,xifv->u_sample_bits,xifv->v_sample_bits); + printf(" horz_y_period = %d\n horz_u_period = %d\n horz_v_period = %d\n", + xifv->horz_y_period,xifv->horz_u_period,xifv->horz_v_period); + printf(" vert_y_period = %d\n vert_u_period = %d\n vert_v_period = %d\n", + xifv->vert_y_period,xifv->vert_u_period,xifv->vert_v_period); - printf(" component_order = "); - for(i=0;i<32;i++) - if(xifv->component_order[i]>=32) - printf("%c",xifv->component_order[i]); - printf("\n"); + printf(" component_order = "); + for(i=0;i<32;i++) + if(xifv->component_order[i]>=32) + printf("%c",xifv->component_order[i]); + printf("\n"); - printf(" scanline = "); - if(xifv->scanline_order == XvTopToBottom) printf("XvTopToBottom\n"); - else if(xifv->scanline_order == XvBottomToTop) printf("XvBottomToTop\n"); - else printf("Unknown\n"); - } - printf("\n"); + printf(" scanline = "); + if(xifv->scanline_order == XvTopToBottom) printf("XvTopToBottom\n"); + else if(xifv->scanline_order == XvBottomToTop) printf("XvBottomToTop\n"); + else printf("Unknown\n"); + } + printf("\n"); } // WARNING This function may changes xv_port and surface_info! static int xvmc_find_surface_by_format(int format,int width,int height, - XvMCSurfaceInfo * surf_info,int query){ + XvMCSurfaceInfo * surf_info,int query){ int rez; XvAdaptorInfo * ai; int num_adaptors,i; @@ -289,93 +289,93 @@ int s,mc_surf_num; XvMCSurfaceInfo * mc_surf_list; - rez = XvQueryAdaptors(mDisplay,DefaultRootWindow(mDisplay),&num_adaptors,&ai); - if( rez != Success ) return -1; - if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { - printf("vo_xvmc: Querying %d adaptors\n",num_adaptors); } - for(i=0; i<num_adaptors; i++) - { - /* check if adaptor number has been specified */ - if (xv_adaptor != -1 && xv_adaptor != i) - continue; - if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { - printf("vo_xvmc: Quering adaptor #%d\n",i); } - if( ai[i].type == 0 ) continue;// we need at least dummy type! + rez = XvQueryAdaptors(mDisplay,DefaultRootWindow(mDisplay),&num_adaptors,&ai); + if( rez != Success ) return -1; + if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { + printf("vo_xvmc: Querying %d adaptors\n",num_adaptors); } + for(i=0; i<num_adaptors; i++) + { + /* check if adaptor number has been specified */ + if (xv_adaptor != -1 && xv_adaptor != i) + continue; + if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { + printf("vo_xvmc: Quering adaptor #%d\n",i); } + if( ai[i].type == 0 ) continue;// we need at least dummy type! //probing ports - for(p=ai[i].base_id; p<ai[i].base_id+ai[i].num_ports; p++) - { - if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { - printf("vo_xvmc: probing port #%ld\n",p); } - mc_surf_list = XvMCListSurfaceTypes(mDisplay,p,&mc_surf_num); - if( mc_surf_list == NULL || mc_surf_num == 0){ + for(p=ai[i].base_id; p<ai[i].base_id+ai[i].num_ports; p++) + { if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { - printf("vo_xvmc: No XvMC supported. \n"); } - continue; - } - if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { - printf("vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num); } + printf("vo_xvmc: probing port #%ld\n",p); } + mc_surf_list = XvMCListSurfaceTypes(mDisplay,p,&mc_surf_num); + if( mc_surf_list == NULL || mc_surf_num == 0){ + if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { + printf("vo_xvmc: No XvMC supported. \n"); } + continue; + } + if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { + printf("vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num); } //we have XvMC list! - for(s=0; s<mc_surf_num; s++) - { - if( width > mc_surf_list[s].max_width ) continue; - if( height > mc_surf_list[s].max_height ) continue; - if( xvmc_check_surface_format(format,&mc_surf_list[s])<0 ) continue; + for(s=0; s<mc_surf_num; s++) + { + if( width > mc_surf_list[s].max_width ) continue; + if( height > mc_surf_list[s].max_height ) continue; + if( xvmc_check_surface_format(format,&mc_surf_list[s])<0 ) continue; //we have match! - /* respect the users wish */ - if ( xv_port_request != 0 && xv_port_request != p ) - { - continue; - } + /* respect the users wish */ + if ( xv_port_request != 0 && xv_port_request != p ) + { + continue; + } - if(!query){ - rez = XvGrabPort(mDisplay,p,CurrentTime); - if(rez != Success){ - if ( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { - printf("vo_xvmc: Fail to grab port %ld\n",p); } - continue; - } - printf("vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name); - printf("vo_xvmc: Port %ld grabed\n",p); - xv_port = p; - } - goto surface_found; - }//for mc surf - XFree(mc_surf_list);//if mc_surf_num==0 is list==NULL ? - }//for ports - }//for adaptors - XvFreeAdaptorInfo(ai); + if(!query){ + rez = XvGrabPort(mDisplay,p,CurrentTime); + if(rez != Success){ + if ( mp_msg_test(MSGT_VO,MSGL_DBG3) ) { + printf("vo_xvmc: Fail to grab port %ld\n",p); } + continue; + } + printf("vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name); + printf("vo_xvmc: Port %ld grabed\n",p); + xv_port = p; + } + goto surface_found; + }//for mc surf + XFree(mc_surf_list);//if mc_surf_num==0 is list==NULL ? + }//for ports + }//for adaptors + XvFreeAdaptorInfo(ai); - if(!query) printf("vo_xvmc: Could not find free matching surface. Sorry.\n"); - return 0; + if(!query) printf("vo_xvmc: Could not find free matching surface. Sorry.\n"); + return 0; // somebody know cleaner way to escape from 3 internal loops? surface_found: - XvFreeAdaptorInfo(ai); + XvFreeAdaptorInfo(ai); - memcpy(surf_info,&mc_surf_list[s],sizeof(XvMCSurfaceInfo)); - if( mp_msg_test(MSGT_VO,MSGL_DBG3) || !query) - printf("vo_xvmc: Found matching surface with id=%X on %ld port at %d adapter\n", - mc_surf_list[s].surface_type_id,p,i); - return mc_surf_list[s].surface_type_id; + memcpy(surf_info,&mc_surf_list[s],sizeof(XvMCSurfaceInfo)); + if( mp_msg_test(MSGT_VO,MSGL_DBG3) || !query) + printf("vo_xvmc: Found matching surface with id=%X on %ld port at %d adapter\n", + mc_surf_list[s].surface_type_id,p,i); + return mc_surf_list[s].surface_type_id; } static uint32_t xvmc_draw_image(mp_image_t *mpi){ - struct xvmc_pix_fmt *rndr; + struct xvmc_pix_fmt *rndr; - assert(mpi!=NULL); - assert(mpi->flags &MP_IMGFLAG_DIRECT); + assert(mpi!=NULL); + assert(mpi->flags &MP_IMGFLAG_DIRECT); // assert(mpi->flags &MP_IMGFLAGS_DRAWBACK); - rndr = (struct xvmc_pix_fmt*)mpi->priv; //there is copy in plane[2] - assert( rndr != NULL ); - assert( rndr->xvmc_id == AV_XVMC_ID ); - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: draw_image(show rndr=%p)\n",rndr); + rndr = (struct xvmc_pix_fmt*)mpi->priv; //there is copy in plane[2] + assert( rndr != NULL ); + assert( rndr->xvmc_id == AV_XVMC_ID ); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: draw_image(show rndr=%p)\n",rndr); // the surface have passed vf system without been skiped, it will be displayed - rndr->state |= AV_XVMC_STATE_DISPLAY_PENDING; - p_render_surface_to_show = rndr; - top_field_first = mpi->fields & MP_IMGFIELD_TOP_FIRST; - return VO_TRUE; + rndr->state |= AV_XVMC_STATE_DISPLAY_PENDING; + p_render_surface_to_show = rndr; + top_field_first = mpi->fields & MP_IMGFIELD_TOP_FIRST; + return VO_TRUE; } static int preinit(const char *arg){ @@ -386,63 +386,63 @@ strarg_t ck_method_arg = { 0, NULL }; opt_t subopts [] = { - /* name arg type arg var test */ - { "port", OPT_ARG_INT, &xv_port_request, (opt_test_f)int_pos }, - { "adaptor", OPT_ARG_INT, &xv_adaptor, (opt_test_f)int_non_neg }, - { "ck", OPT_ARG_STR, &ck_src_arg, xv_test_ck }, - { "ck-method", OPT_ARG_STR, &ck_method_arg, xv_test_ckm }, - { "benchmark", OPT_ARG_BOOL, &benchmark, NULL }, - { "sleep", OPT_ARG_BOOL, &use_sleep, NULL }, - { "queue", OPT_ARG_BOOL, &use_queue, NULL }, - { "bobdeint", OPT_ARG_BOOL, &bob_deinterlace, NULL }, - { NULL } + /* name arg type arg var test */ + { "port", OPT_ARG_INT, &xv_port_request, (opt_test_f)int_pos }, + { "adaptor", OPT_ARG_INT, &xv_adaptor, (opt_test_f)int_non_neg }, + { "ck", OPT_ARG_STR, &ck_src_arg, xv_test_ck }, + { "ck-method", OPT_ARG_STR, &ck_method_arg, xv_test_ckm }, + { "benchmark", OPT_ARG_BOOL, &benchmark, NULL }, + { "sleep", OPT_ARG_BOOL, &use_sleep, NULL }, + { "queue", OPT_ARG_BOOL, &use_queue, NULL }, + { "bobdeint", OPT_ARG_BOOL, &bob_deinterlace, NULL }, + { NULL } }; - //Obtain display handler - if (!vo_init()) return -1;//vo_xv + //Obtain display handler + if (!vo_init()) return -1;//vo_xv - //XvMC is subdivision of XVideo - if (Success != XvQueryExtension(mDisplay,&xv_version,&xv_release,&xv_request_base, - &xv_event_base,&xv_error_base) ){ - mp_msg(MSGT_VO,MSGL_ERR,"Sorry, Xv(MC) not supported by this X11 version/driver\n"); - mp_msg(MSGT_VO,MSGL_ERR,"********** Try with -vo x11 or -vo sdl ***********\n"); - return -1; - } - printf("vo_xvmc: X-Video extension %d.%d\n",xv_version,xv_release); + //XvMC is subdivision of XVideo + if (Success != XvQueryExtension(mDisplay,&xv_version,&xv_release,&xv_request_base, + &xv_event_base,&xv_error_base) ){ + mp_msg(MSGT_VO,MSGL_ERR,"Sorry, Xv(MC) not supported by this X11 version/driver\n"); + mp_msg(MSGT_VO,MSGL_ERR,"********** Try with -vo x11 or -vo sdl ***********\n"); + return -1; + } + printf("vo_xvmc: X-Video extension %d.%d\n",xv_version,xv_release); - if( True != XvMCQueryExtension(mDisplay,&mc_eventBase,&mc_errorBase) ){ - printf("vo_xvmc: No X-Video MotionCompensation Extension on %s\n", - XDisplayName(NULL)); - return -1; - } + if( True != XvMCQueryExtension(mDisplay,&mc_eventBase,&mc_errorBase) ){ + printf("vo_xvmc: No X-Video MotionCompensation Extension on %s\n", + XDisplayName(NULL)); + return -1; + } - if(Success == XvMCQueryVersion(mDisplay, &mc_ver, &mc_rev) ){ - printf("vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n", + if(Success == XvMCQueryVersion(mDisplay, &mc_ver, &mc_rev) ){ + printf("vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n", mc_ver,mc_rev); - } - else{ - printf("vo_xvmc: Error querying version info!\n"); - return -1; - } - surface_render = NULL; - xv_port = 0; - number_of_surfaces = 0; - subpicture_alloc = 0; + } + else{ + printf("vo_xvmc: Error querying version info!\n"); + return -1; + } + surface_render = NULL; + xv_port = 0; + number_of_surfaces = 0; + subpicture_alloc = 0; - benchmark = 0; //disable PutImageto allow faster display than screen refresh - use_sleep = 0; - use_queue = 0; - bob_deinterlace = 0; + benchmark = 0; //disable PutImageto allow faster display than screen refresh + use_sleep = 0; + use_queue = 0; + bob_deinterlace = 0; - /* parse suboptions */ - if ( subopt_parse( arg, subopts ) != 0 ) - { - return -1; - } + /* parse suboptions */ + if ( subopt_parse( arg, subopts ) != 0 ) + { + return -1; + } - xv_setup_colorkeyhandling( ck_method_arg.str, ck_src_arg.str ); + xv_setup_colorkeyhandling( ck_method_arg.str, ck_src_arg.str ); - return 0; + return 0; } static int config(uint32_t width, uint32_t height, @@ -462,381 +462,381 @@ #endif //end of vo_xv - if( !IMGFMT_IS_XVMC(format) ) - { - assert(0);//should never happen, abort on debug or - return 1;//return error on relese - } + if( !IMGFMT_IS_XVMC(format) ) + { + assert(0);//should never happen, abort on debug or + return 1;//return error on relese + } // 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); + 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); // Find Supported Surface Type - mode_id = xvmc_find_surface_by_format(format,width,height,&surface_info,0);//false=1 to grab port, not query - if ( mode_id == 0 ) - { - return -1; - } + mode_id = xvmc_find_surface_by_format(format,width,height,&surface_info,0);//false=1 to grab port, not query + if ( mode_id == 0 ) + { + return -1; + } - rez = XvMCCreateContext(mDisplay, xv_port,mode_id,width,height,XVMC_DIRECT,&ctx); - if( rez != Success ){ - printf("vo_xvmc: XvMCCreateContext failed with error %d\n",rez); - return -1; - } - if( ctx.flags & XVMC_DIRECT ){ - printf("vo_xvmc: Allocated Direct Context\n"); - }else{ - printf("vo_xvmc: Allocated Indirect Context!\n"); - } + rez = XvMCCreateContext(mDisplay, xv_port,mode_id,width,height,XVMC_DIRECT,&ctx); + if( rez != Success ){ + printf("vo_xvmc: XvMCCreateContext failed with error %d\n",rez); + return -1; + } + if( ctx.flags & XVMC_DIRECT ){ + printf("vo_xvmc: Allocated Direct Context\n"); + }else{ + printf("vo_xvmc: Allocated Indirect Context!\n"); + } - blocks_per_macroblock = 6; - if(surface_info.chroma_format == XVMC_CHROMA_FORMAT_422) - blocks_per_macroblock = 8; - if(surface_info.chroma_format == XVMC_CHROMA_FORMAT_444) - blocks_per_macroblock = 12; + blocks_per_macroblock = 6; + if(surface_info.chroma_format == XVMC_CHROMA_FORMAT_422) + blocks_per_macroblock = 8; + if(surface_info.chroma_format == XVMC_CHROMA_FORMAT_444) + blocks_per_macroblock = 12; - rez = XvMCCreateBlocks(mDisplay,&ctx,numblocks*blocks_per_macroblock,&data_blocks); - if( rez != Success ){ - XvMCDestroyContext(mDisplay,&ctx); - return -1; - } - printf("vo_xvmc: data_blocks allocated\n"); + rez = XvMCCreateBlocks(mDisplay,&ctx,numblocks*blocks_per_macroblock,&data_blocks); + if( rez != Success ){ + XvMCDestroyContext(mDisplay,&ctx); + return -1; + } + printf("vo_xvmc: data_blocks allocated\n"); - rez = XvMCCreateMacroBlocks(mDisplay,&ctx,numblocks,&mv_blocks); - if( rez != Success ){ - XvMCDestroyBlocks(mDisplay,&data_blocks); - XvMCDestroyContext(mDisplay,&ctx); - return -1; - } - printf("vo_xvmc: mv_blocks allocated\n"); + rez = XvMCCreateMacroBlocks(mDisplay,&ctx,numblocks,&mv_blocks); + if( rez != Success ){ + XvMCDestroyBlocks(mDisplay,&data_blocks); + XvMCDestroyContext(mDisplay,&ctx); + return -1; + } + printf("vo_xvmc: mv_blocks allocated\n"); - if(surface_render==NULL) - surface_render = malloc(MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //easy mem debug - memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); + if(surface_render==NULL) + surface_render = malloc(MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //easy mem debug + memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); - for(i=0; i<MAX_SURFACES; i++){ - rez=XvMCCreateSurface(mDisplay,&ctx,&surface_array[i]); - if( rez != Success ) - break; - surface_render[i].xvmc_id = AV_XVMC_ID; - surface_render[i].data_blocks = data_blocks.blocks; - surface_render[i].mv_blocks = mv_blocks.macro_blocks; - surface_render[i].allocated_mv_blocks = numblocks; - surface_render[i].allocated_data_blocks = numblocks*blocks_per_macroblock; - surface_render[i].idct = (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT; - surface_render[i].unsigned_intra = (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED; - surface_render[i].p_surface = &surface_array[i]; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: surface[%d] = %p .rndr=%p\n",i,&surface_array[i], &surface_render[i]); - } - number_of_surfaces = i; - if( number_of_surfaces < 4 ){// +2 I or P and +2 for B (to avoid visible motion drawing) - printf("vo_xvmc: Unable to allocate at least 4 Surfaces\n"); - uninit(); - return -1; - } - printf("vo_xvmc: Motion Compensation context allocated - %d surfaces\n", - number_of_surfaces); + for(i=0; i<MAX_SURFACES; i++){ + rez=XvMCCreateSurface(mDisplay,&ctx,&surface_array[i]); + if( rez != Success ) + break; + surface_render[i].xvmc_id = AV_XVMC_ID; + surface_render[i].data_blocks = data_blocks.blocks; + surface_render[i].mv_blocks = mv_blocks.macro_blocks; + surface_render[i].allocated_mv_blocks = numblocks; + surface_render[i].allocated_data_blocks = numblocks*blocks_per_macroblock; + surface_render[i].idct = (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT; + surface_render[i].unsigned_intra = (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED; + surface_render[i].p_surface = &surface_array[i]; + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: surface[%d] = %p .rndr=%p\n",i,&surface_array[i], &surface_render[i]); + } + number_of_surfaces = i; + if( number_of_surfaces < 4 ){// +2 I or P and +2 for B (to avoid visible motion drawing) + printf("vo_xvmc: Unable to allocate at least 4 Surfaces\n"); + uninit(); + return -1; + } + printf("vo_xvmc: Motion Compensation context allocated - %d surfaces\n", + number_of_surfaces); - //debug - printf("vo_xvmc: idct=%d unsigned_intra=%d\n", - (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT, - (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED); + //debug + printf("vo_xvmc: idct=%d unsigned_intra=%d\n", + (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT, + (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED); // Find way to display OSD & subtitle - printf("vo_xvmc: looking for OSD support\n"); - subpicture_mode = NO_SUBPICTURE; - if(surface_info.flags & XVMC_OVERLAID_SURFACE) - subpicture_mode = OVERLAY_SUBPICTURE; + printf("vo_xvmc: looking for OSD support\n"); + subpicture_mode = NO_SUBPICTURE; + if(surface_info.flags & XVMC_OVERLAID_SURFACE) + subpicture_mode = OVERLAY_SUBPICTURE; - if(surface_info.subpicture_max_width != 0 && - surface_info.subpicture_max_height != 0 ){ - int s,k,num_subpic; + if(surface_info.subpicture_max_width != 0 && + surface_info.subpicture_max_height != 0 ){ + int s,k,num_subpic; - XvImageFormatValues * xvfmv; - xvfmv = XvMCListSubpictureTypes(mDisplay, xv_port, - surface_info.surface_type_id, &num_subpic); + XvImageFormatValues * xvfmv; + xvfmv = XvMCListSubpictureTypes(mDisplay, xv_port, + surface_info.surface_type_id, &num_subpic); - if(num_subpic != 0 && xvfmv != NULL){ - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){//Print all subpicture types for debug - for(s=0;s<num_subpic;s++) - print_xvimage_format_values(&xvfmv[s]); - } + if(num_subpic != 0 && xvfmv != NULL){ + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){//Print all subpicture types for debug + for(s=0;s<num_subpic;s++) + print_xvimage_format_values(&xvfmv[s]); + } - for(s=0;s<num_subpic;s++){ - for(k=0;osd_render[k].draw_func_ptr!=NULL;k++){ - if(xvfmv[s].id == osd_render[k].id) - { - init_osd_fnc = osd_render[k].init_func_ptr; - draw_osd_fnc = osd_render[k].draw_func_ptr; - clear_osd_fnc = osd_render[k].clear_func_ptr; + for(s=0;s<num_subpic;s++){ + for(k=0;osd_render[k].draw_func_ptr!=NULL;k++){ + if(xvfmv[s].id == osd_render[k].id) + { + init_osd_fnc = osd_render[k].init_func_ptr; + draw_osd_fnc = osd_render[k].draw_func_ptr; + clear_osd_fnc = osd_render[k].clear_func_ptr; - subpicture_mode = BLEND_SUBPICTURE; - subpicture_info = xvfmv[s]; - printf(" Subpicture id 0x%08X\n",subpicture_info.id); - goto found_subpic; - } + subpicture_mode = BLEND_SUBPICTURE; + subpicture_info = xvfmv[s]; + printf(" Subpicture id 0x%08X\n",subpicture_info.id); + goto found_subpic; + } + } } - } found_subpic: - XFree(xvfmv); - } - //Blend2 supicture is always possible, blend1 only at backend - if( (subpicture_mode == BLEND_SUBPICTURE) && - (surface_info.flags & XVMC_BACKEND_SUBPICTURE) ) - { - subpicture_mode = BACKEND_SUBPICTURE; - } + XFree(xvfmv); + } + //Blend2 supicture is always possible, blend1 only at backend + if( (subpicture_mode == BLEND_SUBPICTURE) && + (surface_info.flags & XVMC_BACKEND_SUBPICTURE) ) + { + subpicture_mode = BACKEND_SUBPICTURE; + } - } + } - switch(subpicture_mode){ - case NO_SUBPICTURE: - printf("vo_xvmc: No OSD support for this mode\n"); - break; - case OVERLAY_SUBPICTURE: - printf("vo_xvmc: OSD support via color key tricks\n"); - printf("vo_xvmc: not yet implemented:(\n"); - break; - case BLEND_SUBPICTURE: - printf("vo_xvmc: OSD support by additional frontend rendering\n"); - break; - case BACKEND_SUBPICTURE: - printf("vo_xvmc: OSD support by backend rendering (fast)\n"); - printf("vo_xvmc: Please send feedback to confirm that it works,otherwise send bugreport!\n"); - break; - } + switch(subpicture_mode){ + case NO_SUBPICTURE: + printf("vo_xvmc: No OSD support for this mode\n"); + break; + case OVERLAY_SUBPICTURE: + printf("vo_xvmc: OSD support via color key tricks\n"); + printf("vo_xvmc: not yet implemented:(\n"); + break; + case BLEND_SUBPICTURE: + printf("vo_xvmc: OSD support by additional frontend rendering\n"); + break; + case BACKEND_SUBPICTURE: + printf("vo_xvmc: OSD support by backend rendering (fast)\n"); + printf("vo_xvmc: Please send feedback to confirm that it works,otherwise send bugreport!\n"); + break; + } //take keycolor value and choose method for handling it - if ( !vo_xv_init_colorkey() ) - { - return -1; // bail out, colorkey setup failed - } + if ( !vo_xv_init_colorkey() ) + { + return -1; // bail out, colorkey setup failed + } - vo_xv_enable_vsync();//it won't break anything + vo_xv_enable_vsync();//it won't break anything //taken from vo_xv - image_height = height; - image_width = width; + image_height = height; + image_width = width; skip_surface_allocation: #ifdef CONFIG_GUI - if(use_gui) - guiGetEvent( guiSetShVideo,0 ); // let the GUI to setup/resize our window - else + if(use_gui) + guiGetEvent( guiSetShVideo,0 ); // let the GUI to setup/resize our window + else #endif - { + { #ifdef CONFIG_XF86VM - if ( vm ) - { - vo_vm_switch(); - } -// else + if ( vm ) + { + vo_vm_switch(); + } +// else #endif - XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs); - depth=attribs.depth; - if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24; - XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); + XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs); + depth=attribs.depth; + if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24; + XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); - xswa.background_pixel = 0; - if (xv_ck_info.method == CK_METHOD_BACKGROUND) - xswa.background_pixel = xv_colorkey; - xswa.border_pixel = 0; - xswamask = CWBackPixel | CWBorderPixel; + xswa.background_pixel = 0; + if (xv_ck_info.method == CK_METHOD_BACKGROUND) + xswa.background_pixel = xv_colorkey; + xswa.border_pixel = 0; + xswamask = CWBackPixel | CWBorderPixel; - vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, flags, - CopyFromParent, "xvmc", title); - XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); + vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, flags, + CopyFromParent, "xvmc", title); + XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); #ifdef CONFIG_XF86VM - if ( vm ) - { - /* Grab the mouse pointer in our window */ - if(vo_grabpointer) - XGrabPointer(mDisplay, vo_window, True, 0, - GrabModeAsync, GrabModeAsync, - vo_window, None, CurrentTime ); - XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); - } + if ( vm ) + { + /* Grab the mouse pointer in our window */ + if(vo_grabpointer) + XGrabPointer(mDisplay, vo_window, True, 0, + GrabModeAsync, GrabModeAsync, + vo_window, None, CurrentTime ); + XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); + } #endif - } + } - if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) vo_fs = 1; + if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) vo_fs = 1; //end vo_xv - /* store image dimesions for displaying */ - p_render_surface_visible = NULL; - p_render_surface_to_show = NULL; + /* store image dimesions for displaying */ + p_render_surface_visible = NULL; + p_render_surface_to_show = NULL; - free_element = 0; - first_frame = 1; + free_element = 0; + first_frame = 1; - image_format=format; - return 0; + image_format=format; + return 0; } static int draw_frame(uint8_t *srcp[]){ - UNUSED(srcp); - assert(0); + UNUSED(srcp); + assert(0); } static void init_osd_yuv_pal(void) { - char * palette; - int rez; - int i,j; - int snum,seb; - int Y,U,V; + char * palette; + int rez; + int i,j; + int snum,seb; + int Y,U,V; - subpicture_clear_color = 0; + subpicture_clear_color = 0; - if(subpicture.num_palette_entries > 0){ + if(subpicture.num_palette_entries > 0){ - snum = subpicture.num_palette_entries; - seb = subpicture.entry_bytes; - palette = malloc(snum*seb);//check fail - if(palette == NULL) return; - for(i=0; i<snum; i++){ - // 0-black max-white the other are gradients - Y = i*(1 << subpicture_info.y_sample_bits)/snum;//snum=2;->(0),(1*(1<<1)/2) - U = 1 << (subpicture_info.u_sample_bits - 1); - V = 1 << (subpicture_info.v_sample_bits - 1); - for(j=0; j<seb; j++) - switch(subpicture.component_order[j]){ - case 'U': palette[i*seb+j] = U; break; - case 'V': palette[i*seb+j] = V; break; - case 'Y': - default: - palette[i*seb+j] = Y; break; - } - } - rez = XvMCSetSubpicturePalette(mDisplay, &subpicture, palette); - if(rez!=Success){ - printf("vo_xvmc: Setting palette failed.\n"); - } - free(palette); - } + snum = subpicture.num_palette_entries; + seb = subpicture.entry_bytes; + palette = malloc(snum*seb);//check fail + if(palette == NULL) return; + for(i=0; i<snum; i++){ + // 0-black max-white the other are gradients + Y = i*(1 << subpicture_info.y_sample_bits)/snum;//snum=2;->(0),(1*(1<<1)/2) + U = 1 << (subpicture_info.u_sample_bits - 1); + V = 1 << (subpicture_info.v_sample_bits - 1); + for(j=0; j<seb; j++) + switch(subpicture.component_order[j]){ + case 'U': palette[i*seb+j] = U; break; + case 'V': palette[i*seb+j] = V; break; + case 'Y': + default: + palette[i*seb+j] = Y; break; + } + } + rez = XvMCSetSubpicturePalette(mDisplay, &subpicture, palette); + if(rez!=Success){ + printf("vo_xvmc: Setting palette failed.\n"); + } + free(palette); + } } static void clear_osd_subpic(int x0, int y0, int w, int h){ int rez; - rez=XvMCClearSubpicture(mDisplay, &subpicture, - x0, y0, w,h, - subpicture_clear_color); - if(rez != Success) - printf("vo_xvmc: XvMCClearSubpicture failed!\n"); + rez=XvMCClearSubpicture(mDisplay, &subpicture, + x0, y0, w,h, + subpicture_clear_color); + if(rez != Success) + printf("vo_xvmc: XvMCClearSubpicture failed!\n"); } static void OSD_init(void) { unsigned short osd_height, osd_width; int rez; - if(subpicture_alloc){ - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: destroying subpicture\n"); - XvMCDestroySubpicture(mDisplay,&subpicture); - deallocate_xvimage(); - subpicture_alloc = 0; - } + if(subpicture_alloc){ + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: destroying subpicture\n"); + XvMCDestroySubpicture(mDisplay,&subpicture); + deallocate_xvimage(); + subpicture_alloc = 0; + } /* if(surface_info.flags & XVMC_SUBPICTURE_INDEPENDENT_SCALING){ osd_width = vo_dwidth; osd_height = vo_dheight; }else*/ - { - osd_width = image_width; - osd_height = image_height; - } + { + osd_width = image_width; + osd_height = image_height; + } - if(osd_width > surface_info.subpicture_max_width) - osd_width = surface_info.subpicture_max_width; - if(osd_height > surface_info.subpicture_max_height) - osd_height = surface_info.subpicture_max_height; - if(osd_width == 0 || osd_height == 0) - return;//if called before window size is known + if(osd_width > surface_info.subpicture_max_width) + osd_width = surface_info.subpicture_max_width; + if(osd_height > surface_info.subpicture_max_height) + osd_height = surface_info.subpicture_max_height; + if(osd_width == 0 || osd_height == 0) + return;//if called before window size is known - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: creating subpicture (%d,%d) format %X\n", - osd_width,osd_height,subpicture_info.id); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: creating subpicture (%d,%d) format %X\n", + osd_width,osd_height,subpicture_info.id); - rez = XvMCCreateSubpicture(mDisplay,&ctx,&subpicture, - osd_width,osd_height,subpicture_info.id); - if(rez != Success){ - subpicture_mode = NO_SUBPICTURE; - printf("vo_xvmc: Create Subpicture failed, OSD disabled\n"); - return; - } - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){ - int i; - printf("vo_xvmc: Created Subpicture:\n"); - printf(" xvimage_id=0x%X\n",subpicture.xvimage_id); - printf(" width=%d\n",subpicture.width); - printf(" height=%d\n",subpicture.height); - printf(" num_palette_entries=0x%X\n",subpicture.num_palette_entries); - printf(" entry_bytes=0x%X\n",subpicture.entry_bytes); + rez = XvMCCreateSubpicture(mDisplay,&ctx,&subpicture, + osd_width,osd_height,subpicture_info.id); + if(rez != Success){ + subpicture_mode = NO_SUBPICTURE; + printf("vo_xvmc: Create Subpicture failed, OSD disabled\n"); + return; + } + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){ + int i; + printf("vo_xvmc: Created Subpicture:\n"); + printf(" xvimage_id=0x%X\n",subpicture.xvimage_id); + printf(" width=%d\n",subpicture.width); + printf(" height=%d\n",subpicture.height); + printf(" num_palette_entries=0x%X\n",subpicture.num_palette_entries); + printf(" entry_bytes=0x%X\n",subpicture.entry_bytes); - printf(" component_order=\""); - for(i=0; i<4; i++) - if(subpicture.component_order[i] >= 32) - printf("%c", subpicture.component_order[i]); - printf("\"\n"); - } + printf(" component_order=\""); + for(i=0; i<4; i++) + if(subpicture.component_order[i] >= 32) + printf("%c", subpicture.component_order[i]); + printf("\"\n"); + } - //call init for the surface type - init_osd_fnc();//init palete,clear color etc ... - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: clearing subpicture\n"); - clear_osd_fnc(0, 0, subpicture.width, subpicture.height); + //call init for the surface type + init_osd_fnc();//init palete,clear color etc ... + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: clearing subpicture\n"); + clear_osd_fnc(0, 0, subpicture.width, subpicture.height); - allocate_xvimage(subpicture.width, subpicture.height, subpicture_info.id); - subpicture_alloc = 1; + allocate_xvimage(subpicture.width, subpicture.height, subpicture_info.id); + subpicture_alloc = 1; } static void draw_osd_IA44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ int ox,oy; int rez; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h); - for(ox=0; ox<w; ox++){ - for(oy=0; oy<h; oy++){ - xvimage->data[oy*xvimage->width+ox] = (src[oy*stride+ox]>>4) | ((0-srca[oy*stride+ox])&0xf0); - } - } - rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0, - w,h,x0,y0); - if(rez != Success){ - printf("vo_xvmc: composite subpicture failed\n"); - assert(0); - } + for(ox=0; ox<w; ox++){ + for(oy=0; oy<h; oy++){ + xvimage->data[oy*xvimage->width+ox] = (src[oy*stride+ox]>>4) | ((0-srca[oy*stride+ox])&0xf0); + } + } + rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0, + w,h,x0,y0); + if(rez != Success){ + printf("vo_xvmc: composite subpicture failed\n"); + assert(0); + } } static void draw_osd_AI44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ int ox,oy; int rez; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h); - for(ox=0; ox<w; ox++){ - for(oy=0; oy<h; oy++){ - xvimage->data[oy*xvimage->width+ox] = (src[oy*stride+ox]&0xf0) | (((0-srca[oy*stride+ox])>>4)&0xf); - } - } - rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0, - w,h,x0,y0); - if(rez != Success){ - printf("vo_xvmc: composite subpicture failed\n"); - assert(0); - } + for(ox=0; ox<w; ox++){ + for(oy=0; oy<h; oy++){ + xvimage->data[oy*xvimage->width+ox] = (src[oy*stride+ox]&0xf0) | (((0-srca[oy*stride+ox])>>4)&0xf); + } + } + rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0, + w,h,x0,y0); + if(rez != Success){ + printf("vo_xvmc: composite subpicture failed\n"); + assert(0); + } } static void draw_osd(void){ @@ -845,93 +845,93 @@ int have_osd_to_draw; int rez; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n", - subpicture_mode,p_render_surface_to_show); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n", + subpicture_mode,p_render_surface_to_show); - if(subpicture_mode == BLEND_SUBPICTURE || - subpicture_mode == BACKEND_SUBPICTURE ){ + if(subpicture_mode == BLEND_SUBPICTURE || + subpicture_mode == BACKEND_SUBPICTURE ){ - if(!subpicture_alloc) //allocate subpicture when dimensions are known - OSD_init(); - if(!subpicture_alloc) - return;//dimensions still unknown. + if(!subpicture_alloc) //allocate subpicture when dimensions are known + OSD_init(); + if(!subpicture_alloc) + return;//dimensions still unknown. - osd_has_changed = vo_update_osd(subpicture.width, subpicture.height); - have_osd_to_draw = vo_osd_check_range_update(0, 0, subpicture.width, + osd_has_changed = vo_update_osd(subpicture.width, subpicture.height); + have_osd_to_draw = vo_osd_check_range_update(0, 0, subpicture.width, subpicture.height); - if(!have_osd_to_draw) - return;//nothing to draw,no subpic, no blend + if(!have_osd_to_draw) + return;//nothing to draw,no subpic, no blend - if(osd_has_changed){ - //vo_remove_text(subpicture.width, subpicture.height,clear_osd_fnc) - clear_osd_fnc(0,0,subpicture.width,subpicture.height); - vo_draw_text(subpicture.width, subpicture.height, draw_osd_fnc); - } - XvMCSyncSubpicture(mDisplay,&subpicture);//todo usleeep wait! + if(osd_has_changed){ + //vo_remove_text(subpicture.width, subpicture.height,clear_osd_fnc) + clear_osd_fnc(0,0,subpicture.width,subpicture.height); + vo_draw_text(subpicture.width, subpicture.height, draw_osd_fnc); + } + XvMCSyncSubpicture(mDisplay,&subpicture);//todo usleeep wait! - if(subpicture_mode == BLEND_SUBPICTURE){ - osd_rndr = find_free_surface(); - if(osd_rndr == NULL) - return;// no free surface to draw OSD in + if(subpicture_mode == BLEND_SUBPICTURE){ + osd_rndr = find_free_surface(); + if(osd_rndr == NULL) + return;// no free surface to draw OSD in - rez = XvMCBlendSubpicture2(mDisplay, - p_render_surface_to_show->p_surface, osd_rndr->p_surface, - &subpicture, - 0, 0, subpicture.width, subpicture.height, - 0, 0, image_width, image_height); - if(rez!=Success){ - printf("vo_xvmc: BlendSubpicture failed rez=%d\n",rez); - assert(0); - return; - } + rez = XvMCBlendSubpicture2(mDisplay, + p_render_surface_to_show->p_surface, osd_rndr->p_surface, + &subpicture, + 0, 0, subpicture.width, subpicture.height, + 0, 0, image_width, image_height); + if(rez!=Success){ + printf("vo_xvmc: BlendSubpicture failed rez=%d\n",rez); + assert(0); + return; + } // XvMCFlushSurface(mDisplay,osd_rndr->p_surface);//fixme- should I? - //When replaceing the surface with osd one, save the flags too! - osd_rndr->picture_structure = p_render_surface_to_show->picture_structure; + //When replaceing the surface with osd one, save the flags too! + osd_rndr->picture_structure = p_render_surface_to_show->picture_structure; //add more if needed osd_rndr-> = p_render_surface_to_show->; - p_render_surface_to_show->state &= ~AV_XVMC_STATE_DISPLAY_PENDING; - p_render_surface_to_show->state |= AV_XVMC_STATE_OSD_SOURCE; - p_render_surface_to_show->p_osd_target_surface_render = osd_rndr; + p_render_surface_to_show->state &= ~AV_XVMC_STATE_DISPLAY_PENDING; + p_render_surface_to_show->state |= AV_XVMC_STATE_OSD_SOURCE; + p_render_surface_to_show->p_osd_target_surface_render = osd_rndr; - p_render_surface_to_show = osd_rndr; - p_render_surface_to_show->state = AV_XVMC_STATE_DISPLAY_PENDING; + p_render_surface_to_show = osd_rndr; + p_render_surface_to_show->state = AV_XVMC_STATE_DISPLAY_PENDING; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc:draw_osd: surface_to_show changed to %p\n",osd_rndr); - }//endof if(BLEND) - if(subpicture_mode == BACKEND_SUBPICTURE){ - rez = XvMCBlendSubpicture(mDisplay, - p_render_surface_to_show->p_surface, - &subpicture, - 0, 0, subpicture.width, subpicture.height, - 0, 0, image_width, image_height); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc:draw_osd: surface_to_show changed to %p\n",osd_rndr); + }//endof if(BLEND) + if(subpicture_mode == BACKEND_SUBPICTURE){ + rez = XvMCBlendSubpicture(mDisplay, + p_render_surface_to_show->p_surface, + &subpicture, + 0, 0, subpicture.width, subpicture.height, + 0, 0, image_width, image_height); - } + } - }//if(BLEND||BACKEND) + }//if(BLEND||BACKEND) } static void xvmc_sync_surface(XvMCSurface * srf){ int status,rez; - rez = XvMCGetSurfaceStatus(mDisplay,srf,&status); - assert(rez==Success); - if((status & XVMC_RENDERING) == 0) - return;//surface is already complete - if(use_sleep){ - rez = XvMCFlushSurface(mDisplay, srf); - assert(rez==Success); + rez = XvMCGetSurfaceStatus(mDisplay,srf,&status); + assert(rez==Success); + if((status & XVMC_RENDERING) == 0) + return;//surface is already complete + if(use_sleep){ + rez = XvMCFlushSurface(mDisplay, srf); + assert(rez==Success); - do{ - usec_sleep(1000);//1ms (may be 20ms on linux) - XvMCGetSurfaceStatus(mDisplay,srf,&status); - } while (status & XVMC_RENDERING); - return;//done - } + do{ + usec_sleep(1000);//1ms (may be 20ms on linux) + XvMCGetSurfaceStatus(mDisplay,srf,&status); + } while (status & XVMC_RENDERING); + return;//done + } - XvMCSyncSurface(mDisplay, srf); + XvMCSyncSurface(mDisplay, srf); } static void put_xvmc_image(struct xvmc_pix_fmt *p_render_surface, @@ -940,149 +940,149 @@ struct vo_rect src_rect, dst_rect; int i; - if(p_render_surface == NULL) - return; + if(p_render_surface == NULL) + return; - calc_src_dst_rects(image_width, image_height, &src_rect, &dst_rect, NULL, NULL); + calc_src_dst_rects(image_width, image_height, &src_rect, &dst_rect, NULL, NULL); - if(draw_ck) - vo_xv_draw_colorkey(dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height); + if(draw_ck) + vo_xv_draw_colorkey(dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height); - if(benchmark) - return; + if(benchmark) + return; - for (i = 1; i <= bob_deinterlace + 1; i++) { - int field = top_field_first ? i : i ^ 3; - rez = XvMCPutSurface(mDisplay, p_render_surface->p_surface, - vo_window, - src_rect.left, src_rect.top, src_rect.width, src_rect.height, - dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height, - bob_deinterlace ? field : 3); - if(rez != Success){ - printf("vo_xvmc: PutSurface failer, critical error %d!\n",rez); - assert(0); - } - } - XFlush(mDisplay); + for (i = 1; i <= bob_deinterlace + 1; i++) { + int field = top_field_first ? i : i ^ 3; + rez = XvMCPutSurface(mDisplay, p_render_surface->p_surface, + vo_window, + src_rect.left, src_rect.top, src_rect.width, src_rect.height, + dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height, + bob_deinterlace ? field : 3); + if(rez != Success){ + printf("vo_xvmc: PutSurface failer, critical error %d!\n",rez); + assert(0); + } + } + XFlush(mDisplay); } static void flip_page(void){ int i,cfs; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: flip_page show(rndr=%p)\n\n",p_render_surface_to_show); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: flip_page show(rndr=%p)\n\n",p_render_surface_to_show); - if(p_render_surface_to_show == NULL) return; - assert( p_render_surface_to_show->xvmc_id == AV_XVMC_ID ); + if(p_render_surface_to_show == NULL) return; + assert( p_render_surface_to_show->xvmc_id == AV_XVMC_ID ); //fixme assert( p_render_surface_to_show != p_render_surface_visible); - if(use_queue){ - // fill the queue until only n free surfaces remain - // after that start displaying - cfs = count_free_surfaces(); - show_queue[free_element++] = p_render_surface_to_show; - if(cfs > 3){//well have 3 free surfaces after add queue - if(free_element > 1)//a little voodoo magic - xvmc_sync_surface(show_queue[0]->p_surface); - return; - } - p_render_surface_to_show=show_queue[0]; - if( mp_msg_test(MSGT_VO,MSGL_DBG5) ) - printf("vo_xvmc: flip_queue free_element=%d\n",free_element); - free_element--; - for(i=0; i<free_element; i++){ - show_queue[i] = show_queue[i+1]; - } - show_queue[free_element] = NULL; - } + if(use_queue){ + // fill the queue until only n free surfaces remain + // after that start displaying + cfs = count_free_surfaces(); + show_queue[free_element++] = p_render_surface_to_show; + if(cfs > 3){//well have 3 free surfaces after add queue + if(free_element > 1)//a little voodoo magic + xvmc_sync_surface(show_queue[0]->p_surface); + return; + } + p_render_surface_to_show=show_queue[0]; + if( mp_msg_test(MSGT_VO,MSGL_DBG5) ) + printf("vo_xvmc: flip_queue free_element=%d\n",free_element); + free_element--; + for(i=0; i<free_element; i++){ + show_queue[i] = show_queue[i+1]; + } + show_queue[free_element] = NULL; + } // make sure the rendering is done - xvmc_sync_surface(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 &= ~AV_XVMC_STATE_DISPLAY_PENDING; + if(p_render_surface_visible != NULL) + p_render_surface_visible->state &= ~AV_XVMC_STATE_DISPLAY_PENDING; //!!fixme assert(p_render_surface_to_show->state & AV_XVMC_STATE_DISPLAY_PENDING); - //show it, displaying is always vsynced, so skip it for benchmark - put_xvmc_image(p_render_surface_to_show,first_frame); - first_frame=0;//make sure we won't draw it anymore + //show it, displaying is always vsynced, so skip it for benchmark + put_xvmc_image(p_render_surface_to_show,first_frame); + first_frame=0;//make sure we won't draw it anymore - p_render_surface_visible = p_render_surface_to_show; - p_render_surface_to_show = NULL; + p_render_surface_visible = p_render_surface_to_show; + p_render_surface_to_show = NULL; } static void check_events(void){ int e=vo_x11_check_events(mDisplay); - if(e&VO_EVENT_RESIZE) - { - e |= VO_EVENT_EXPOSE; - } - if ( e & VO_EVENT_EXPOSE ) - { - put_xvmc_image(p_render_surface_visible,1); - } + if(e&VO_EVENT_RESIZE) + { + e |= VO_EVENT_EXPOSE; + } + if ( e & VO_EVENT_EXPOSE ) + { + put_xvmc_image(p_render_surface_visible,1); + } } static void xvmc_free(void){ int i; - if( subpicture_alloc ){ + if( subpicture_alloc ){ - XvMCDestroySubpicture(mDisplay,&subpicture); - deallocate_xvimage(); + XvMCDestroySubpicture(mDisplay,&subpicture); + deallocate_xvimage(); - subpicture_alloc = 0; + subpicture_alloc = 0; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: subpicture destroyed\n"); - } + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: subpicture destroyed\n"); + } - if( number_of_surfaces ){ + if( number_of_surfaces ){ - XvMCDestroyMacroBlocks(mDisplay,&mv_blocks); - XvMCDestroyBlocks(mDisplay,&data_blocks); + XvMCDestroyMacroBlocks(mDisplay,&mv_blocks); + XvMCDestroyBlocks(mDisplay,&data_blocks); - for(i=0; i<number_of_surfaces; i++) - { - XvMCHideSurface(mDisplay,&surface_array[i]);//it doesn't hurt, I hope - XvMCDestroySurface(mDisplay,&surface_array[i]); + for(i=0; i<number_of_surfaces; i++) + { + XvMCHideSurface(mDisplay,&surface_array[i]);//it doesn't hurt, I hope + XvMCDestroySurface(mDisplay,&surface_array[i]); - if( (surface_render[i].state != 0) && - (p_render_surface_visible != &surface_render[i]) ) - printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i, - surface_render[i].state); - } + if( (surface_render[i].state != 0) && + (p_render_surface_visible != &surface_render[i]) ) + printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i, + surface_render[i].state); + } - memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //for debugging - free(surface_render);surface_render=NULL; + memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //for debugging + free(surface_render);surface_render=NULL; - XvMCDestroyContext(mDisplay,&ctx); - number_of_surfaces = 0; + XvMCDestroyContext(mDisplay,&ctx); + number_of_surfaces = 0; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) { - printf("vo_xvmc: Context sucessfuly freed\n"); } - } + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) { + printf("vo_xvmc: Context sucessfuly freed\n"); } + } - if( xv_port !=0 ){ - XvUngrabPort(mDisplay,xv_port,CurrentTime); - xv_port = 0; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) { - printf("vo_xvmc: xv_port sucessfuly ungrabed\n"); } - } + if( xv_port !=0 ){ + XvUngrabPort(mDisplay,xv_port,CurrentTime); + xv_port = 0; + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) { + printf("vo_xvmc: xv_port sucessfuly ungrabed\n"); } + } } static void uninit(void){ - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) { - printf("vo_xvmc: uninit called\n"); } - xvmc_free(); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) { + printf("vo_xvmc: uninit called\n"); } + xvmc_free(); //from vo_xv #ifdef CONFIG_XF86VM - vo_vm_close(); + vo_vm_close(); #endif - vo_x11_uninit(); + vo_x11_uninit(); } static int query_format(uint32_t format){ @@ -1090,22 +1090,22 @@ XvMCSurfaceInfo qsurface_info; int mode_id; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: query_format=%X\n",format); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: query_format=%X\n",format); - if(!IMGFMT_IS_XVMC(format)) return 0;// no caps supported - mode_id = xvmc_find_surface_by_format(format, 16, 16, &qsurface_info, 1);//true=1 - quering + if(!IMGFMT_IS_XVMC(format)) return 0;// no caps supported + mode_id = xvmc_find_surface_by_format(format, 16, 16, &qsurface_info, 1);//true=1 - quering - if( mode_id == 0 ) return 0; + if( mode_id == 0 ) return 0; - flags = VFCAP_CSP_SUPPORTED | - VFCAP_CSP_SUPPORTED_BY_HW | - VFCAP_ACCEPT_STRIDE; + flags = VFCAP_CSP_SUPPORTED | + VFCAP_CSP_SUPPORTED_BY_HW | + VFCAP_ACCEPT_STRIDE; - if( (qsurface_info.subpicture_max_width != 0) && - (qsurface_info.subpicture_max_height != 0) ) - flags|=VFCAP_OSD; - return flags; + if( (qsurface_info.subpicture_max_width != 0) && + (qsurface_info.subpicture_max_height != 0) ) + flags|=VFCAP_OSD; + return flags; } @@ -1114,59 +1114,59 @@ struct xvmc_pix_fmt *rndr; int rez; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: draw_slice y=%d\n",y); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: draw_slice y=%d\n",y); - rndr = (struct xvmc_pix_fmt*)image[2]; //this is copy of priv-ate - assert( rndr != NULL ); - assert( rndr->xvmc_id == AV_XVMC_ID ); + rndr = (struct xvmc_pix_fmt*)image[2]; //this is copy of priv-ate + assert( rndr != NULL ); + assert( rndr->xvmc_id == AV_XVMC_ID ); - rez = XvMCRenderSurface(mDisplay,&ctx,rndr->picture_structure, - rndr->p_surface, - rndr->p_past_surface, - rndr->p_future_surface, - rndr->flags, - rndr->filled_mv_blocks_num,rndr->start_mv_blocks_num, - &mv_blocks,&data_blocks); + rez = XvMCRenderSurface(mDisplay,&ctx,rndr->picture_structure, + rndr->p_surface, + rndr->p_past_surface, + rndr->p_future_surface, + rndr->flags, + rndr->filled_mv_blocks_num,rndr->start_mv_blocks_num, + &mv_blocks,&data_blocks); #if 1 - if(rez != Success) - { - int i; - printf("vo_xvmc::slice: RenderSirface returned %d\n",rez); + if(rez != Success) + { + int i; + printf("vo_xvmc::slice: RenderSirface returned %d\n",rez); - printf("vo_xvmc::slice: pict=%d,flags=%x,start_blocks=%d,num_blocks=%d\n", - rndr->picture_structure,rndr->flags,rndr->start_mv_blocks_num, - rndr->filled_mv_blocks_num); - printf("vo_xvmc::slice: this_surf=%p, past_surf=%p, future_surf=%p\n", - rndr->p_surface,rndr->p_past_surface,rndr->p_future_surface); + printf("vo_xvmc::slice: pict=%d,flags=%x,start_blocks=%d,num_blocks=%d\n", + rndr->picture_structure,rndr->flags,rndr->start_mv_blocks_num, + rndr->filled_mv_blocks_num); + printf("vo_xvmc::slice: this_surf=%p, past_surf=%p, future_surf=%p\n", + rndr->p_surface,rndr->p_past_surface,rndr->p_future_surface); - for(i=0; i<rndr->filled_mv_blocks_num; i++){ - XvMCMacroBlock* testblock; - testblock = &mv_blocks.macro_blocks[i]; + for(i=0; i<rndr->filled_mv_blocks_num; i++){ + XvMCMacroBlock* testblock; + testblock = &mv_blocks.macro_blocks[i]; - printf("vo_xvmc::slice: mv_block - x=%d,y=%d,mb_type=0x%x,mv_type=0x%x,mv_field_select=%d\n", - testblock->x,testblock->y,testblock->macroblock_type, - testblock->motion_type,testblock->motion_vertical_field_select); - printf("vo_xvmc::slice: dct_type=%d,data_index=0x%x,cbp=%d,pad0=%d\n", - testblock->dct_type,testblock->index,testblock->coded_block_pattern, - testblock->pad0); - printf("vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n", - testblock->PMV[0][0][0],testblock->PMV[0][0][1]); - } - } + printf("vo_xvmc::slice: mv_block - x=%d,y=%d,mb_type=0x%x,mv_type=0x%x,mv_field_select=%d\n", + testblock->x,testblock->y,testblock->macroblock_type, + testblock->motion_type,testblock->motion_vertical_field_select); + printf("vo_xvmc::slice: dct_type=%d,data_index=0x%x,cbp=%d,pad0=%d\n", + testblock->dct_type,testblock->index,testblock->coded_block_pattern, + testblock->pad0); + printf("vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n", + testblock->PMV[0][0][0],testblock->PMV[0][0][1]); + } + } #endif - assert(rez==Success); - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) printf("vo_xvmc: flush surface\n"); - rez = XvMCFlushSurface(mDisplay, rndr->p_surface); - assert(rez==Success); + assert(rez==Success); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) printf("vo_xvmc: flush surface\n"); + rez = XvMCFlushSurface(mDisplay, rndr->p_surface); + assert(rez==Success); // rndr->start_mv_blocks_num += rndr->filled_mv_blocks_num; - rndr->start_mv_blocks_num = 0; - rndr->filled_mv_blocks_num = 0; + rndr->start_mv_blocks_num = 0; + rndr->filled_mv_blocks_num = 0; - rndr->next_free_data_block_num = 0; + rndr->next_free_data_block_num = 0; - return VO_TRUE; + return VO_TRUE; } //XvMCHide hides the surface on next retrace, so @@ -1174,25 +1174,25 @@ static void check_osd_source(struct xvmc_pix_fmt *src_rndr) { struct xvmc_pix_fmt *osd_rndr; int stat; - //If this is source surface, check does the OSD rendering is compleate - if(src_rndr->state & AV_XVMC_STATE_OSD_SOURCE){ - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + //If this is source surface, check does the OSD rendering is compleate + if(src_rndr->state & AV_XVMC_STATE_OSD_SOURCE){ + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) printf("vo_xvmc: OSD surface=%p quering\n",src_rndr); - osd_rndr = src_rndr->p_osd_target_surface_render; - XvMCGetSurfaceStatus(mDisplay, osd_rndr->p_surface, &stat); - if(!(stat & XVMC_RENDERING)) + osd_rndr = src_rndr->p_osd_target_surface_render; + XvMCGetSurfaceStatus(mDisplay, osd_rndr->p_surface, &stat); + if(!(stat & XVMC_RENDERING)) src_rndr->state &= ~AV_XVMC_STATE_OSD_SOURCE; - } + } } static int count_free_surfaces(void) { int i,num; - num=0; - for(i=0; i<number_of_surfaces; i++){ - check_osd_source(&surface_render[i]); - if(surface_render[i].state == 0) - num++; - } - return num; + num=0; + for(i=0; i<number_of_surfaces; i++){ + check_osd_source(&surface_render[i]); + if(surface_render[i].state == 0) + num++; + } + return num; } static struct xvmc_pix_fmt *find_free_surface(void) { @@ -1200,159 +1200,159 @@ int stat; struct xvmc_pix_fmt *visible_rndr; - visible_rndr = NULL; - for(i=0; i<number_of_surfaces; i++){ + visible_rndr = NULL; + for(i=0; i<number_of_surfaces; i++){ - check_osd_source(&surface_render[i]); - if( surface_render[i].state == 0){ - XvMCGetSurfaceStatus(mDisplay, surface_render[i].p_surface,&stat); - if( (stat & XVMC_DISPLAYING) == 0 ) - return &surface_render[i]; - visible_rndr = &surface_render[i];// remember it, use as last resort - } - } + check_osd_source(&surface_render[i]); + if( surface_render[i].state == 0){ + XvMCGetSurfaceStatus(mDisplay, surface_render[i].p_surface,&stat); + if( (stat & XVMC_DISPLAYING) == 0 ) + return &surface_render[i]; + visible_rndr = &surface_render[i];// remember it, use as last resort + } + } - //all surfaces are busy, but there is one that will be free - //on next monitor retrace, we just have to wait - if(visible_rndr != NULL){ - printf("vo_xvmc: waiting retrace\n"); - for(t=0;t<1000;t++){ - usec_sleep(1000);//1ms - XvMCGetSurfaceStatus(mDisplay, visible_rndr->p_surface,&stat); - if( (stat & XVMC_DISPLAYING) == 0 ) - return visible_rndr; - } - } + //all surfaces are busy, but there is one that will be free + //on next monitor retrace, we just have to wait + if(visible_rndr != NULL){ + printf("vo_xvmc: waiting retrace\n"); + for(t=0;t<1000;t++){ + usec_sleep(1000);//1ms + XvMCGetSurfaceStatus(mDisplay, visible_rndr->p_surface,&stat); + if( (stat & XVMC_DISPLAYING) == 0 ) + return visible_rndr; + } + } //todo remove when stable - printf("vo_xvmc: no free surfaces, this should not happen in g1\n"); - for(i=0;i<number_of_surfaces;i++) - printf("vo_xvmc: surface[%d].state=%d\n",i,surface_render[i].state); - return NULL; + printf("vo_xvmc: no free surfaces, this should not happen in g1\n"); + for(i=0;i<number_of_surfaces;i++) + printf("vo_xvmc: surface[%d].state=%d\n",i,surface_render[i].state); + return NULL; } static void xvmc_clean_surfaces(void){ int i; - for(i=0; i<number_of_surfaces; i++){ + for(i=0; i<number_of_surfaces; i++){ - surface_render[i].state&=!( AV_XVMC_STATE_DISPLAY_PENDING | - AV_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", + surface_render[i].state&=!( AV_XVMC_STATE_DISPLAY_PENDING | + AV_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 + } + } + free_element=0;//clean up the queue } static uint32_t get_image(mp_image_t *mpi){ - struct xvmc_pix_fmt *rndr; + struct xvmc_pix_fmt *rndr; - rndr = find_free_surface(); + rndr = find_free_surface(); - if(rndr == NULL){ - printf("vo_xvmc: get_image failed\n"); - return VO_FALSE; - } + if(rndr == NULL){ + printf("vo_xvmc: get_image failed\n"); + return VO_FALSE; + } assert(rndr->start_mv_blocks_num == 0); assert(rndr->filled_mv_blocks_num == 0); assert(rndr->next_free_data_block_num == 0); - mpi->flags |= MP_IMGFLAG_DIRECT; + mpi->flags |= MP_IMGFLAG_DIRECT; //keep strides 0 to avoid field manipulations - mpi->stride[0] = 0; - mpi->stride[1] = 0; - mpi->stride[2] = 0; + mpi->stride[0] = 0; + mpi->stride[1] = 0; + mpi->stride[2] = 0; // these are shared!! so watch out // do call RenderSurface before overwriting - mpi->planes[0] = (char*)data_blocks.blocks; - mpi->planes[1] = (char*)mv_blocks.macro_blocks; - mpi->priv = - mpi->planes[2] = (char*)rndr; + mpi->planes[0] = (char*)data_blocks.blocks; + mpi->planes[1] = (char*)mv_blocks.macro_blocks; + mpi->priv = + mpi->planes[2] = (char*)rndr; - rndr->picture_structure = 0; - rndr->flags = 0; - rndr->state = 0; - rndr->start_mv_blocks_num = 0; - rndr->filled_mv_blocks_num = 0; - rndr->next_free_data_block_num = 0; + rndr->picture_structure = 0; + rndr->flags = 0; + rndr->state = 0; + rndr->start_mv_blocks_num = 0; + rndr->filled_mv_blocks_num = 0; + rndr->next_free_data_block_num = 0; - if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) - printf("vo_xvmc: get_image: rndr=%p (surface=%p) \n", - rndr,rndr->p_surface); + if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) + printf("vo_xvmc: get_image: rndr=%p (surface=%p) \n", + rndr,rndr->p_surface); return VO_TRUE; } static int control(uint32_t request, void *data, ... ) { - switch (request){ - case VOCTRL_GET_DEINTERLACE: - *(int*)data = bob_deinterlace; - return VO_TRUE; - case VOCTRL_SET_DEINTERLACE: - bob_deinterlace = *(int*)data; - return VO_TRUE; - case VOCTRL_QUERY_FORMAT: - return query_format(*((uint32_t*)data)); - case VOCTRL_DRAW_IMAGE: - return xvmc_draw_image((mp_image_t *)data); - case VOCTRL_GET_IMAGE: - return get_image((mp_image_t *)data); - //vo_xv - case VOCTRL_GUISUPPORT: - return VO_TRUE; - case VOCTRL_ONTOP: - vo_x11_ontop(); - return VO_TRUE; - case VOCTRL_FULLSCREEN: - vo_x11_fullscreen(); - // indended, fallthrough to update panscan on fullscreen/windowed switch - case VOCTRL_SET_PANSCAN: - if ( ( vo_fs && ( vo_panscan != vo_panscan_amount ) ) || ( !vo_fs && vo_panscan_amount ) ) - { - int old_y = vo_panscan_y; - panscan_calc(); + switch (request){ + case VOCTRL_GET_DEINTERLACE: + *(int*)data = bob_deinterlace; + return VO_TRUE; + case VOCTRL_SET_DEINTERLACE: + bob_deinterlace = *(int*)data; + return VO_TRUE; + case VOCTRL_QUERY_FORMAT: + return query_format(*((uint32_t*)data)); + case VOCTRL_DRAW_IMAGE: + return xvmc_draw_image((mp_image_t *)data); + case VOCTRL_GET_IMAGE: + return get_image((mp_image_t *)data); + //vo_xv + case VOCTRL_GUISUPPORT: + return VO_TRUE; + case VOCTRL_ONTOP: + vo_x11_ontop(); + return VO_TRUE; + case VOCTRL_FULLSCREEN: + vo_x11_fullscreen(); + // indended, fallthrough to update panscan on fullscreen/windowed switch + case VOCTRL_SET_PANSCAN: + if ( ( vo_fs && ( vo_panscan != vo_panscan_amount ) ) || ( !vo_fs && vo_panscan_amount ) ) + { + int old_y = vo_panscan_y; + panscan_calc(); - if(old_y != vo_panscan_y) - { - //this also draws the colorkey - put_xvmc_image(p_render_surface_visible,1); + if(old_y != vo_panscan_y) + { + //this also draws the colorkey + put_xvmc_image(p_render_surface_visible,1); + } } - } - return VO_TRUE; - case VOCTRL_GET_PANSCAN: - if ( !vo_config_count || !vo_fs ) return VO_FALSE; - return VO_TRUE; - case VOCTRL_SET_EQUALIZER: - { - va_list ap; - int value; + return VO_TRUE; + case VOCTRL_GET_PANSCAN: + if ( !vo_config_count || !vo_fs ) return VO_FALSE; + return VO_TRUE; + case VOCTRL_SET_EQUALIZER: + { + va_list ap; + int value; - va_start(ap, data); - value = va_arg(ap, int); - va_end(ap); + va_start(ap, data); + value = va_arg(ap, int); + va_end(ap); + + return vo_xv_set_eq(xv_port, data, value); + } - return vo_xv_set_eq(xv_port, data, value); - } - - case VOCTRL_GET_EQUALIZER: - { - va_list ap; - int *value; + case VOCTRL_GET_EQUALIZER: + { + va_list ap; + int *value; - va_start(ap, data); - value = va_arg(ap, int*); - va_end(ap); + va_start(ap, data); + value = va_arg(ap, int*); + va_end(ap); - return vo_xv_get_eq(xv_port, data, value); - } - case VOCTRL_UPDATE_SCREENINFO: - update_xinerama_info(); - return VO_TRUE; - } + return vo_xv_get_eq(xv_port, data, value); + } + case VOCTRL_UPDATE_SCREENINFO: + update_xinerama_info(); + return VO_TRUE; + } return VO_NOTIMPL; }