summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorpontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-03-21 19:10:55 +0000
committerpontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-03-21 19:10:55 +0000
commitbd3dccb0482ae74e0f99b638cac98fd5310e9dfe (patch)
tree99e0180648ffc18fe55ef10098dc5d4aef5e78b9 /libvo
parent7eebecfc9354fe7d861621e0ae635de3775f7f61 (diff)
downloadmpv-bd3dccb0482ae74e0f99b638cac98fd5310e9dfe.tar.bz2
mpv-bd3dccb0482ae74e0f99b638cac98fd5310e9dfe.tar.xz
*** empty log message ***
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@183 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_xmga.c16
-rw-r--r--libvo/vo_xv.c569
2 files changed, 260 insertions, 325 deletions
diff --git a/libvo/vo_xmga.c b/libvo/vo_xmga.c
index 316b3146b6..6fc0719ec5 100644
--- a/libvo/vo_xmga.c
+++ b/libvo/vo_xmga.c
@@ -47,7 +47,7 @@ LIBVO_EXTERN( xmga )
#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 @@ static XSetWindowAttributes xWAttribs;
#include "mga_common.c"
-
-
static void mDrawColorKey( void )
{
XClearWindow( mDisplay,mWindow );
@@ -145,13 +143,13 @@ static void check_events(void)
}
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 @@ static uint32_t init( uint32_t width, uint32_t height, uint32_t d_width, uint32_
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 @@ static uint32_t init( uint32_t width, uint32_t height, uint32_t d_width, uint32_
mGC=XCreateGC( mDisplay,mWindow,GCForeground,&wGCV );
XMapWindow( mDisplay,mWindow );
-
+
set_window();
mga_vid_config.src_width=width;
diff --git a/libvo/vo_xv.c b/libvo/vo_xv.c
index 3e184036bb..5524a7bfc8 100644
--- a/libvo/vo_xv.c
+++ b/libvo/vo_xv.c
@@ -1,16 +1,12 @@
-#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>
+ * Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
*
* Xv image suuport by Gerd Knorr <kraxel@goldbach.in-berlin.de>
*/
@@ -29,16 +25,15 @@ LIBVO_EXTERN(xv)
#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 XWindowAttributes attribs;
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_width;
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);
-
- if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24;
- printf("X11 Display color depth = %d\n",depth);
- return depth;
-}
+static Window mRoot;
+static uint32_t drwX,drwY,drwWidth,drwHeight,drwBorderWidth,drwDepth;
+static uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen;
-/* 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;
-
- XGCValues xgcv;
- Colormap theCmap;
- XSetWindowAttributes xswa;
- unsigned long xswamask;
-
- image_height = height;
- image_width = width;
- image_format=format;
+ int screen;
+ char *hello = (title == NULL) ? "Xv render" : title;
+ char *name = ":0.0";
+ XSizeHints hint;
+ XVisualInfo vinfo;
+ XEvent xev;
+
+ XGCValues xgcv;
+ XSetWindowAttributes xswa;
+ unsigned long xswamask;
+
+ image_height = height;
+ image_width = width;
+ image_format=format;
+
+ mFullscreen=fullscreen;
+ dwidth=d_width; dheight=d_height;
+
+ if(getenv("DISPLAY")) name = getenv("DISPLAY");
+
+ mydisplay = XOpenDisplay(name);
+
+ if (mydisplay == NULL)
+ {
+ fprintf(stderr,"Can't open display\n");
+ return -1;
+ }
+
+ screen = DefaultScreen(mydisplay);
+
+ 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);
+
+ xswa.background_pixel = 0;
+ xswa.border_pixel = 0;
+ xswamask = CWBackPixel | CWBorderPixel;
+
+ 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);
+
+ 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");
+
+ if (fo[i].id == format)
+ {
+ xv_format = fo[i].id;
+ }
+ }
+ if (!xv_format) xv_port = 0;
+ }
- if(getenv("DISPLAY"))
- name = getenv("DISPLAY");
-
- mydisplay = XOpenDisplay(name);
-
- if (mydisplay == NULL)
- {
- fprintf(stderr,"Can't open display\n");
- return -1;
- }
-
- screen = DefaultScreen(mydisplay);
-
- hint.x = 0;
- hint.y = 0;
- hint.width = image_width;
- hint.height = image_height;
- hint.flags = PPosition | PSize;
-
- /* Get some colors */
-
-// 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;
-
- 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);
-
- theCmap = XCreateColormap(mydisplay, RootWindow(mydisplay,screen),
- vinfo.visual, AllocNone);
-
- 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, 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. */
-
- 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");
-
- 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);
-
- /* 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);
-
- return 0;
- }
- }
-
- printf("Sorry, Xv not supported by this X11 version/driver\n");
- printf("******** Try with -vo x11 or -vo sdl *********\n");
- return 1;
+ 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 );
+
+ 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;
+ }
+ }
+ 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);
-
- /* so we can do grayscale while testing... */
- memset(xvimage[foo]->data,128,xvimage[foo]->data_size);
-
- return;
+ /*
+ * 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);
+ 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;
-
- 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;
+ 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 * 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;
-}
-
-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;
+ }
+ 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;
+
+ return 0;
}
-static void
-uninit(void)
+static uint32_t query_format(uint32_t format)
{
+ switch(format)
+ {
+ case IMGFMT_YV12:
+ case IMGFMT_YUY2: return 1;
+ }
+ return 0;
}
+static void uninit(void) { }
+