diff options
| author | deva <deva> | 2006-04-07 09:32:08 +0000 | 
|---|---|---|
| committer | deva <deva> | 2006-04-07 09:32:08 +0000 | 
| commit | a348f1d6d6c35800399b47a7d06562d52c38f72e (patch) | |
| tree | 033d835879bcd899106ca03b3fb6cd7535fc2582 /client | |
| parent | 8baafaa4593033e1b95dfd985911e1f87c9f8eb7 (diff) | |
*** empty log message ***
Diffstat (limited to 'client')
| -rw-r--r-- | client/xvaccelrenderer.cc | 324 | ||||
| -rw-r--r-- | client/xvaccelrenderer.h | 14 | 
2 files changed, 338 insertions, 0 deletions
| diff --git a/client/xvaccelrenderer.cc b/client/xvaccelrenderer.cc new file mode 100644 index 0000000..b0e54db --- /dev/null +++ b/client/xvaccelrenderer.cc @@ -0,0 +1,324 @@ +/***************************************************************************
 +                          gui_xv.cpp  -  description
 +                             -------------------
 +
 +	This part is strongly derivated from xine/mplayer/mpeg2dec
 +
 +    begin                : Tue Jan 1 2002
 +    copyright            : (C) 2002 by mean
 +    email                : fixounet@free.fr
 + ***************************************************************************/
 +
 +/***************************************************************************
 + *                                                                         *
 + *   This program is free software; you can redistribute it and/or modify  *
 + *   it under the terms of the GNU General Public License as published by  *
 + *   the Free Software Foundation; either version 2 of the License, or     *
 + *   (at your option) any later version.                                   *
 + *                                                                         *
 + ***************************************************************************/
 +#include <stdio.h>
 +#include <stdlib.h>
 +#include <string.h>
 +
 +#include "types.h"
 +#include <QX11Info>
 +
 +#define USE_XV
 +#define VERBOSE_XV
 +
 +#ifdef USE_XV
 +#include <X11/Xlib.h>
 +#include <X11/Xutil.h>
 +#include <sys/ipc.h>
 +#include <sys/shm.h>
 +#include <X11/extensions/XShm.h>
 +#include <X11/extensions/Xvlib.h>
 +#include <X11/extensions/XShm.h>
 +#include <errno.h>
 +
 +#include "xvaccelrenderer.h"
 +
 +static uint8_t 	GUI_XvList(Display *dis, uint32_t port, uint32_t * fmt);
 +static uint8_t 	GUI_XvInit(QWidget *window, uint32_t w, uint32_t h);
 +static void 	  GUI_XvEnd();
 +static uint8_t 	GUI_XvDisplay(uint8_t * src, uint32_t w, uint32_t h);
 +//static uint8_t 	GUI_XvSync(void);
 +
 +
 +//________________Wrapper around Xv_______________
 +XvAccelRender::XvAccelRender( void ) 
 +{
 +}
 +
 +uint8_t XvAccelRender::init(QWidget *window, uint32_t w, uint32_t h)
 +{
 +	printf("Xv start\n");
 +	return  GUI_XvInit(window, w, h);
 +}
 +
 +uint8_t XvAccelRender::end(void)
 +{
 +	GUI_XvEnd( );
 +	printf("Xv end\n");
 +	return 1;
 +}
 +
 +uint8_t XvAccelRender::display(uint8_t *ptr, uint32_t w, uint32_t h)
 +{
 +	return GUI_XvDisplay(ptr, w, h);
 +}
 +//________________Wrapper around Xv_______________
 +
 +static unsigned int xv_port;
 +static uint32_t xv_format;
 +static Display *xv_display;
 +static XvImage *xvimage = NULL;
 +static GC xv_gc;
 +static XGCValues xv_xgc;
 +static Window xv_win;
 +static XShmSegmentInfo Shminfo;
 +
 +//static uint8_t GUI_XvExpose( void );
 +//
 +//	Free all ressources allocated by xv
 +//
 +
 +
 +void GUI_XvEnd( void )
 +{
 +	ADM_assert(xv_port);
 + 	ADM_assert(xv_display);
 +
 +
 +	printf("\n Releasing Xv Port\n");
 +	XLockDisplay (xv_display);
 +	if(XvUngrabPort(xv_display,xv_port,0)!=Success)
 +		printf("\n Trouble releasing port...\n");
 +	XUnlockDisplay (xv_display);
 +
 +
 +	xvimage=NULL;
 +	xv_display=NULL;
 +	xv_port=0;
 +
 +}
 +
 +//------------------------------------
 +uint8_t GUI_XvDisplay(uint8_t * src, uint32_t w, uint32_t h)
 +{
 +
 +	if (xvimage)
 +		{
 +
 +			// put image in shared segment
 +
 +			// for YV12, 4 bits for Y 4 bits for u, 4 bits for v
 +			// total 1.5*
 +			memcpy(xvimage->data, src, (w*h*3)>>1);
 +			XLockDisplay (xv_display);
 +			// And display it !
 +#if 1
 +			XvShmPutImage(xv_display, xv_port, xv_win, xv_gc, xvimage, 0, 0, w, h,	// src
 +										0, 0, w, h,	// dst
 +										False);
 +#else
 +			XvPutImage(xv_display, xv_port, xv_win, xv_gc, xvimage, 0, 0, w, h,	// src
 +								 0, 0, w, h	// dst
 +								 );
 +
 +#endif
 +			//XSetForeground (xv_display, xv_gc, 0);
 +
 +			XSync(xv_display, False);
 +			XUnlockDisplay (xv_display);
 +			//GUI_XvExpose();
 +
 +		}
 +	return 1;
 +
 +}
 +uint8_t GUI_XvSync(void)
 +{
 +	if(xv_display)
 +		XSync(xv_display, False);
 +	return 1;		
 +}
 +//------------------------------------
 +//
 +//------------------------------------
 +uint8_t GUI_XvInit(QWidget * window, uint32_t w, uint32_t h)
 +{
 +	unsigned int ver, rel, req, ev, err;
 +	unsigned int port, adaptors;
 +	static XvAdaptorInfo *ai;
 +	static XvAdaptorInfo *curai;
 +   
 +
 +	//    win = gtk_widget_get_parent_window(window);
 +	xv_display = window->x11Info().display();//GDK_WINDOW_XDISPLAY(win);
 +	//      xv_win= RootWindow(xv_display,0);
 +	xv_win = window->winId();//GDK_WINDOW_XWINDOW(GTK_WIDGET(window)->window);
 +#define WDN xv_display
 +	xv_port = 0;
 +
 +	if (Success != XvQueryExtension(WDN, &ver, &rel, &req, &ev, &err))
 +		{
 +			printf("\n Query Extension failed\n");
 +			goto failed;
 +		}
 +	/* check for Xvideo support */
 +	if (Success != XvQueryAdaptors(WDN,
 +																 DefaultRootWindow(WDN), &adaptors, &ai))
 +		{
 +			printf("\n Query Adaptor failed\n");
 +			goto failed;
 +		}
 +	curai = ai;
 +	XvFormat *formats;
 +	// Dump infos
 +	port = 0;
 +	for (uint16_t i = 0; (!port) && (i < adaptors); i++)
 +		{
 +			/*
 +				XvPortID base_id;
 +				unsigned long num_ports;
 +				char type;
 +				char *name;
 +				unsigned long num_formats;
 +				XvFormat *formats;
 +				unsigned long num_adaptors;
 +			*/
 +#ifdef VERBOSE_XV
 +			printf("\n_______________________________\n");
 +			printf("\n Adaptator	: %d", i);
 +			printf("\n Base ID		: %ld", curai->base_id);
 +			printf("\n Nb Port	 	: %lu", curai->num_ports);
 +			printf("\n Type			 	: %d,",
 +						 curai->type);
 +#define CHECK(x) if(curai->type & x) printf("|"#x);
 +			CHECK(XvInputMask);
 +			CHECK(XvOutputMask);
 +			CHECK(XvVideoMask);
 +			CHECK(XvStillMask);
 +			CHECK(XvImageMask);
 +
 +			printf("\n Name			 	: %s",
 +						 curai->name);
 +			printf("\n Num Adap	 	: %lu", curai->num_adaptors);
 +			printf("\n Num fmt	 	: %lu", curai->num_formats);
 +#endif	  
 +			formats = curai->formats;
 +
 +			//
 +			uint16_t k;
 +
 +			for (k = 0; (k < curai->num_ports) && !port; k++)
 +				{
 +					if (GUI_XvList(WDN, k + curai->base_id, &xv_format))
 +						port = k + curai->base_id;
 +				}
 +
 +
 +			curai++;
 +		}
 +	//
 +	if (!port)
 +		{
 +			printf("\n no port found");
 +			goto failed;
 +		}
 +#ifdef 	COLORSPACE_YV12
 +	printf("\n Xv YV12 found at port :%d, format : %ld", port, xv_format);
 +#else
 +	printf("\n Xv YUY2 found at port :%d, format : %ld", port, xv_format);
 +#endif
 +
 +	if (Success != XvGrabPort(WDN, port, 0))
 +		goto failed;
 +	{
 +	
 +		xv_port = port;
 +		/*
 +			Display *display,
 +			XvPortID port,
 +			int id,
 +			char* data,
 +			int width,
 +			int height,
 +			XShmSegmentInfo *shminfo
 +
 +		*/
 +		xvimage = XvShmCreateImage(WDN, xv_port,
 +															 xv_format, 0, w, h, &Shminfo);
 +
 +		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(WDN, &Shminfo);
 +		XSync(WDN, False);
 +		shmctl(Shminfo.shmid, IPC_RMID, 0);
 +		memset(xvimage->data, 0, xvimage->data_size);
 +
 +		xv_xgc.graphics_exposures = False;
 +
 +		xv_gc = XCreateGC(xv_display, xv_win, 0L, &xv_xgc);
 +	
 +		//ADM_assert(BadWindow!=XSelectInput(xv_display, xv_win, ExposureMask | VisibilityChangeMask));
 +
 +	}
 +	printf("\n Xv init succeedeed\n");
 +
 +	return 1;
 + failed:
 +	printf("\n Xv init failed..\n");
 +	return 0;
 +}
 +
 +// _________________________________________________
 +//
 +// _________________________________________________
 +uint8_t GUI_XvList(Display * dis, uint32_t port, uint32_t * fmt)
 +{
 +	XvImageFormatValues *formatValues;
 +	int imgfmt;
 +	int k, f = 0;
 +
 +	formatValues = XvListImageFormats(dis, port, &imgfmt);
 +	if (formatValues)
 +		for (k = 0; !f || (k < imgfmt); k++)
 +			{
 +#ifdef VERVOSE_XV
 +	      printf("\n %lx %d --> %s", port, formatValues[k].id,
 +							 formatValues[k].guid);
 +#endif
 +#ifdef 	COLORSPACE_YV12
 +	      if (!strcmp(formatValues[k].guid, "YV12"))
 +#else
 +					if (!strcmp(formatValues[k].guid, "YUY2"))
 +#endif
 +						{
 +							f = 1;
 +							*fmt = formatValues[k].id;
 +						}
 +			} else
 +				f = 0;
 +	XFree(formatValues);
 +	return f;
 +}
 +void GUI_XvBuildAtom(Display * dis, Atom * atom, char *string)
 +{
 +	dis = dis;
 +	atom = atom;
 +	string = string;
 +}
 +
 +
 +uint8_t GUI_XvRedraw( void )
 +{
 +	printf("Xv need redraw !\n");
 +	return 0;
 +}
 +#endif
 diff --git a/client/xvaccelrenderer.h b/client/xvaccelrenderer.h new file mode 100644 index 0000000..b6a37f3 --- /dev/null +++ b/client/xvaccelrenderer.h @@ -0,0 +1,14 @@ +/* -*- mode: c++ -*- */
 +#include "types.h"
 +
 +class XvAccelRender//: public AccelRender
 +{
 +public:
 +	XvAccelRender();
 +	uint8_t init(QWidget *window, uint32_t w, uint32_t h);
 +	uint8_t end(void);				
 +	uint8_t display(uint8_t *ptr, uint32_t w, uint32_t h);
 +};
 +
 +
 +
 | 
