--- libvo/vo_xv.c-orig Fri Jun 14 12:20:33 2002 +++ libvo/vo_xv.c Sun Jun 16 14:52:01 2002 @@ -44,6 +44,9 @@ #include "../Gui/interface.h" #endif +// NVIDIA video bliter supports IMGFMT_BGR32, but the id is 3 +#define IMGFMT_BGR32_XV 3 + static vo_info_t vo_info = { "X11/Xv", @@ -123,6 +126,13 @@ xvimage[current_buf]->pitches[0]*y0+2*x0+1,xvimage[current_buf]->pitches[0]); } +static void draw_alpha_rgb32(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ + x0+=(vo_panscan_x>>2); + vo_draw_alpha_rgb32(w,h,src,srca,stride, + xvimage[current_buf]->data+xvimage[current_buf]->offsets[0]+ + xvimage[current_buf]->pitches[0]*y0+4*x0,xvimage[current_buf]->pitches[0]); +} + static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ } @@ -362,6 +372,7 @@ fo = XvListImageFormats(mDisplay, xv_port, (int*)&formats); xv_format=0; if(format==IMGFMT_BGR24) format=IMGFMT_YV12; + else if(format==IMGFMT_BGR32) format=IMGFMT_BGR32_XV; for(i = 0; i < formats; i++){ mp_msg(MSGT_VO,MSGL_V,"Xvideo image format: 0x%x (%4.4s) %s\n", fo[i].id,(char*)&fo[i].id, (fo[i].format == XvPacked) ? "packed" : "planar"); if (fo[i].id == format) xv_format = fo[i].id; @@ -480,6 +491,7 @@ case IMGFMT_YUY2: case IMGFMT_YVYU: draw_alpha_fnc=draw_alpha_yuy2; break; case IMGFMT_UYVY: draw_alpha_fnc=draw_alpha_uyvy; break; + case IMGFMT_BGR32_XV: draw_alpha_fnc=draw_alpha_rgb32; break; default: draw_alpha_fnc=draw_alpha_null; } @@ -735,6 +747,10 @@ 3*image_width); break; + case IMGFMT_BGR32: + memcpy(xvimage[current_buf]->data,src[0],xvimage[current_buf]->data_size); + break; + } return 0; @@ -777,6 +793,7 @@ int flag=3|VFCAP_HWSCALE_UP|VFCAP_HWSCALE_DOWN|VFCAP_OSD; // FIXME! check for DOWN /* check image formats */ if(format==IMGFMT_BGR24){ format=IMGFMT_YV12;flag&=~2;flag|=VFCAP_FLIP;} // conversion! + else if(format==IMGFMT_BGR32){ format=IMGFMT_BGR32_XV;} for(i = 0; i < formats; i++){ if (fo[i].id == format) return flag; //xv_format = fo[i].id; }