Mercurial > mplayer.hg
changeset 182:80a7b40f201a
*** empty log message ***
author | pontscho |
---|---|
date | Wed, 21 Mar 2001 19:10:55 +0000 |
parents | c7b4ef1f3dfb |
children | c2f246c2411d |
files | libvo/vo_xmga.c libvo/vo_xv.c |
diffstat | 2 files changed, 241 insertions(+), 306 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_xmga.c Wed Mar 21 17:31:28 2001 +0000 +++ b/libvo/vo_xmga.c Wed Mar 21 19:10:55 2001 +0000 @@ -47,7 +47,7 @@ #include "x11_common.h" -#ifdef SHOW_TIME +#ifdef SHOW_TIME #include "../linux/timer.h" static unsigned int timer=0; static unsigned int timerd=0; @@ -90,8 +90,6 @@ #include "mga_common.c" - - static void mDrawColorKey( void ) { XClearWindow( mDisplay,mWindow ); @@ -145,13 +143,13 @@ } static void flip_page(void){ -#ifdef SHOW_TIME +#ifdef SHOW_TIME unsigned int t; t=GetTimer(); printf(" [timer: %08X diff: %6d dd: %6d ] \n",t,t-timer,(t-timer)-timerd); timerd=t-timer; timer=t; -#endif +#endif check_events(); vo_mga_flip_page(); @@ -181,13 +179,13 @@ switch(format) { - case IMGFMT_YV12: + case IMGFMT_YV12: mga_vid_config.format=MGA_VID_FORMAT_YV12; - mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height + ( ( ( width + 31 ) & ~31 ) * height ) / 2; + mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height + ( ( ( width + 31 ) & ~31 ) * height ) / 2; break; case IMGFMT_YUY2: mga_vid_config.format=MGA_VID_FORMAT_YUY2; - mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height * 2; + mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height * 2; break; default: fprintf(stderr,"mga: invalid output format %0X\n",format); return (-1); } @@ -258,7 +256,7 @@ mGC=XCreateGC( mDisplay,mWindow,GCForeground,&wGCV ); XMapWindow( mDisplay,mWindow ); - + set_window(); mga_vid_config.src_width=width;
--- a/libvo/vo_xv.c Wed Mar 21 17:31:28 2001 +0000 +++ b/libvo/vo_xv.c Wed Mar 21 19:10:55 2001 +0000 @@ -1,17 +1,13 @@ -#define DISP -/* - * video_out_x11.c, X11 interface +/* + * vo_xv.c, X11 Xv interface * - * - * Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. + * Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. * * Hacked into mpeg2dec by - * + * * Aaron Holtzman <aholtzma@ess.engr.uvic.ca> * - * 15 & 16 bpp support added by Franck Sicard <Franck.Sicard@solsoft.fr> - * * Xv image suuport by Gerd Knorr <kraxel@goldbach.in-berlin.de> */ @@ -29,16 +25,15 @@ #include <X11/Xutil.h> #include <X11/extensions/XShm.h> #include <errno.h> -#include "yuv2rgb.h" #include "x11_common.h" -static vo_info_t vo_info = +static vo_info_t vo_info = { - "X11/Xv", - "xv", - "Gerd Knorr <kraxel@goldbach.in-berlin.de>", - "" + "X11/Xv", + "xv", + "Gerd Knorr <kraxel@goldbach.in-berlin.de>", + "" }; /* since it doesn't seem to be defined on some platforms */ @@ -61,7 +56,6 @@ static void allocate_xvimage(int); static unsigned int ver,rel,req,ev,err; static unsigned int formats, adaptors,i,xv_port,xv_format; -//static int vo_dwidth,vo_dheight; static XvAdaptorInfo *ai; static XvImageFormatValues *fo; static XvImage *xvimage[1]; @@ -80,339 +74,282 @@ static uint32_t image_height; static uint32_t image_format; -static int get_depth(){ - char *name = ":0.0"; - if(getenv("DISPLAY")) name = getenv("DISPLAY"); - mydisplay = XOpenDisplay(name); - if (mydisplay == NULL) return 0; - XGetWindowAttributes(mydisplay, DefaultRootWindow(mydisplay), &attribs); - depth = attribs.depth; - XCloseDisplay(mydisplay); +static Window mRoot; +static uint32_t drwX,drwY,drwWidth,drwHeight,drwBorderWidth,drwDepth; +static uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen; - if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24; - printf("X11 Display color depth = %d\n",depth); - return depth; -} - -/* connect to server, create and map window, +/* + * connect to server, create and map window, * allocate colors and (shared) memory */ -static uint32_t -init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format) +static uint32_t init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format) { - int screen; -// unsigned int fg, bg; - char *hello = (title == NULL) ? "Xv rulez" : title; - char *name = ":0.0"; - XSizeHints hint; - XVisualInfo vinfo; - XEvent xev; + int screen; + char *hello = (title == NULL) ? "Xv render" : title; + char *name = ":0.0"; + XSizeHints hint; + XVisualInfo vinfo; + XEvent xev; - XGCValues xgcv; - Colormap theCmap; - XSetWindowAttributes xswa; - unsigned long xswamask; - - image_height = height; - image_width = width; - image_format=format; + XGCValues xgcv; + XSetWindowAttributes xswa; + unsigned long xswamask; - if(getenv("DISPLAY")) - name = getenv("DISPLAY"); + image_height = height; + image_width = width; + image_format=format; - mydisplay = XOpenDisplay(name); + mFullscreen=fullscreen; + dwidth=d_width; dheight=d_height; - if (mydisplay == NULL) - { - fprintf(stderr,"Can't open display\n"); - return -1; - } + if(getenv("DISPLAY")) name = getenv("DISPLAY"); - screen = DefaultScreen(mydisplay); + mydisplay = XOpenDisplay(name); - hint.x = 0; - hint.y = 0; - hint.width = image_width; - hint.height = image_height; - hint.flags = PPosition | PSize; - - /* Get some colors */ + if (mydisplay == NULL) + { + fprintf(stderr,"Can't open display\n"); + return -1; + } -// bg = WhitePixel(mydisplay, screen); -// fg = BlackPixel(mydisplay, screen); - - /* Make the window */ - - XGetWindowAttributes(mydisplay, DefaultRootWindow(mydisplay), &attribs); - - /* - * - * depth in X11 terminology land is the number of bits used to - * actually represent the colour. - * - * bpp in X11 land means how many bits in the frame buffer per - * pixel. - * - * ex. 15 bit color is 15 bit depth and 16 bpp. Also 24 bit - * color is 24 bit depth, but can be 24 bpp or 32 bpp. - */ - - depth = attribs.depth; + screen = DefaultScreen(mydisplay); - if (depth != 15 && depth != 16 && depth != 24 && depth != 32) - { - /* The root window may be 8bit but there might still be - * visuals with other bit depths. For example this is the - * case on Sun/Solaris machines. - */ - depth = 24; - } - //BEGIN HACK - //mywindow = XCreateSimpleWindow(mydisplay, DefaultRootWindow(mydisplay), - //hint.x, hint.y, hint.width, hint.height, 4, fg, bg); - // - XMatchVisualInfo(mydisplay, screen, depth, TrueColor, &vinfo); + hint.x = 0; + hint.y = 0; + hint.width = image_width; + hint.height = image_height; + if ( fullscreen ) + { + hint.width=vo_screenwidth; + hint.height=vo_screenheight; + } + hint.flags = PPosition | PSize; + XGetWindowAttributes(mydisplay, DefaultRootWindow(mydisplay), &attribs); + depth=attribs.depth; + if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24; + XMatchVisualInfo(mydisplay, screen, depth, TrueColor, &vinfo); - theCmap = XCreateColormap(mydisplay, RootWindow(mydisplay,screen), - vinfo.visual, AllocNone); + xswa.background_pixel = 0; + xswa.border_pixel = 0; + xswamask = CWBackPixel | CWBorderPixel; - xswa.background_pixel = 0; - xswa.border_pixel = 1; - xswa.colormap = theCmap; - xswamask = CWBackPixel | CWBorderPixel |CWColormap; + mywindow = XCreateWindow(mydisplay, RootWindow(mydisplay,screen), + hint.x, hint.y, hint.width, hint.height, + 0, depth,CopyFromParent,vinfo.visual,xswamask,&xswa); + XSelectInput(mydisplay, mywindow, StructureNotifyMask | KeyPressMask ); + XSetStandardProperties(mydisplay, mywindow, hello, hello, None, NULL, 0, &hint); + if ( fullscreen ) vo_x11_decoration( mydisplay,mywindow,0 ); + XMapWindow(mydisplay, mywindow); + XFlush(mydisplay); + XSync(mydisplay, False); - mywindow = XCreateWindow(mydisplay, RootWindow(mydisplay,screen), - hint.x, hint.y, hint.width, hint.height, 4, depth,CopyFromParent,vinfo.visual,xswamask,&xswa); - - XSelectInput(mydisplay, mywindow, StructureNotifyMask); - - /* Tell other applications about this window */ - - XSetStandardProperties(mydisplay, mywindow, hello, hello, None, NULL, 0, &hint); - - if ( fullscreen ) vo_x11_decoration( mydisplay,mywindow,0 ); - - /* Map window. */ + mygc = XCreateGC(mydisplay, mywindow, 0L, &xgcv); - XMapWindow(mydisplay, mywindow); - - /* Wait for map. */ - do - { - XNextEvent(mydisplay, &xev); - } - while (xev.type != MapNotify || xev.xmap.event != mywindow); - - XSelectInput(mydisplay, mywindow, NoEventMask); - - XFlush(mydisplay); - XSync(mydisplay, False); - - mygc = XCreateGC(mydisplay, mywindow, 0L, &xgcv); + xv_port = 0; + if (Success == XvQueryExtension(mydisplay,&ver,&rel,&req,&ev,&err)) + { + /* check for Xvideo support */ + if (Success != XvQueryAdaptors(mydisplay,DefaultRootWindow(mydisplay), &adaptors,&ai)) + { + fprintf(stderr,"Xv: XvQueryAdaptors failed"); + return -1; + } + /* check adaptors */ + for (i = 0; i < adaptors; i++) + { + if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask) && (xv_port == 0)) xv_port = ai[i].base_id; + } + /* check image formats */ + if (xv_port != 0) + { + fo = XvListImageFormats(mydisplay, xv_port, (int*)&formats); + xv_format=0; + for(i = 0; i < formats; i++) + { + fprintf(stderr, "Xvideo image format: 0x%x (%4.4s) %s\n", fo[i].id,(char*)&fo[i].id, (fo[i].format == XvPacked) ? "packed" : "planar"); - xv_port = 0; - if (Success == XvQueryExtension(mydisplay,&ver,&rel,&req,&ev,&err)) - { - /* check for Xvideo support */ - if (Success != XvQueryAdaptors(mydisplay,DefaultRootWindow(mydisplay), &adaptors,&ai)) - { - fprintf(stderr,"Xv: XvQueryAdaptors failed"); - return -1; - } - /* check adaptors */ - for (i = 0; i < adaptors; i++) - { - if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask) && (xv_port == 0)) - xv_port = ai[i].base_id; - } - /* check image formats */ - if (xv_port != 0) - { - fo = XvListImageFormats(mydisplay, xv_port, (int*)&formats); - xv_format=0; - for(i = 0; i < formats; i++) - { - fprintf(stderr, "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; + } + } + if (!xv_format) xv_port = 0; + } + + if (xv_port != 0) + { + fprintf( stderr,"using Xvideo port %d for hw scaling\n",xv_port ); + + allocate_xvimage(0); - if (fo[i].id == format) - { - xv_format = fo[i].id; -// break; - } - } - if (!xv_format) /* no matching image format not */ - xv_port = 0; - } - - if (xv_port != 0) - { - fprintf(stderr,"using Xvideo port %d for hw scaling\n", - xv_port); - - allocate_xvimage(0); + XGetGeometry( mydisplay,mywindow,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth ); + drwX=0; drwY=0; + XTranslateCoordinates( mydisplay,mywindow,mRoot,0,0,&drwcX,&drwcY,&mRoot ); + fprintf( stderr,"[xv] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); - /* catch window resizes */ - XSelectInput(mydisplay, mywindow, StructureNotifyMask | KeyPressMask); -// XSelectInput(mydisplay, mywindow, StructureNotifyMask); - vo_dwidth = image_width; - vo_dheight = image_height; - // resize: - XMoveResizeWindow(mydisplay,mywindow,0,0,d_width,d_height); + if ( mFullscreen ) + { + drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; + drwcX+=drwX; + drwY=( vo_screenheight - (dheight > vo_screenheight?vo_screenheight:dheight) ) / 2; + drwcY+=drwY; + drwWidth=(dwidth > vo_screenwidth?vo_screenwidth:dwidth); + drwHeight=(dheight > vo_screenheight?vo_screenheight:dheight); + fprintf( stderr,"[xv-fs] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); + } + return 0; + } + } - return 0; - } - } - - printf("Sorry, Xv not supported by this X11 version/driver\n"); - printf("******** Try with -vo x11 or -vo sdl *********\n"); - return 1; - + printf("Sorry, Xv not supported by this X11 version/driver\n"); + printf("******** Try with -vo x11 or -vo sdl *********\n"); + return 1; } -static const vo_info_t* -get_info(void) -{ - return &vo_info; -} +static const vo_info_t * get_info(void) +{ return &vo_info; } -static void -allocate_xvimage(int foo) +static void allocate_xvimage(int foo) { - /* allocate XvImages. FIXME: no error checking, without - * mit-shm this will bomb... */ - xvimage[foo] = XvShmCreateImage(mydisplay, xv_port, xv_format, 0, image_width, image_height, &Shminfo[foo]); - - Shminfo[foo].shmid = shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777); - Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); - Shminfo[foo].readOnly = False; - - xvimage[foo]->data = Shminfo[foo].shmaddr; - XShmAttach(mydisplay, &Shminfo[foo]); - XSync(mydisplay, False); - shmctl(Shminfo[foo].shmid, IPC_RMID, 0); + /* + * allocate XvImages. FIXME: no error checking, without + * mit-shm this will bomb... + */ + xvimage[foo] = XvShmCreateImage(mydisplay, xv_port, xv_format, 0, image_width, image_height, &Shminfo[foo]); - /* so we can do grayscale while testing... */ - memset(xvimage[foo]->data,128,xvimage[foo]->data_size); + Shminfo[foo].shmid = shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777); + Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); + Shminfo[foo].readOnly = False; - return; + xvimage[foo]->data = Shminfo[foo].shmaddr; + XShmAttach(mydisplay, &Shminfo[foo]); + XSync(mydisplay, False); + shmctl(Shminfo[foo].shmid, IPC_RMID, 0); + memset(xvimage[foo]->data,128,xvimage[foo]->data_size); + return; } static void check_events(void) { - int e=vo_x11_check_events(mydisplay); + int e=vo_x11_check_events(mydisplay); + if(e&VO_EVENT_RESIZE) + { + XGetGeometry( mydisplay,mywindow,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth ); + drwX=0; drwY=0; + XTranslateCoordinates( mydisplay,mywindow,mRoot,0,0,&drwcX,&drwcY,&mRoot ); + fprintf( stderr,"[xv] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); + if ( mFullscreen ) + { + drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; + drwcX+=drwX; + drwY=( vo_screenheight - (dheight > vo_screenheight?vo_screenheight:dheight) ) / 2; + drwcY+=drwY; + drwWidth=(dwidth > vo_screenwidth?vo_screenwidth:dwidth); + drwHeight=(dheight > vo_screenheight?vo_screenheight:dheight); + fprintf( stderr,"[xv-fs] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); + } + } } -static void -flip_page(void) +static void flip_page(void) { - check_events(); -#ifdef DISP - XvShmPutImage(mydisplay, xv_port, mywindow, mygc, xvimage[0], - 0, 0, image_width, image_height, - 0, 0, vo_dwidth, vo_dheight, - False); - XFlush(mydisplay); -#endif - return; + check_events(); + XvShmPutImage(mydisplay, xv_port, mywindow, mygc, xvimage[0], + 0, 0, image_width, image_height, + drwX,drwY,drwWidth,(mFullscreen?drwHeight - 1:drwHeight), + False); + XFlush(mydisplay); + return; } -//draw_slice(uint8_t *src[], uint32_t slice_num) -static uint32_t -draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y) +static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y) { - uint8_t *src; - uint8_t *dst; - int i; + uint8_t *src; + uint8_t *dst; + int i; + + dst = xvimage[0]->data + image_width * y + x; + src = image[0]; + if(w==stride[0] && w==image_width) memcpy(dst,src,w*h); + else + for(i=0;i<h;i++) + { + memcpy(dst,src,w); + src+=stride[0]; + dst+=image_width; + } + + x/=2;y/=2;w/=2;h/=2; - dst = xvimage[0]->data + image_width * y + x; - src = image[0]; - if(w==stride[0] && w==image_width) - memcpy(dst,src,w*h); - else - for(i=0;i<h;i++){ - memcpy(dst,src,w); - src+=stride[0]; - dst+=image_width; - } - - x/=2;y/=2;w/=2;h/=2; - - dst = xvimage[0]->data + image_width * image_height + image_width/2 * y + x; - src = image[2]; - if(w==stride[2] && w==image_width/2) - memcpy(dst,src,w*h); - else - for(i=0;i<h;i++){ - memcpy(dst,src,w); - src+=stride[2]; - dst+=image_width/2; - } - - dst = xvimage[0]->data + image_width * image_height * 5 / 4 + image_width/2 * y + x; - src = image[1]; - if(w==stride[1] && w==image_width/2) - memcpy(dst,src,w*h); - else - for(i=0;i<h;i++){ - memcpy(dst,src,w); - src+=stride[1]; - dst+=image_width/2; - } - - return 0; + dst = xvimage[0]->data + image_width * image_height + image_width/2 * y + x; + src = image[2]; + if(w==stride[2] && w==image_width/2) memcpy(dst,src,w*h); + else + for(i=0;i<h;i++) + { + memcpy(dst,src,w); + src+=stride[2]; + dst+=image_width/2; + } + dst = xvimage[0]->data + image_width * image_height * 5 / 4 + image_width/2 * y + x; + src = image[1]; + if(w==stride[1] && w==image_width/2) memcpy(dst,src,w*h); + else + for(i=0;i<h;i++) + { + memcpy(dst,src,w); + src+=stride[1]; + dst+=image_width/2; + } + return 0; } - -static uint32_t -draw_frame(uint8_t *src[]) +static uint32_t draw_frame(uint8_t *src[]) { - int foo; + int foo; - if(xv_format==IMGFMT_YUY2){ - // YUY2 packed, flipped + if(xv_format==IMGFMT_YUY2) + { + // YUY2 packed, flipped #if 0 - int i; - unsigned short *s=(unsigned short *)src[0]; - unsigned short *d=(unsigned short *)xvimage[0]->data; - s+=image_width*image_height; - for(i=0;i<image_height;i++){ - s-=image_width; - memcpy(d,s,image_width*2); - d+=image_width; - } + int i; + unsigned short *s=(unsigned short *)src[0]; + unsigned short *d=(unsigned short *)xvimage[0]->data; + s+=image_width*image_height; + for(i=0;i<image_height;i++) + { + s-=image_width; + memcpy(d,s,image_width*2); + d+=image_width; + } #else - memcpy(xvimage[0]->data,src[0],image_width*image_height*2); + memcpy(xvimage[0]->data,src[0],image_width*image_height*2); #endif - } else { - // YV12 planar - memcpy(xvimage[0]->data,src[0],image_width*image_height); - memcpy(xvimage[0]->data+image_width*image_height,src[2],image_width*image_height/4); - memcpy(xvimage[0]->data+image_width*image_height*5/4,src[1],image_width*image_height/4); - } - - return 0; + } + else + { + // YV12 planar + memcpy(xvimage[0]->data,src[0],image_width*image_height); + memcpy(xvimage[0]->data+image_width*image_height,src[2],image_width*image_height/4); + memcpy(xvimage[0]->data+image_width*image_height*5/4,src[1],image_width*image_height/4); + } + + return 0; } -static uint32_t -query_format(uint32_t format) +static uint32_t query_format(uint32_t format) { - switch(format){ - case IMGFMT_YV12: - case IMGFMT_YUY2: -// case IMGFMT_RGB|24: -// case IMGFMT_BGR|32: - return 1; - } - return 0; + switch(format) + { + case IMGFMT_YV12: + case IMGFMT_YUY2: return 1; + } + return 0; } -static void -uninit(void) -{ -} +static void uninit(void) { }