int XWindow::Init (Display* dp, Window rootWindow, GC gc, int x, int y, int windowWidth, int windowHeight, int imageWidth, int imageHeight) { _display = dp; _rootWindow = rootWindow; _imageWidth = imageWidth; _imageHeight = imageHeight; PTRACE(4, "X11\tInitiasing new X11 window with " << windowWidth << "x" << windowHeight << " at " << x << "," << y); XLockDisplay (_display); #if PTRACING DumpVisuals(); #endif if (!CreateAtomsAndWindow(gc, x, y, windowWidth, windowHeight)) { XUnlockDisplay(_display); return 0; } CreateXImage(windowWidth, windowHeight); _isInitialized = true; XUnlockDisplay (_display); // check if that format is supported struct xFormatsentry* xFormat = xFormats; while (xFormat->name) { if (xFormat->depth == _XImage->bits_per_pixel && xFormat->byte_order == _XImage->byte_order && xFormat->red_mask == _XImage->red_mask && xFormat->green_mask == _XImage->green_mask && xFormat->blue_mask == _XImage->blue_mask) break; xFormat++; } PTRACE(4, "X11\tXImage created with format: " << _XImage->bits_per_pixel <<" BPP, " << "Byte order: " << (_XImage->byte_order ? "MSBFirst" : "LSBFirst") << " Native: " << (BO_NATIVE ? "MSBFirst" : "LSBFirst")); PTRACE(4, std::hex << "X11\tMask: Red: 0x" << _XImage->red_mask << " Green: 0x" << _XImage->green_mask << " Blue: 0x" << _XImage->blue_mask << std::dec); if (!xFormat->name) { PTRACE(1, "X11\tX server image format not supported, please contact the developers"); return 0; } snprintf (_colorFormat, sizeof(_colorFormat), "%s", xFormat->name); _outOffset = 0; _planes = xFormat->planes; #ifdef WORDS_BIGENDIAN if (g_strcmp0 (xFormat->name, "BGRA") == 0) { snprintf (_colorFormat, sizeof(_colorFormat), "RGB32"); _outOffset = 1; _planes = 4; } if (g_strcmp0 (xFormat->name, "RGBA") == 0) { snprintf (_colorFormat, sizeof(_colorFormat), "BGR32"); _outOffset = 1; _planes = 4; } #else if (g_strcmp0 (xFormat->name, "ABGR") == 0) { snprintf (_colorFormat, sizeof(_colorFormat), "BGR32"); _outOffset = -1; _planes = 4; } if (g_strcmp0 (xFormat->name, "ARGB") == 0) { snprintf (_colorFormat, sizeof(_colorFormat), "RGB32"); _outOffset = -1; _planes = 4; } #endif PTRACE(4, "X11\tUsing color format: " << _colorFormat); PTRACE(4, "X11\tPlanes: " << _planes); PVideoFrameInfo srcFrameInfo, dstFrameInfo; srcFrameInfo.SetFrameSize(_imageWidth,_imageHeight); dstFrameInfo.SetFrameSize(_imageWidth,_imageHeight); dstFrameInfo.SetColourFormat(_colorFormat); _colorConverter = PColourConverter::Create(srcFrameInfo, dstFrameInfo); if (!_colorConverter) return 0; _frameBuffer = boost::shared_ptr<void> (malloc (_imageWidth * _imageHeight * _planes), free); // detect the window manager type _wmType = GetWMType (); CalculateSize (windowWidth, windowHeight, true); return 1; }
int XVWindow::Init (Display* dp, Window rootWindow, GC gc, int x, int y, int windowWidth, int windowHeight, int imageWidth, int imageHeight) { // local variables needed for creation of window // and initialization of XV extension unsigned int ver = 0; unsigned int rel = 0; unsigned int req = 0; unsigned int ev = 0; unsigned int err = 0; int ret = 0; unsigned int i = 0; _display = dp; _rootWindow = rootWindow; _imageWidth = imageWidth; _imageHeight = imageHeight; PTRACE(4, "XVideo\tInitializing XV window with " << windowWidth << "x" << windowHeight << " at " << x << "," << y); XLockDisplay (_display); // check if SHM XV window is possible ret = XvQueryExtension (_display, &ver, &rel, &req, &ev, &err); PTRACE(4, "XVideo\tXvQueryExtension: Version: " << ver << " Release: " << rel << " Request Base: " << req << " Event Base: " << ev << " Error Base: " << err ); if (Success != ret) { if (ret == XvBadExtension) PTRACE(1, "XVideo\tXvQueryExtension failed - XvBadExtension"); else if (ret == XvBadAlloc) PTRACE(1, "XVideo\tXvQueryExtension failed - XvBadAlloc"); else PTRACE(1, "XVideo\tXQueryExtension failed"); XUnlockDisplay (_display); return 0; } // Find XV port _XVPort = FindXVPort (); if (!_XVPort) { PTRACE(1, "XVideo\tFindXVPort failed"); XUnlockDisplay(_display); return 0; } PTRACE(4, "XVideo\tUsing XVideo port: " << _XVPort); if (!CreateAtomsAndWindow(gc, x, y, windowWidth, windowHeight)) { XUnlockDisplay(_display); return 0; } XV_SYNC_TO_VBLANK = GetXVAtom("XV_SYNC_TO_VBLANK"); XV_COLORKEY = GetXVAtom( "XV_COLORKEY" ); XV_AUTOPAINT_COLORKEY = GetXVAtom( "XV_AUTOPAINT_COLORKEY" ); if ( !InitColorkey() ) { PTRACE(1, "XVideo\tColorkey initialization failed"); XUnlockDisplay(_display); return 0; } if (XV_SYNC_TO_VBLANK != None) if (XvSetPortAttribute(_display, _XVPort, XV_SYNC_TO_VBLANK, 1) == Success) PTRACE(4, "XVideo\tVertical sync successfully activated" ); else PTRACE(4, "XVideo\tFailure when trying to activate vertical sync" ); else PTRACE(4, "XVideo\tVertical sync not supported"); if (!checkMaxSize (imageWidth, imageHeight)) { PTRACE(1, "XVideo\tCheck of image size failed"); XUnlockDisplay(_display); return 0; } #ifdef HAVE_SHM if (XShmQueryExtension (_display)) { _useShm = true; PTRACE(1, "XVideo\tXQueryShmExtension success"); } else { _useShm = false; PTRACE(1, "XVideo\tXQueryShmExtension failed"); } if (_useShm) ShmAttach(imageWidth, imageHeight); if (!_useShm) { #endif for (i = 0; i < NUM_BUFFERS; i++) { _XVImage[i] = (XvImage *) XvCreateImage( _display, _XVPort, GUID_YV12_PLANAR, 0, imageWidth, imageHeight); if (!_XVImage[i]) { PTRACE(1, "XVideo\tUnable to create XVideo Image"); XUnlockDisplay (_display); return 0; } _XVImage[i]->data = (char*) malloc(_XVImage[i]->data_size); } PTRACE(1, "XVideo\tNot using SHM extension"); #ifdef HAVE_SHM } else { PTRACE(1, "XVideo\tUsing SHM extension"); } #endif XSync(_display, False); _isInitialized = true; XUnlockDisplay (_display); // detect the window manager type _wmType = GetWMType (); CalculateSize (windowWidth, windowHeight, true); return 1; }