From 9c078bc5e1468ed79d85fafbad41160c0170959e Mon Sep 17 00:00:00 2001 From: deva Date: Sat, 8 Apr 2006 11:10:09 +0000 Subject: *** empty log message *** --- client/Makefile.am | 6 +- client/mainwindow.cc | 2 + client/miav_client.cc | 2 +- client/player.cc | 41 ++- client/player.h | 11 +- client/videowidget.cc | 10 +- client/xvaccelrenderer.cc | 635 +++++++++++++++++++++++----------------------- client/xvaccelrenderer.h | 65 ++++- 8 files changed, 422 insertions(+), 350 deletions(-) diff --git a/client/Makefile.am b/client/Makefile.am index b0b3ad8..0767a22 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -23,7 +23,8 @@ miav_client_SOURCES = $(shell ../tools/MocList cc ) \ player.cc \ splashscreen.cc \ videowidget.cc \ - yuv_draw.cc + yuv_draw.cc \ + xvaccelrenderer.cc EXTRA_DIST = \ aboutwindow.h \ @@ -42,7 +43,8 @@ EXTRA_DIST = \ player.h \ splashscreen.h \ videowidget.h \ - yuv_draw.h + yuv_draw.h \ + xvaccelrenderer.h miav_client_LDADD := $(shell ../tools/MocList o ) \ ../lib/libmiav.la \ diff --git a/client/mainwindow.cc b/client/mainwindow.cc index cab6189..c3b8649 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -62,6 +62,8 @@ MainWindow::MainWindow(): QWidget() { MIaV::info->log("Starting MIaV v. %s.", VERSION); + resize(800, 600); + // Create the overlaying splashscreen SplashScreen splash(this); /* diff --git a/client/miav_client.cc b/client/miav_client.cc index 4051b16..ff38f09 100644 --- a/client/miav_client.cc +++ b/client/miav_client.cc @@ -52,7 +52,7 @@ int main(int argc, char *argv[]) NetworkSender sender; decoder.start(); - player.start(); + player.start(500); // 25 frames / second sender.start(); return app.exec(); diff --git a/client/player.cc b/client/player.cc index f44842c..fad7df4 100644 --- a/client/player.cc +++ b/client/player.cc @@ -26,6 +26,45 @@ */ #include "player.h" +static unsigned char yuv[720*576*4]; +static int num = 0; + +Player::Player(VideoWidget *w) +{ + widget = w; + + render.init(widget, 720, 576);//widget->getWidth(), widget->getHeight() + + connect(this, SIGNAL(timeout()), this, SLOT(show_frame())); + + for(int x = 1; x < 720; x++) + for(int y = 1; y < 576; y++) { + yuv[x + y * 576 * 1] = x % 720 * 255; + yuv[x + y * 576 * 2] = y % 576 * 255; + yuv[x + y * 576 * 3] = (unsigned char)x % y; + } +} + +Player::~Player() +{ + render.end(); +} + +void Player::show_frame() +{ + fprintf(stderr, "Frame!%d\n", num++); + render.width = widget->getWidth(); + render.height = widget->getHeight(); + render.display(yuv, 720, 576);//widget->width(), widget->height()); +} + + + + + + +#if 0 + #define DBG(x) fprintf(stderr, x) #include "info.h" @@ -284,7 +323,7 @@ void Player::run() // From: // http://cvs.sourceforge.net/viewcvs.py/libmpeg2/MSSG/display_x11.c?rev=1.2 -#if 0 +//#if 0 #ifdef HAVE_XV xv_port = 0; if (Success == XvQueryExtension(mydisplay,&ver,&rel,&req,&ev,&err)) { diff --git a/client/player.h b/client/player.h index 24920a5..59e1f70 100644 --- a/client/player.h +++ b/client/player.h @@ -27,23 +27,28 @@ #ifndef __MIAV_PLAYER_H__ #define __MIAV_PLAYER_H__ -#include +#include #include "videowidget.h" #include #include -class Player : public QThread +#include "xvaccelrenderer.h" + +class Player : public QTimer { +Q_OBJECT public: Player(VideoWidget *widget); ~Player(); - void run(); +public slots: + void show_frame(); private: VideoWidget *widget; + XvAccelRender render; Display *display; Drawable drawable; diff --git a/client/videowidget.cc b/client/videowidget.cc index a007df8..edabf71 100644 --- a/client/videowidget.cc +++ b/client/videowidget.cc @@ -38,9 +38,9 @@ VideoWidget::VideoWidget() : QWidget() // setenv("SDL_WINDOWID", ids.setNum(winId()).toStdString().c_str(), 1); // Make it visible - QPalette palette; - palette.setColor(backgroundRole(), Qt::blue); - setPalette(palette); + // QPalette palette; + // palette.setColor(backgroundRole(), Qt::blue); + // setPalette(palette); // setLineWidth(10); // setFrameStyle(QFrame::Raised); @@ -107,7 +107,7 @@ int VideoWidget::getWidth() { int val; mutex.lock(); - val = mysize.width(); + val = mysize.width();//>720?720:mysize.width(); mutex.unlock(); return val; } @@ -116,7 +116,7 @@ int VideoWidget::getHeight() { int val; mutex.lock(); - val = mysize.height(); + val = mysize.height();//>576?576:mysize.height(); mutex.unlock(); return val; } diff --git a/client/xvaccelrenderer.cc b/client/xvaccelrenderer.cc index b0e54db..188574e 100644 --- a/client/xvaccelrenderer.cc +++ b/client/xvaccelrenderer.cc @@ -1,324 +1,311 @@ -/*************************************************************************** - 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 -#include -#include - -#include "types.h" -#include - -#define USE_XV -#define VERBOSE_XV - -#ifdef USE_XV -#include -#include -#include -#include -#include -#include -#include -#include - -#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 +/*************************************************************************** + 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 "xvaccelrenderer.h" + +#include +#include +#include + +#include + +// Use this define for verbose output +#define VERBOSE_XV + +// Use this define for YV12 colorspace, default is YUY2 +//#define COLORSPACE_YV12 + + + +//static uint8_t GUI_XvSync(void); + + +//________________Wrapper around Xv_______________ +XvAccelRender::XvAccelRender( void ) +{ + xvimage = NULL; +} + +uint8_t XvAccelRender::init(QWidget *window, uint32_t w, uint32_t h) +{ +#ifdef VERBOSE_XV + printf("Xv start\n"); +#endif + width = w; + height = h; + return GUI_XvInit(window, w, h); +} + +uint8_t XvAccelRender::end(void) +{ + GUI_XvEnd( ); +#ifdef VERBOSE_XV + printf("Xv end\n"); +#endif + 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 uint8_t GUI_XvExpose( void ); +// +// Free all ressources allocated by xv +// + + +void XvAccelRender::GUI_XvEnd( void ) +{ + ADM_assert(xv_port); + ADM_assert(xv_display); + + +#ifdef VERBOSE_XV + printf("\n Releasing Xv Port\n"); +#endif + 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 XvAccelRender::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 / 4, h / 4, // dst + 0, 0, width, height, // dst + False); +#else + XvPutImage(xv_display, xv_port, xv_win, xv_gc, xvimage, + 0, 0, w, h, // src + 0, 0, w / 3, h / 3 // dst + ); + +#endif + //XSetForeground (xv_display, xv_gc, 0); + + XSync(xv_display, False); + XUnlockDisplay (xv_display); + //GUI_XvExpose(); + + } + return 1; + +} +/* +uint8_t XvAccelRender::GUI_XvSync(void) +{ + if(xv_display) + XSync(xv_display, False); + return 1; +} +*/ +//------------------------------------ +// +//------------------------------------ +uint8_t XvAccelRender::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 +#ifdef VERBOSE_XV + printf("\n Xv YV12 found at port :%d, format : %ld", port, xv_format); +#endif +#else +#ifdef VERBOSE_XV + printf("\n Xv YUY2 found at port :%d, format : %ld", port, xv_format); +#endif +#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)); + + } +#ifdef VERBOSE_XV + printf("\n Xv init succeedeed\n"); +#endif + return 1; + failed: + printf("\n Xv init failed..\n"); + return 0; +} + +// _________________________________________________ +// +// _________________________________________________ +uint8_t XvAccelRender::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; +} diff --git a/client/xvaccelrenderer.h b/client/xvaccelrenderer.h index b6a37f3..588516f 100644 --- a/client/xvaccelrenderer.h +++ b/client/xvaccelrenderer.h @@ -1,14 +1,51 @@ -/* -*- 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); -}; - - - +/* -*- mode: c++ -*- */ +#ifndef __XVACCELRENDERER_H__ +#define __XVACCELRENDERER_H__ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +//typedef unsigned long int QWidget; +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned long int uint32_t; + +#define ADM_assert(x) assert(x) + +class XvAccelRender +{ +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); + + unsigned int width, height; + +private: + unsigned int xv_port; + uint32_t xv_format; + Display *xv_display; + XvImage *xvimage; + GC xv_gc; + XGCValues xv_xgc; + Window xv_win; + XShmSegmentInfo Shminfo; + + uint8_t GUI_XvList(Display *dis, uint32_t port, uint32_t * fmt); + uint8_t GUI_XvInit(QWidget *window, uint32_t w, uint32_t h); + void GUI_XvEnd(); + uint8_t GUI_XvDisplay(uint8_t * src, uint32_t w, uint32_t h); +}; + +#endif/*__XVACCELRENDERER_H__*/ -- cgit v1.2.3