diff options
-rw-r--r-- | client/player.cc | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/client/player.cc b/client/player.cc index 9a02152..c891941 100644 --- a/client/player.cc +++ b/client/player.cc @@ -29,6 +29,18 @@ #include "info.h" #include <QX11Info> +#define DV_FOURCC_YV12 0x32315659 /* 4:2:0 Planar mode: Y + V + U (3 planes) */ +#define DV_FOURCC_YUY2 0x32595559 /* 4:2:2 Packed mode: Y0+U0+Y1+V0 (1 plane) */ + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xatom.h> +#include <X11/extensions/Xv.h> +#include <X11/extensions/Xvlib.h> +#include <X11/extensions/XShm.h> +#include <sys/ipc.h> +#include <sys/shm.h> + Player::Player(VideoWidget *v) { video = v; @@ -109,6 +121,8 @@ Player::Player(VideoWidget *v) if(port == 0) { MIaV::info->error("Unable to find suitable port."); return; + } else { + MIaV::info->info("Using port %d.", port); } } @@ -117,9 +131,41 @@ Player::~Player() //XCloseDisplay(dpy); // Close the Display } +extern XvImage *XvShmCreateImage(Display*, XvPortID, int, char*, int, int, XShmSegmentInfo*); void Player::run() { - XvPutStill(display, port, drawable, gc, 0, 0, 320, 200, 0, 0, 320, 200); + XShmSegmentInfo yuv_shminfo; + yuv_shminfo.shmid = shmget(IPC_PRIVATE, + 720*576*4, //yuv_image->data_size, + IPC_CREAT | 0777); + // yuv_shminfo.shmaddr = shmat(yuv_shminfo.shmid, 0, 0); + yuv_shminfo.readOnly = False; + + char pixels[720*576*4][4]; + XvImage* xv_image = XvShmCreateImage(display, port, + DV_FOURCC_YUY2, // DV_FOURCC_YV12 + pixels[0], + 720, 576,// dv_dpy->width, dv_dpy->height, + &yuv_shminfo); + int swidth = 720; + int sheight = 576; + int lxoff = 0; + int lyoff = 0; + int lwidth = swidth; + int lheight = sheight; + + XvShmPutImage(display, port, + drawable, gc, + xv_image, + 0, 0, + swidth, sheight, + lxoff, lyoff, + lwidth, lheight, + True); + + XFlush(display); + + // XvPutStill(display, port, drawable, gc, 0, 0, 320, 200, 0, 0, 320, 200); } |