Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
51e4ed0f
You need to sign in or sign up before continuing.
Commit
51e4ed0f
authored
Apr 10, 2016
by
Mike Gabriel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hw/nxagent/NXxvdisp.c: Shrink file, drop duplicate code that can identically be…
hw/nxagent/NXxvdisp.c: Shrink file, drop duplicate code that can identically be found in Xext/xvdisp.c.
parent
add88193
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
10 additions
and
2079 deletions
+10
-2079
Imakefile
nx-X11/programs/Xserver/Xext/Imakefile
+4
-1
xvdisp.c
nx-X11/programs/Xserver/Xext/xvdisp.c
+4
-0
NXxvdisp.c
nx-X11/programs/Xserver/hw/nxagent/NXxvdisp.c
+2
-2078
No files found.
nx-X11/programs/Xserver/Xext/Imakefile
View file @
51e4ed0f
...
@@ -48,7 +48,10 @@ XF86BIGFOBJS = xf86bigfont.o
...
@@ -48,7 +48,10 @@ XF86BIGFOBJS = xf86bigfont.o
#endif
#endif
#endif
#endif
#if BuildXvExt
#if BuildXvExt && ( (defined(NXAgentServer) && NXAgentServer) && !defined(SunArchitecture) && !defined(cygwinArchitecture) )
XVSRCS = xvmain.c xvmc.c
XVOBJS = xvmain.o xvmc.o
#elif BuildXvExt
XVSRCS = xvmain.c xvdisp.c xvmc.c
XVSRCS = xvmain.c xvdisp.c xvmc.c
XVOBJS = xvmain.o xvdisp.o xvmc.o
XVOBJS = xvmain.o xvdisp.o xvmc.o
#endif
#endif
...
...
nx-X11/programs/Xserver/Xext/xvdisp.c
View file @
51e4ed0f
...
@@ -224,6 +224,8 @@ static int SWriteImageFormatInfo(ClientPtr, xvImageFormatInfo*);
...
@@ -224,6 +224,8 @@ static int SWriteImageFormatInfo(ClientPtr, xvImageFormatInfo*);
**
**
*/
*/
#if !defined(NXAGENT_SERVER) || defined(__sun) || defined(__CYGWIN__)
int
int
ProcXvDispatch
(
ClientPtr
client
)
ProcXvDispatch
(
ClientPtr
client
)
{
{
...
@@ -351,6 +353,8 @@ SProcXvDispatch(ClientPtr client)
...
@@ -351,6 +353,8 @@ SProcXvDispatch(ClientPtr client)
}
}
}
}
}
}
#endif
/* !defined(NXAGENT_SERVER) || defined(__sun) || defined(__CYGWIN__) */
static
int
static
int
ProcXvQueryExtension
(
ClientPtr
client
)
ProcXvQueryExtension
(
ClientPtr
client
)
...
...
nx-X11/programs/Xserver/hw/nxagent/NXxvdisp.c
View file @
51e4ed0f
...
@@ -41,206 +41,15 @@ SOFTWARE.
...
@@ -41,206 +41,15 @@ SOFTWARE.
******************************************************************/
******************************************************************/
/* $XFree86: xc/programs/Xserver/Xext/xvdisp.c,v 1.27 2003/07/16 01:38:31 dawes Exp $ */
/* $XFree86: xc/programs/Xserver/Xext/xvdisp.c,v 1.27 2003/07/16 01:38:31 dawes Exp $ */
/*
** File:
**
** xvdisp.c --- Xv server extension dispatch module.
**
** Author:
**
** David Carver (Digital Workstation Engineering/Project Athena)
**
** Revisions:
**
** 11.06.91 Carver
** - changed SetPortControl to SetPortAttribute
** - changed GetPortControl to GetPortAttribute
** - changed QueryBestSize
**
** 15.05.91 Carver
** - version 2.0 upgrade
**
** 24.01.91 Carver
** - version 1.4 upgrade
**
*/
#if !defined(__sun) && !defined(__CYGWIN__)
#if !defined(__sun) && !defined(__CYGWIN__)
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <nx-X11/X.h>
#include <nx-X11/Xproto.h>
#include "misc.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "pixmapstr.h"
#include "gcstruct.h"
#include "dixstruct.h"
#include "resource.h"
#include "opaque.h"
#include <nx-X11/extensions/Xv.h>
#include <nx-X11/extensions/Xvproto.h>
#include "xvdix.h"
#ifdef MITSHM
#define _XSHM_SERVER_
#include <nx-X11/extensions/shmstr.h>
#endif
#include "Trap.h"
#include "Trap.h"
#include "../../Xext/xvdisp.c"
#undef TEST
#undef TEST
#undef DEBUG
#undef DEBUG
#ifdef EXTMODULE
#include "xf86_ansic.h"
#endif
#include "xvdisp.h"
#ifdef PANORAMIX
#include "panoramiX.h"
#include "panoramiXsrv.h"
unsigned
long
XvXRTPort
;
#ifdef MITSHM
static
int
XineramaXvShmPutImage
(
ClientPtr
);
#endif
static
int
XineramaXvPutImage
(
ClientPtr
);
static
int
XineramaXvPutVideo
(
ClientPtr
);
static
int
XineramaXvPutStill
(
ClientPtr
);
static
int
XineramaXvSetPortAttribute
(
ClientPtr
);
static
int
XineramaXvStopVideo
(
ClientPtr
);
#endif
/* INTERNAL */
static
int
ProcXvQueryExtension
(
ClientPtr
);
static
int
ProcXvQueryAdaptors
(
ClientPtr
);
static
int
ProcXvQueryEncodings
(
ClientPtr
);
static
int
ProcXvPutVideo
(
ClientPtr
);
static
int
ProcXvPutStill
(
ClientPtr
);
static
int
ProcXvGetVideo
(
ClientPtr
);
static
int
ProcXvGetStill
(
ClientPtr
);
static
int
ProcXvGrabPort
(
ClientPtr
);
static
int
ProcXvUngrabPort
(
ClientPtr
);
static
int
ProcXvSelectVideoNotify
(
ClientPtr
);
static
int
ProcXvSelectPortNotify
(
ClientPtr
);
static
int
ProcXvStopVideo
(
ClientPtr
);
static
int
ProcXvSetPortAttribute
(
ClientPtr
);
static
int
ProcXvGetPortAttribute
(
ClientPtr
);
static
int
ProcXvQueryBestSize
(
ClientPtr
);
static
int
ProcXvQueryPortAttributes
(
ClientPtr
);
static
int
ProcXvPutImage
(
ClientPtr
);
#ifdef MITSHM
static
int
ProcXvShmPutImage
(
ClientPtr
);
#endif
static
int
ProcXvQueryImageAttributes
(
ClientPtr
);
static
int
ProcXvListImageFormats
(
ClientPtr
);
static
int
SProcXvQueryExtension
(
ClientPtr
);
static
int
SProcXvQueryAdaptors
(
ClientPtr
);
static
int
SProcXvQueryEncodings
(
ClientPtr
);
static
int
SProcXvPutVideo
(
ClientPtr
);
static
int
SProcXvPutStill
(
ClientPtr
);
static
int
SProcXvGetVideo
(
ClientPtr
);
static
int
SProcXvGetStill
(
ClientPtr
);
static
int
SProcXvGrabPort
(
ClientPtr
);
static
int
SProcXvUngrabPort
(
ClientPtr
);
static
int
SProcXvSelectVideoNotify
(
ClientPtr
);
static
int
SProcXvSelectPortNotify
(
ClientPtr
);
static
int
SProcXvStopVideo
(
ClientPtr
);
static
int
SProcXvSetPortAttribute
(
ClientPtr
);
static
int
SProcXvGetPortAttribute
(
ClientPtr
);
static
int
SProcXvQueryBestSize
(
ClientPtr
);
static
int
SProcXvQueryPortAttributes
(
ClientPtr
);
static
int
SProcXvPutImage
(
ClientPtr
);
#ifdef MITSHM
static
int
SProcXvShmPutImage
(
ClientPtr
);
#endif
static
int
SProcXvQueryImageAttributes
(
ClientPtr
);
static
int
SProcXvListImageFormats
(
ClientPtr
);
static
int
SWriteQueryAdaptorsReply
(
ClientPtr
,
xvQueryAdaptorsReply
*
);
static
int
SWriteQueryExtensionReply
(
ClientPtr
,
xvQueryExtensionReply
*
);
static
int
SWriteQueryEncodingsReply
(
ClientPtr
,
xvQueryEncodingsReply
*
);
static
int
SWriteAdaptorInfo
(
ClientPtr
,
xvAdaptorInfo
*
);
static
int
SWriteEncodingInfo
(
ClientPtr
,
xvEncodingInfo
*
);
static
int
SWriteFormat
(
ClientPtr
,
xvFormat
*
);
static
int
SWriteAttributeInfo
(
ClientPtr
,
xvAttributeInfo
*
);
static
int
SWriteGrabPortReply
(
ClientPtr
,
xvGrabPortReply
*
);
static
int
SWriteGetPortAttributeReply
(
ClientPtr
,
xvGetPortAttributeReply
*
);
static
int
SWriteQueryBestSizeReply
(
ClientPtr
,
xvQueryBestSizeReply
*
);
static
int
SWriteQueryPortAttributesReply
(
ClientPtr
,
xvQueryPortAttributesReply
*
);
static
int
SWriteQueryImageAttributesReply
(
ClientPtr
,
xvQueryImageAttributesReply
*
);
static
int
SWriteListImageFormatsReply
(
ClientPtr
,
xvListImageFormatsReply
*
);
static
int
SWriteImageFormatInfo
(
ClientPtr
,
xvImageFormatInfo
*
);
#define _WriteQueryAdaptorsReply(_c,_d) \
if ((_c)->swapped) SWriteQueryAdaptorsReply(_c, _d); \
else WriteToClient(_c, sz_xvQueryAdaptorsReply, (char*)_d)
#define _WriteQueryExtensionReply(_c,_d) \
if ((_c)->swapped) SWriteQueryExtensionReply(_c, _d); \
else WriteToClient(_c, sz_xvQueryExtensionReply, (char*)_d)
#define _WriteQueryEncodingsReply(_c,_d) \
if ((_c)->swapped) SWriteQueryEncodingsReply(_c, _d); \
else WriteToClient(_c, sz_xvQueryEncodingsReply, (char*)_d)
#define _WriteAdaptorInfo(_c,_d) \
if ((_c)->swapped) SWriteAdaptorInfo(_c, _d); \
else WriteToClient(_c, sz_xvAdaptorInfo, (char*)_d)
#define _WriteAttributeInfo(_c,_d) \
if ((_c)->swapped) SWriteAttributeInfo(_c, _d); \
else WriteToClient(_c, sz_xvAttributeInfo, (char*)_d)
#define _WriteEncodingInfo(_c,_d) \
if ((_c)->swapped) SWriteEncodingInfo(_c, _d); \
else WriteToClient(_c, sz_xvEncodingInfo, (char*)_d)
#define _WriteFormat(_c,_d) \
if ((_c)->swapped) SWriteFormat(_c, _d); \
else WriteToClient(_c, sz_xvFormat, (char*)_d)
#define _WriteGrabPortReply(_c,_d) \
if ((_c)->swapped) SWriteGrabPortReply(_c, _d); \
else WriteToClient(_c, sz_xvGrabPortReply, (char*)_d)
#define _WriteGetPortAttributeReply(_c,_d) \
if ((_c)->swapped) SWriteGetPortAttributeReply(_c, _d); \
else WriteToClient(_c, sz_xvGetPortAttributeReply, (char*)_d)
#define _WriteQueryBestSizeReply(_c,_d) \
if ((_c)->swapped) SWriteQueryBestSizeReply(_c, _d); \
else WriteToClient(_c, sz_xvQueryBestSizeReply,(char*) _d)
#define _WriteQueryPortAttributesReply(_c,_d) \
if ((_c)->swapped) SWriteQueryPortAttributesReply(_c, _d); \
else WriteToClient(_c, sz_xvQueryPortAttributesReply,(char*) _d)
#define _WriteQueryImageAttributesReply(_c,_d) \
if ((_c)->swapped) SWriteQueryImageAttributesReply(_c, _d); \
else WriteToClient(_c, sz_xvQueryImageAttributesReply,(char*) _d)
#define _WriteListImageFormatsReply(_c,_d) \
if ((_c)->swapped) SWriteListImageFormatsReply(_c, _d); \
else WriteToClient(_c, sz_xvListImageFormatsReply,(char*) _d)
#define _WriteImageFormatInfo(_c,_d) \
if ((_c)->swapped) SWriteImageFormatInfo(_c, _d); \
else WriteToClient(_c, sz_xvImageFormatInfo, (char*)_d)
#define _AllocatePort(_i,_p) \
((_p)->id != _i) ? (* (_p)->pAdaptor->ddAllocatePort)(_i,_p,&_p) : Success
/*
/*
** ProcXvDispatch
** ProcXvDispatch
**
**
...
@@ -427,1889 +236,4 @@ SProcXvDispatch(ClientPtr client)
...
@@ -427,1889 +236,4 @@ SProcXvDispatch(ClientPtr client)
return
result
;
return
result
;
}
}
static
int
ProcXvQueryExtension
(
ClientPtr
client
)
{
xvQueryExtensionReply
rep
;
/* REQUEST(xvQueryExtensionReq); */
REQUEST_SIZE_MATCH
(
xvQueryExtensionReq
);
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
version
=
XvVersion
;
rep
.
revision
=
XvRevision
;
_WriteQueryExtensionReply
(
client
,
&
rep
);
return
Success
;
}
static
int
ProcXvQueryAdaptors
(
ClientPtr
client
)
{
xvFormat
format
;
xvAdaptorInfo
ainfo
;
xvQueryAdaptorsReply
rep
;
int
totalSize
;
int
na
;
XvAdaptorPtr
pa
;
int
nf
;
XvFormatPtr
pf
;
WindowPtr
pWin
;
ScreenPtr
pScreen
;
XvScreenPtr
pxvs
;
REQUEST
(
xvQueryAdaptorsReq
);
REQUEST_SIZE_MATCH
(
xvQueryAdaptorsReq
);
if
(
!
(
pWin
=
(
WindowPtr
)
LookupWindow
(
stuff
->
window
,
client
)
))
{
client
->
errorValue
=
stuff
->
window
;
return
(
BadWindow
);
}
pScreen
=
pWin
->
drawable
.
pScreen
;
pxvs
=
(
XvScreenPtr
)
pScreen
->
devPrivates
[
XvScreenIndex
].
ptr
;
if
(
!
pxvs
)
{
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
num_adaptors
=
0
;
rep
.
length
=
0
;
_WriteQueryAdaptorsReply
(
client
,
&
rep
);
return
Success
;
}
(
*
pxvs
->
ddQueryAdaptors
)(
pScreen
,
&
pxvs
->
pAdaptors
,
&
pxvs
->
nAdaptors
);
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
num_adaptors
=
pxvs
->
nAdaptors
;
/* CALCULATE THE TOTAL SIZE OF THE REPLY IN BYTES */
totalSize
=
pxvs
->
nAdaptors
*
sz_xvAdaptorInfo
;
/* FOR EACH ADPATOR ADD UP THE BYTES FOR ENCODINGS AND FORMATS */
na
=
pxvs
->
nAdaptors
;
pa
=
pxvs
->
pAdaptors
;
while
(
na
--
)
{
totalSize
+=
(
strlen
(
pa
->
name
)
+
3
)
&
~
3
;
totalSize
+=
pa
->
nFormats
*
sz_xvFormat
;
pa
++
;
}
rep
.
length
=
totalSize
>>
2
;
_WriteQueryAdaptorsReply
(
client
,
&
rep
);
na
=
pxvs
->
nAdaptors
;
pa
=
pxvs
->
pAdaptors
;
while
(
na
--
)
{
ainfo
.
base_id
=
pa
->
base_id
;
ainfo
.
num_ports
=
pa
->
nPorts
;
ainfo
.
type
=
pa
->
type
;
ainfo
.
name_size
=
strlen
(
pa
->
name
);
ainfo
.
num_formats
=
pa
->
nFormats
;
_WriteAdaptorInfo
(
client
,
&
ainfo
);
WriteToClient
(
client
,
ainfo
.
name_size
,
pa
->
name
);
nf
=
pa
->
nFormats
;
pf
=
pa
->
pFormats
;
while
(
nf
--
)
{
format
.
depth
=
pf
->
depth
;
format
.
visual
=
pf
->
visual
;
_WriteFormat
(
client
,
&
format
);
pf
++
;
}
pa
++
;
}
return
(
client
->
noClientException
);
}
static
int
ProcXvQueryEncodings
(
ClientPtr
client
)
{
xvEncodingInfo
einfo
;
xvQueryEncodingsReply
rep
;
int
totalSize
;
XvPortPtr
pPort
;
int
ne
;
XvEncodingPtr
pe
;
int
status
;
REQUEST
(
xvQueryEncodingsReq
);
REQUEST_SIZE_MATCH
(
xvQueryEncodingsReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
num_encodings
=
pPort
->
pAdaptor
->
nEncodings
;
/* FOR EACH ENCODING ADD UP THE BYTES FOR ENCODING NAMES */
ne
=
pPort
->
pAdaptor
->
nEncodings
;
pe
=
pPort
->
pAdaptor
->
pEncodings
;
totalSize
=
ne
*
sz_xvEncodingInfo
;
while
(
ne
--
)
{
totalSize
+=
(
strlen
(
pe
->
name
)
+
3
)
&
~
3
;
pe
++
;
}
rep
.
length
=
totalSize
>>
2
;
_WriteQueryEncodingsReply
(
client
,
&
rep
);
ne
=
pPort
->
pAdaptor
->
nEncodings
;
pe
=
pPort
->
pAdaptor
->
pEncodings
;
while
(
ne
--
)
{
einfo
.
encoding
=
pe
->
id
;
einfo
.
name_size
=
strlen
(
pe
->
name
);
einfo
.
width
=
pe
->
width
;
einfo
.
height
=
pe
->
height
;
einfo
.
rate
.
numerator
=
pe
->
rate
.
numerator
;
einfo
.
rate
.
denominator
=
pe
->
rate
.
denominator
;
_WriteEncodingInfo
(
client
,
&
einfo
);
WriteToClient
(
client
,
einfo
.
name_size
,
pe
->
name
);
pe
++
;
}
return
(
client
->
noClientException
);
}
static
int
ProcXvPutVideo
(
ClientPtr
client
)
{
register
DrawablePtr
pDraw
;
XvPortPtr
pPort
;
register
GCPtr
pGC
;
int
status
;
REQUEST
(
xvPutVideoReq
);
REQUEST_SIZE_MATCH
(
xvPutVideoReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
(
pPort
->
pAdaptor
->
type
&
XvInputMask
)
||
!
(
pPort
->
pAdaptor
->
type
&
XvVideoMask
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
BadMatch
);
}
status
=
XVCALL
(
diMatchPort
)(
pPort
,
pDraw
);
if
(
status
!=
Success
)
{
return
status
;
}
return
XVCALL
(
diPutVideo
)(
client
,
pDraw
,
pPort
,
pGC
,
stuff
->
vid_x
,
stuff
->
vid_y
,
stuff
->
vid_w
,
stuff
->
vid_h
,
stuff
->
drw_x
,
stuff
->
drw_y
,
stuff
->
drw_w
,
stuff
->
drw_h
);
}
static
int
ProcXvPutStill
(
ClientPtr
client
)
{
register
DrawablePtr
pDraw
;
XvPortPtr
pPort
;
register
GCPtr
pGC
;
int
status
;
REQUEST
(
xvPutStillReq
);
REQUEST_SIZE_MATCH
(
xvPutStillReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
(
pPort
->
pAdaptor
->
type
&
XvInputMask
)
||
!
(
pPort
->
pAdaptor
->
type
&
XvStillMask
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
BadMatch
);
}
status
=
XVCALL
(
diMatchPort
)(
pPort
,
pDraw
);
if
(
status
!=
Success
)
{
return
status
;
}
return
XVCALL
(
diPutStill
)(
client
,
pDraw
,
pPort
,
pGC
,
stuff
->
vid_x
,
stuff
->
vid_y
,
stuff
->
vid_w
,
stuff
->
vid_h
,
stuff
->
drw_x
,
stuff
->
drw_y
,
stuff
->
drw_w
,
stuff
->
drw_h
);
}
static
int
ProcXvGetVideo
(
ClientPtr
client
)
{
register
DrawablePtr
pDraw
;
XvPortPtr
pPort
;
register
GCPtr
pGC
;
int
status
;
REQUEST
(
xvGetVideoReq
);
REQUEST_SIZE_MATCH
(
xvGetVideoReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
(
pPort
->
pAdaptor
->
type
&
XvOutputMask
)
||
!
(
pPort
->
pAdaptor
->
type
&
XvVideoMask
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
BadMatch
);
}
status
=
XVCALL
(
diMatchPort
)(
pPort
,
pDraw
);
if
(
status
!=
Success
)
{
return
status
;
}
return
XVCALL
(
diGetVideo
)(
client
,
pDraw
,
pPort
,
pGC
,
stuff
->
vid_x
,
stuff
->
vid_y
,
stuff
->
vid_w
,
stuff
->
vid_h
,
stuff
->
drw_x
,
stuff
->
drw_y
,
stuff
->
drw_w
,
stuff
->
drw_h
);
}
static
int
ProcXvGetStill
(
ClientPtr
client
)
{
register
DrawablePtr
pDraw
;
XvPortPtr
pPort
;
register
GCPtr
pGC
;
int
status
;
REQUEST
(
xvGetStillReq
);
REQUEST_SIZE_MATCH
(
xvGetStillReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
(
pPort
->
pAdaptor
->
type
&
XvOutputMask
)
||
!
(
pPort
->
pAdaptor
->
type
&
XvStillMask
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
BadMatch
);
}
status
=
XVCALL
(
diMatchPort
)(
pPort
,
pDraw
);
if
(
status
!=
Success
)
{
return
status
;
}
return
XVCALL
(
diGetStill
)(
client
,
pDraw
,
pPort
,
pGC
,
stuff
->
vid_x
,
stuff
->
vid_y
,
stuff
->
vid_w
,
stuff
->
vid_h
,
stuff
->
drw_x
,
stuff
->
drw_y
,
stuff
->
drw_w
,
stuff
->
drw_h
);
}
static
int
ProcXvSelectVideoNotify
(
ClientPtr
client
)
{
register
DrawablePtr
pDraw
;
REQUEST
(
xvSelectVideoNotifyReq
);
REQUEST_SIZE_MATCH
(
xvSelectVideoNotifyReq
);
if
(
!
(
pDraw
=
(
DrawablePtr
)
LOOKUP_DRAWABLE
(
stuff
->
drawable
,
client
)
))
{
client
->
errorValue
=
stuff
->
drawable
;
return
(
BadWindow
);
}
return
XVCALL
(
diSelectVideoNotify
)(
client
,
pDraw
,
stuff
->
onoff
);
}
static
int
ProcXvSelectPortNotify
(
ClientPtr
client
)
{
int
status
;
XvPortPtr
pPort
;
REQUEST
(
xvSelectPortNotifyReq
);
REQUEST_SIZE_MATCH
(
xvSelectPortNotifyReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
return
XVCALL
(
diSelectPortNotify
)(
client
,
pPort
,
stuff
->
onoff
);
}
static
int
ProcXvGrabPort
(
ClientPtr
client
)
{
int
result
,
status
;
XvPortPtr
pPort
;
xvGrabPortReply
rep
;
REQUEST
(
xvGrabPortReq
);
REQUEST_SIZE_MATCH
(
xvGrabPortReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
status
=
XVCALL
(
diGrabPort
)(
client
,
pPort
,
stuff
->
time
,
&
result
);
if
(
status
!=
Success
)
{
return
status
;
}
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
result
=
result
;
_WriteGrabPortReply
(
client
,
&
rep
);
return
Success
;
}
static
int
ProcXvUngrabPort
(
ClientPtr
client
)
{
int
status
;
XvPortPtr
pPort
;
REQUEST
(
xvGrabPortReq
);
REQUEST_SIZE_MATCH
(
xvGrabPortReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
return
XVCALL
(
diUngrabPort
)(
client
,
pPort
,
stuff
->
time
);
}
static
int
ProcXvStopVideo
(
ClientPtr
client
)
{
int
status
;
register
DrawablePtr
pDraw
;
XvPortPtr
pPort
;
REQUEST
(
xvStopVideoReq
);
REQUEST_SIZE_MATCH
(
xvStopVideoReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
(
pDraw
=
LOOKUP_DRAWABLE
(
stuff
->
drawable
,
client
)
))
{
client
->
errorValue
=
stuff
->
drawable
;
return
(
BadDrawable
);
}
return
XVCALL
(
diStopVideo
)(
client
,
pPort
,
pDraw
);
}
static
int
ProcXvSetPortAttribute
(
ClientPtr
client
)
{
int
status
;
XvPortPtr
pPort
;
REQUEST
(
xvSetPortAttributeReq
);
REQUEST_SIZE_MATCH
(
xvSetPortAttributeReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
ValidAtom
(
stuff
->
attribute
))
{
client
->
errorValue
=
stuff
->
attribute
;
return
(
BadAtom
);
}
status
=
XVCALL
(
diSetPortAttribute
)(
client
,
pPort
,
stuff
->
attribute
,
stuff
->
value
);
if
(
status
==
BadMatch
)
client
->
errorValue
=
stuff
->
attribute
;
else
client
->
errorValue
=
stuff
->
value
;
return
status
;
}
static
int
ProcXvGetPortAttribute
(
ClientPtr
client
)
{
INT32
value
;
int
status
;
XvPortPtr
pPort
;
xvGetPortAttributeReply
rep
;
REQUEST
(
xvGetPortAttributeReq
);
REQUEST_SIZE_MATCH
(
xvGetPortAttributeReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
ValidAtom
(
stuff
->
attribute
))
{
client
->
errorValue
=
stuff
->
attribute
;
return
(
BadAtom
);
}
status
=
XVCALL
(
diGetPortAttribute
)(
client
,
pPort
,
stuff
->
attribute
,
&
value
);
if
(
status
!=
Success
)
{
client
->
errorValue
=
stuff
->
attribute
;
return
status
;
}
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
rep
.
value
=
value
;
_WriteGetPortAttributeReply
(
client
,
&
rep
);
return
Success
;
}
static
int
ProcXvQueryBestSize
(
ClientPtr
client
)
{
int
status
;
unsigned
int
actual_width
,
actual_height
;
XvPortPtr
pPort
;
xvQueryBestSizeReply
rep
;
REQUEST
(
xvQueryBestSizeReq
);
REQUEST_SIZE_MATCH
(
xvQueryBestSizeReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
0
;
(
*
pPort
->
pAdaptor
->
ddQueryBestSize
)(
client
,
pPort
,
stuff
->
motion
,
stuff
->
vid_w
,
stuff
->
vid_h
,
stuff
->
drw_w
,
stuff
->
drw_h
,
&
actual_width
,
&
actual_height
);
rep
.
actual_width
=
actual_width
;
rep
.
actual_height
=
actual_height
;
_WriteQueryBestSizeReply
(
client
,
&
rep
);
return
Success
;
}
static
int
ProcXvQueryPortAttributes
(
ClientPtr
client
)
{
int
status
,
size
,
i
;
XvPortPtr
pPort
;
XvAttributePtr
pAtt
;
xvQueryPortAttributesReply
rep
;
xvAttributeInfo
Info
;
REQUEST
(
xvQueryPortAttributesReq
);
REQUEST_SIZE_MATCH
(
xvQueryPortAttributesReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
num_attributes
=
pPort
->
pAdaptor
->
nAttributes
;
rep
.
text_size
=
0
;
for
(
i
=
0
,
pAtt
=
pPort
->
pAdaptor
->
pAttributes
;
i
<
rep
.
num_attributes
;
i
++
,
pAtt
++
)
{
rep
.
text_size
+=
(
strlen
(
pAtt
->
name
)
+
1
+
3
)
&
~
3L
;
}
rep
.
length
=
(
rep
.
num_attributes
*
sz_xvAttributeInfo
)
+
rep
.
text_size
;
rep
.
length
>>=
2
;
_WriteQueryPortAttributesReply
(
client
,
&
rep
);
for
(
i
=
0
,
pAtt
=
pPort
->
pAdaptor
->
pAttributes
;
i
<
rep
.
num_attributes
;
i
++
,
pAtt
++
)
{
size
=
strlen
(
pAtt
->
name
)
+
1
;
/* pass the NULL */
Info
.
flags
=
pAtt
->
flags
;
Info
.
min
=
pAtt
->
min_value
;
Info
.
max
=
pAtt
->
max_value
;
Info
.
size
=
(
size
+
3
)
&
~
3L
;
_WriteAttributeInfo
(
client
,
&
Info
);
WriteToClient
(
client
,
size
,
pAtt
->
name
);
}
return
Success
;
}
static
int
ProcXvPutImage
(
ClientPtr
client
)
{
DrawablePtr
pDraw
;
XvPortPtr
pPort
;
XvImagePtr
pImage
=
NULL
;
GCPtr
pGC
;
int
status
,
i
,
size
;
CARD16
width
,
height
;
REQUEST
(
xvPutImageReq
);
REQUEST_AT_LEAST_SIZE
(
xvPutImageReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
(
pPort
->
pAdaptor
->
type
&
XvImageMask
)
||
!
(
pPort
->
pAdaptor
->
type
&
XvInputMask
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
BadMatch
);
}
status
=
XVCALL
(
diMatchPort
)(
pPort
,
pDraw
);
if
(
status
!=
Success
)
{
return
status
;
}
for
(
i
=
0
;
i
<
pPort
->
pAdaptor
->
nImages
;
i
++
)
{
if
(
pPort
->
pAdaptor
->
pImages
[
i
].
id
==
stuff
->
id
)
{
pImage
=
&
(
pPort
->
pAdaptor
->
pImages
[
i
]);
break
;
}
}
if
(
!
pImage
)
return
BadMatch
;
width
=
stuff
->
width
;
height
=
stuff
->
height
;
size
=
(
*
pPort
->
pAdaptor
->
ddQueryImageAttributes
)(
client
,
pPort
,
pImage
,
&
width
,
&
height
,
NULL
,
NULL
);
size
+=
sizeof
(
xvPutImageReq
);
size
=
(
size
+
3
)
>>
2
;
if
((
width
<
stuff
->
width
)
||
(
height
<
stuff
->
height
))
return
BadValue
;
if
(
client
->
req_len
<
size
)
return
BadLength
;
return
XVCALL
(
diPutImage
)(
client
,
pDraw
,
pPort
,
pGC
,
stuff
->
src_x
,
stuff
->
src_y
,
stuff
->
src_w
,
stuff
->
src_h
,
stuff
->
drw_x
,
stuff
->
drw_y
,
stuff
->
drw_w
,
stuff
->
drw_h
,
pImage
,
(
unsigned
char
*
)(
&
stuff
[
1
]),
FALSE
,
stuff
->
width
,
stuff
->
height
);
}
#ifdef MITSHM
/* redefined here since it's not in any header file */
typedef
struct
_ShmDesc
{
struct
_ShmDesc
*
next
;
int
shmid
;
int
refcnt
;
char
*
addr
;
Bool
writable
;
unsigned
long
size
;
}
ShmDescRec
,
*
ShmDescPtr
;
extern
RESTYPE
ShmSegType
;
extern
int
BadShmSegCode
;
extern
int
ShmCompletionCode
;
static
int
ProcXvShmPutImage
(
ClientPtr
client
)
{
ShmDescPtr
shmdesc
;
DrawablePtr
pDraw
;
XvPortPtr
pPort
;
XvImagePtr
pImage
=
NULL
;
GCPtr
pGC
;
int
status
,
size_needed
,
i
;
CARD16
width
,
height
;
REQUEST
(
xvShmPutImageReq
);
REQUEST_SIZE_MATCH
(
xvShmPutImageReq
);
VALIDATE_DRAWABLE_AND_GC
(
stuff
->
drawable
,
pDraw
,
pGC
,
client
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
if
((
status
=
_AllocatePort
(
stuff
->
port
,
pPort
))
!=
Success
)
{
client
->
errorValue
=
stuff
->
port
;
return
(
status
);
}
if
(
!
(
pPort
->
pAdaptor
->
type
&
XvImageMask
)
||
!
(
pPort
->
pAdaptor
->
type
&
XvInputMask
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
BadMatch
);
}
status
=
XVCALL
(
diMatchPort
)(
pPort
,
pDraw
);
if
(
status
!=
Success
)
{
return
status
;
}
for
(
i
=
0
;
i
<
pPort
->
pAdaptor
->
nImages
;
i
++
)
{
if
(
pPort
->
pAdaptor
->
pImages
[
i
].
id
==
stuff
->
id
)
{
pImage
=
&
(
pPort
->
pAdaptor
->
pImages
[
i
]);
break
;
}
}
if
(
!
pImage
)
return
BadMatch
;
if
(
!
(
shmdesc
=
(
ShmDescPtr
)
LookupIDByType
(
stuff
->
shmseg
,
ShmSegType
)))
{
client
->
errorValue
=
stuff
->
shmseg
;
return
BadShmSegCode
;
}
width
=
stuff
->
width
;
height
=
stuff
->
height
;
size_needed
=
(
*
pPort
->
pAdaptor
->
ddQueryImageAttributes
)(
client
,
pPort
,
pImage
,
&
width
,
&
height
,
NULL
,
NULL
);
if
((
size_needed
+
stuff
->
offset
)
>
shmdesc
->
size
)
return
BadAccess
;
if
((
width
<
stuff
->
width
)
||
(
height
<
stuff
->
height
))
return
BadValue
;
status
=
XVCALL
(
diPutImage
)(
client
,
pDraw
,
pPort
,
pGC
,
stuff
->
src_x
,
stuff
->
src_y
,
stuff
->
src_w
,
stuff
->
src_h
,
stuff
->
drw_x
,
stuff
->
drw_y
,
stuff
->
drw_w
,
stuff
->
drw_h
,
pImage
,
(
unsigned
char
*
)
shmdesc
->
addr
+
stuff
->
offset
,
stuff
->
send_event
,
stuff
->
width
,
stuff
->
height
);
if
((
status
==
Success
)
&&
stuff
->
send_event
)
{
xShmCompletionEvent
ev
;
ev
.
type
=
ShmCompletionCode
;
ev
.
drawable
=
stuff
->
drawable
;
ev
.
sequenceNumber
=
client
->
sequence
;
ev
.
minorEvent
=
xv_ShmPutImage
;
ev
.
majorEvent
=
XvReqCode
;
ev
.
shmseg
=
stuff
->
shmseg
;
ev
.
offset
=
stuff
->
offset
;
WriteEventsToClient
(
client
,
1
,
(
xEvent
*
)
&
ev
);
}
return
status
;
}
#endif
#ifdef XvMCExtension
#include "xvmcext.h"
#endif
static
int
ProcXvQueryImageAttributes
(
ClientPtr
client
)
{
xvQueryImageAttributesReply
rep
;
int
size
,
num_planes
,
i
;
CARD16
width
,
height
;
XvImagePtr
pImage
=
NULL
;
XvPortPtr
pPort
;
int
*
offsets
;
int
*
pitches
;
REQUEST
(
xvQueryImageAttributesReq
);
REQUEST_SIZE_MATCH
(
xvQueryImageAttributesReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
for
(
i
=
0
;
i
<
pPort
->
pAdaptor
->
nImages
;
i
++
)
{
if
(
pPort
->
pAdaptor
->
pImages
[
i
].
id
==
stuff
->
id
)
{
pImage
=
&
(
pPort
->
pAdaptor
->
pImages
[
i
]);
break
;
}
}
#ifdef XvMCExtension
if
(
!
pImage
)
pImage
=
XvMCFindXvImage
(
pPort
,
stuff
->
id
);
#endif
if
(
!
pImage
)
return
BadMatch
;
num_planes
=
pImage
->
num_planes
;
if
(
!
(
offsets
=
xalloc
(
num_planes
<<
3
)))
return
BadAlloc
;
pitches
=
offsets
+
num_planes
;
width
=
stuff
->
width
;
height
=
stuff
->
height
;
size
=
(
*
pPort
->
pAdaptor
->
ddQueryImageAttributes
)(
client
,
pPort
,
pImage
,
&
width
,
&
height
,
offsets
,
pitches
);
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
length
=
num_planes
<<
1
;
rep
.
num_planes
=
num_planes
;
rep
.
width
=
width
;
rep
.
height
=
height
;
rep
.
data_size
=
size
;
_WriteQueryImageAttributesReply
(
client
,
&
rep
);
if
(
client
->
swapped
)
SwapLongs
((
CARD32
*
)
offsets
,
rep
.
length
);
WriteToClient
(
client
,
rep
.
length
<<
2
,
(
char
*
)
offsets
);
xfree
(
offsets
);
return
Success
;
}
static
int
ProcXvListImageFormats
(
ClientPtr
client
)
{
XvPortPtr
pPort
;
XvImagePtr
pImage
;
int
i
;
xvListImageFormatsReply
rep
;
xvImageFormatInfo
info
;
REQUEST
(
xvListImageFormatsReq
);
REQUEST_SIZE_MATCH
(
xvListImageFormatsReq
);
if
(
!
(
pPort
=
LOOKUP_PORT
(
stuff
->
port
,
client
)
))
{
client
->
errorValue
=
stuff
->
port
;
return
(
_XvBadPort
);
}
rep
.
type
=
X_Reply
;
rep
.
sequenceNumber
=
client
->
sequence
;
rep
.
num_formats
=
pPort
->
pAdaptor
->
nImages
;
rep
.
length
=
rep
.
num_formats
*
sz_xvImageFormatInfo
>>
2
;
_WriteListImageFormatsReply
(
client
,
&
rep
);
pImage
=
pPort
->
pAdaptor
->
pImages
;
for
(
i
=
0
;
i
<
rep
.
num_formats
;
i
++
,
pImage
++
)
{
info
.
id
=
pImage
->
id
;
info
.
type
=
pImage
->
type
;
info
.
byte_order
=
pImage
->
byte_order
;
memcpy
(
&
info
.
guid
,
pImage
->
guid
,
16
);
info
.
bpp
=
pImage
->
bits_per_pixel
;
info
.
num_planes
=
pImage
->
num_planes
;
info
.
depth
=
pImage
->
depth
;
info
.
red_mask
=
pImage
->
red_mask
;
info
.
green_mask
=
pImage
->
green_mask
;
info
.
blue_mask
=
pImage
->
blue_mask
;
info
.
format
=
pImage
->
format
;
info
.
y_sample_bits
=
pImage
->
y_sample_bits
;
info
.
u_sample_bits
=
pImage
->
u_sample_bits
;
info
.
v_sample_bits
=
pImage
->
v_sample_bits
;
info
.
horz_y_period
=
pImage
->
horz_y_period
;
info
.
horz_u_period
=
pImage
->
horz_u_period
;
info
.
horz_v_period
=
pImage
->
horz_v_period
;
info
.
vert_y_period
=
pImage
->
vert_y_period
;
info
.
vert_u_period
=
pImage
->
vert_u_period
;
info
.
vert_v_period
=
pImage
->
vert_v_period
;
memcpy
(
&
info
.
comp_order
,
pImage
->
component_order
,
32
);
info
.
scanline_order
=
pImage
->
scanline_order
;
_WriteImageFormatInfo
(
client
,
&
info
);
}
return
Success
;
}
/* Swapped Procs */
static
int
SProcXvQueryExtension
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvQueryExtensionReq
);
REQUEST_SIZE_MATCH
(
xvQueryExtensionReq
);
swaps
(
&
stuff
->
length
,
n
);
return
ProcXvQueryExtension
(
client
);
}
static
int
SProcXvQueryAdaptors
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvQueryAdaptorsReq
);
REQUEST_SIZE_MATCH
(
xvQueryAdaptorsReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
window
,
n
);
return
ProcXvQueryAdaptors
(
client
);
}
static
int
SProcXvQueryEncodings
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvQueryEncodingsReq
);
REQUEST_SIZE_MATCH
(
xvQueryEncodingsReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
return
ProcXvQueryEncodings
(
client
);
}
static
int
SProcXvGrabPort
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvGrabPortReq
);
REQUEST_SIZE_MATCH
(
xvGrabPortReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
time
,
n
);
return
ProcXvGrabPort
(
client
);
}
static
int
SProcXvUngrabPort
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvUngrabPortReq
);
REQUEST_SIZE_MATCH
(
xvUngrabPortReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
time
,
n
);
return
ProcXvUngrabPort
(
client
);
}
static
int
SProcXvPutVideo
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvPutVideoReq
);
REQUEST_SIZE_MATCH
(
xvPutVideoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
gc
,
n
);
swaps
(
&
stuff
->
vid_x
,
n
);
swaps
(
&
stuff
->
vid_y
,
n
);
swaps
(
&
stuff
->
vid_w
,
n
);
swaps
(
&
stuff
->
vid_h
,
n
);
swaps
(
&
stuff
->
drw_x
,
n
);
swaps
(
&
stuff
->
drw_y
,
n
);
swaps
(
&
stuff
->
drw_w
,
n
);
swaps
(
&
stuff
->
drw_h
,
n
);
return
ProcXvPutVideo
(
client
);
}
static
int
SProcXvPutStill
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvPutStillReq
);
REQUEST_SIZE_MATCH
(
xvPutStillReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
gc
,
n
);
swaps
(
&
stuff
->
vid_x
,
n
);
swaps
(
&
stuff
->
vid_y
,
n
);
swaps
(
&
stuff
->
vid_w
,
n
);
swaps
(
&
stuff
->
vid_h
,
n
);
swaps
(
&
stuff
->
drw_x
,
n
);
swaps
(
&
stuff
->
drw_y
,
n
);
swaps
(
&
stuff
->
drw_w
,
n
);
swaps
(
&
stuff
->
drw_h
,
n
);
return
ProcXvPutStill
(
client
);
}
static
int
SProcXvGetVideo
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvGetVideoReq
);
REQUEST_SIZE_MATCH
(
xvGetVideoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
gc
,
n
);
swaps
(
&
stuff
->
vid_x
,
n
);
swaps
(
&
stuff
->
vid_y
,
n
);
swaps
(
&
stuff
->
vid_w
,
n
);
swaps
(
&
stuff
->
vid_h
,
n
);
swaps
(
&
stuff
->
drw_x
,
n
);
swaps
(
&
stuff
->
drw_y
,
n
);
swaps
(
&
stuff
->
drw_w
,
n
);
swaps
(
&
stuff
->
drw_h
,
n
);
return
ProcXvGetVideo
(
client
);
}
static
int
SProcXvGetStill
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvGetStillReq
);
REQUEST_SIZE_MATCH
(
xvGetStillReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
gc
,
n
);
swaps
(
&
stuff
->
vid_x
,
n
);
swaps
(
&
stuff
->
vid_y
,
n
);
swaps
(
&
stuff
->
vid_w
,
n
);
swaps
(
&
stuff
->
vid_h
,
n
);
swaps
(
&
stuff
->
drw_x
,
n
);
swaps
(
&
stuff
->
drw_y
,
n
);
swaps
(
&
stuff
->
drw_w
,
n
);
swaps
(
&
stuff
->
drw_h
,
n
);
return
ProcXvGetStill
(
client
);
}
static
int
SProcXvPutImage
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvPutImageReq
);
REQUEST_AT_LEAST_SIZE
(
xvPutImageReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
gc
,
n
);
swapl
(
&
stuff
->
id
,
n
);
swaps
(
&
stuff
->
src_x
,
n
);
swaps
(
&
stuff
->
src_y
,
n
);
swaps
(
&
stuff
->
src_w
,
n
);
swaps
(
&
stuff
->
src_h
,
n
);
swaps
(
&
stuff
->
drw_x
,
n
);
swaps
(
&
stuff
->
drw_y
,
n
);
swaps
(
&
stuff
->
drw_w
,
n
);
swaps
(
&
stuff
->
drw_h
,
n
);
swaps
(
&
stuff
->
width
,
n
);
swaps
(
&
stuff
->
height
,
n
);
return
ProcXvPutImage
(
client
);
}
#ifdef MITSHM
static
int
SProcXvShmPutImage
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvShmPutImageReq
);
REQUEST_SIZE_MATCH
(
xvShmPutImageReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
swapl
(
&
stuff
->
gc
,
n
);
swapl
(
&
stuff
->
shmseg
,
n
);
swapl
(
&
stuff
->
id
,
n
);
swaps
(
&
stuff
->
src_x
,
n
);
swaps
(
&
stuff
->
src_y
,
n
);
swaps
(
&
stuff
->
src_w
,
n
);
swaps
(
&
stuff
->
src_h
,
n
);
swaps
(
&
stuff
->
drw_x
,
n
);
swaps
(
&
stuff
->
drw_y
,
n
);
swaps
(
&
stuff
->
drw_w
,
n
);
swaps
(
&
stuff
->
drw_h
,
n
);
swaps
(
&
stuff
->
offset
,
n
);
swaps
(
&
stuff
->
width
,
n
);
swaps
(
&
stuff
->
height
,
n
);
return
ProcXvShmPutImage
(
client
);
}
#endif
static
int
SProcXvSelectVideoNotify
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvSelectVideoNotifyReq
);
REQUEST_SIZE_MATCH
(
xvSelectVideoNotifyReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
return
ProcXvSelectVideoNotify
(
client
);
}
static
int
SProcXvSelectPortNotify
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvSelectPortNotifyReq
);
REQUEST_SIZE_MATCH
(
xvSelectPortNotifyReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
return
ProcXvSelectPortNotify
(
client
);
}
static
int
SProcXvStopVideo
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvStopVideoReq
);
REQUEST_SIZE_MATCH
(
xvStopVideoReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
drawable
,
n
);
return
ProcXvStopVideo
(
client
);
}
static
int
SProcXvSetPortAttribute
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvSetPortAttributeReq
);
REQUEST_SIZE_MATCH
(
xvSetPortAttributeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
attribute
,
n
);
return
ProcXvSetPortAttribute
(
client
);
}
static
int
SProcXvGetPortAttribute
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvGetPortAttributeReq
);
REQUEST_SIZE_MATCH
(
xvGetPortAttributeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swapl
(
&
stuff
->
attribute
,
n
);
return
ProcXvGetPortAttribute
(
client
);
}
static
int
SProcXvQueryBestSize
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvQueryBestSizeReq
);
REQUEST_SIZE_MATCH
(
xvQueryBestSizeReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
swaps
(
&
stuff
->
vid_w
,
n
);
swaps
(
&
stuff
->
vid_h
,
n
);
swaps
(
&
stuff
->
drw_w
,
n
);
swaps
(
&
stuff
->
drw_h
,
n
);
return
ProcXvQueryBestSize
(
client
);
}
static
int
SProcXvQueryPortAttributes
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvQueryPortAttributesReq
);
REQUEST_SIZE_MATCH
(
xvQueryPortAttributesReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
return
ProcXvQueryPortAttributes
(
client
);
}
static
int
SProcXvQueryImageAttributes
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvQueryImageAttributesReq
);
REQUEST_SIZE_MATCH
(
xvQueryImageAttributesReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
id
,
n
);
swaps
(
&
stuff
->
width
,
n
);
swaps
(
&
stuff
->
width
,
n
);
return
ProcXvQueryImageAttributes
(
client
);
}
static
int
SProcXvListImageFormats
(
ClientPtr
client
)
{
register
char
n
;
REQUEST
(
xvListImageFormatsReq
);
REQUEST_SIZE_MATCH
(
xvListImageFormatsReq
);
swaps
(
&
stuff
->
length
,
n
);
swapl
(
&
stuff
->
port
,
n
);
return
ProcXvListImageFormats
(
client
);
}
static
int
SWriteQueryExtensionReply
(
ClientPtr
client
,
xvQueryExtensionReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swaps
(
&
rep
->
version
,
n
);
swaps
(
&
rep
->
revision
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvQueryExtensionReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteQueryAdaptorsReply
(
ClientPtr
client
,
xvQueryAdaptorsReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swaps
(
&
rep
->
num_adaptors
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvQueryAdaptorsReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteQueryEncodingsReply
(
ClientPtr
client
,
xvQueryEncodingsReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swaps
(
&
rep
->
num_encodings
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvQueryEncodingsReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteAdaptorInfo
(
ClientPtr
client
,
xvAdaptorInfo
*
pAdaptor
){
register
char
n
;
swapl
(
&
pAdaptor
->
base_id
,
n
);
swaps
(
&
pAdaptor
->
name_size
,
n
);
swaps
(
&
pAdaptor
->
num_ports
,
n
);
swaps
(
&
pAdaptor
->
num_formats
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvAdaptorInfo
,
(
char
*
)
pAdaptor
);
return
Success
;
}
static
int
SWriteEncodingInfo
(
ClientPtr
client
,
xvEncodingInfo
*
pEncoding
){
register
char
n
;
swapl
(
&
pEncoding
->
encoding
,
n
);
swaps
(
&
pEncoding
->
name_size
,
n
);
swaps
(
&
pEncoding
->
width
,
n
);
swaps
(
&
pEncoding
->
height
,
n
);
swapl
(
&
pEncoding
->
rate
.
numerator
,
n
);
swapl
(
&
pEncoding
->
rate
.
denominator
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvEncodingInfo
,
(
char
*
)
pEncoding
);
return
Success
;
}
static
int
SWriteFormat
(
ClientPtr
client
,
xvFormat
*
pFormat
){
register
char
n
;
swapl
(
&
pFormat
->
visual
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvFormat
,
(
char
*
)
pFormat
);
return
Success
;
}
static
int
SWriteAttributeInfo
(
ClientPtr
client
,
xvAttributeInfo
*
pAtt
){
register
char
n
;
swapl
(
&
pAtt
->
flags
,
n
);
swapl
(
&
pAtt
->
size
,
n
);
swapl
(
&
pAtt
->
min
,
n
);
swapl
(
&
pAtt
->
max
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvAttributeInfo
,
(
char
*
)
pAtt
);
return
Success
;
}
static
int
SWriteImageFormatInfo
(
ClientPtr
client
,
xvImageFormatInfo
*
pImage
){
register
char
n
;
swapl
(
&
pImage
->
id
,
n
);
swapl
(
&
pImage
->
red_mask
,
n
);
swapl
(
&
pImage
->
green_mask
,
n
);
swapl
(
&
pImage
->
blue_mask
,
n
);
swapl
(
&
pImage
->
y_sample_bits
,
n
);
swapl
(
&
pImage
->
u_sample_bits
,
n
);
swapl
(
&
pImage
->
v_sample_bits
,
n
);
swapl
(
&
pImage
->
horz_y_period
,
n
);
swapl
(
&
pImage
->
horz_u_period
,
n
);
swapl
(
&
pImage
->
horz_v_period
,
n
);
swapl
(
&
pImage
->
vert_y_period
,
n
);
swapl
(
&
pImage
->
vert_u_period
,
n
);
swapl
(
&
pImage
->
vert_v_period
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvImageFormatInfo
,
(
char
*
)
pImage
);
return
Success
;
}
static
int
SWriteGrabPortReply
(
ClientPtr
client
,
xvGrabPortReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvGrabPortReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteGetPortAttributeReply
(
ClientPtr
client
,
xvGetPortAttributeReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swapl
(
&
rep
->
value
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvGetPortAttributeReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteQueryBestSizeReply
(
ClientPtr
client
,
xvQueryBestSizeReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swaps
(
&
rep
->
actual_width
,
n
);
swaps
(
&
rep
->
actual_height
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvQueryBestSizeReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteQueryPortAttributesReply
(
ClientPtr
client
,
xvQueryPortAttributesReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swapl
(
&
rep
->
num_attributes
,
n
);
swapl
(
&
rep
->
text_size
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvQueryPortAttributesReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteQueryImageAttributesReply
(
ClientPtr
client
,
xvQueryImageAttributesReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swapl
(
&
rep
->
num_planes
,
n
);
swapl
(
&
rep
->
data_size
,
n
);
swaps
(
&
rep
->
width
,
n
);
swaps
(
&
rep
->
height
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvQueryImageAttributesReply
,
(
char
*
)
&
rep
);
return
Success
;
}
static
int
SWriteListImageFormatsReply
(
ClientPtr
client
,
xvListImageFormatsReply
*
rep
){
register
char
n
;
swaps
(
&
rep
->
sequenceNumber
,
n
);
swapl
(
&
rep
->
length
,
n
);
swapl
(
&
rep
->
num_formats
,
n
);
(
void
)
WriteToClient
(
client
,
sz_xvListImageFormatsReply
,
(
char
*
)
&
rep
);
return
Success
;
}
#ifdef PANORAMIX
static
int
XineramaXvStopVideo
(
ClientPtr
client
)
{
int
result
=
Success
,
i
;
PanoramiXRes
*
draw
,
*
port
;
REQUEST
(
xvStopVideoReq
);
REQUEST_SIZE_MATCH
(
xvStopVideoReq
);
if
(
!
(
draw
=
(
PanoramiXRes
*
)
SecurityLookupIDByClass
(
client
,
stuff
->
drawable
,
XRC_DRAWABLE
,
SecurityWriteAccess
)))
return
BadDrawable
;
if
(
!
(
port
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
port
,
XvXRTPort
,
SecurityReadAccess
)))
return
_XvBadPort
;
FOR_NSCREENS_BACKWARD
(
i
)
{
if
(
port
->
info
[
i
].
id
)
{
stuff
->
drawable
=
draw
->
info
[
i
].
id
;
stuff
->
port
=
port
->
info
[
i
].
id
;
result
=
ProcXvStopVideo
(
client
);
}
}
return
result
;
}
static
int
XineramaXvSetPortAttribute
(
ClientPtr
client
)
{
REQUEST
(
xvSetPortAttributeReq
);
PanoramiXRes
*
port
;
int
result
=
Success
,
i
;
REQUEST_SIZE_MATCH
(
xvSetPortAttributeReq
);
if
(
!
(
port
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
port
,
XvXRTPort
,
SecurityReadAccess
)))
return
_XvBadPort
;
FOR_NSCREENS_BACKWARD
(
i
)
{
if
(
port
->
info
[
i
].
id
)
{
stuff
->
port
=
port
->
info
[
i
].
id
;
result
=
ProcXvSetPortAttribute
(
client
);
}
}
return
result
;
}
#ifdef MITSHM
static
int
XineramaXvShmPutImage
(
ClientPtr
client
)
{
REQUEST
(
xvShmPutImageReq
);
PanoramiXRes
*
draw
,
*
gc
,
*
port
;
Bool
send_event
=
stuff
->
send_event
;
Bool
isRoot
;
int
result
=
Success
,
i
,
x
,
y
;
REQUEST_SIZE_MATCH
(
xvShmPutImageReq
);
if
(
!
(
draw
=
(
PanoramiXRes
*
)
SecurityLookupIDByClass
(
client
,
stuff
->
drawable
,
XRC_DRAWABLE
,
SecurityWriteAccess
)))
return
BadDrawable
;
if
(
!
(
gc
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
gc
,
XRT_GC
,
SecurityReadAccess
)))
return
BadGC
;
if
(
!
(
port
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
port
,
XvXRTPort
,
SecurityReadAccess
)))
return
_XvBadPort
;
isRoot
=
(
draw
->
type
==
XRT_WINDOW
)
&&
draw
->
u
.
win
.
root
;
x
=
stuff
->
drw_x
;
y
=
stuff
->
drw_y
;
FOR_NSCREENS_BACKWARD
(
i
)
{
if
(
port
->
info
[
i
].
id
)
{
stuff
->
drawable
=
draw
->
info
[
i
].
id
;
stuff
->
port
=
port
->
info
[
i
].
id
;
stuff
->
gc
=
gc
->
info
[
i
].
id
;
stuff
->
drw_x
=
x
;
stuff
->
drw_y
=
y
;
if
(
isRoot
)
{
stuff
->
drw_x
-=
panoramiXdataPtr
[
i
].
x
;
stuff
->
drw_y
-=
panoramiXdataPtr
[
i
].
y
;
}
stuff
->
send_event
=
(
send_event
&&
!
i
)
?
1
:
0
;
result
=
ProcXvShmPutImage
(
client
);
}
}
return
result
;
}
#endif
static
int
XineramaXvPutImage
(
ClientPtr
client
)
{
REQUEST
(
xvPutImageReq
);
PanoramiXRes
*
draw
,
*
gc
,
*
port
;
Bool
isRoot
;
int
result
=
Success
,
i
,
x
,
y
;
REQUEST_AT_LEAST_SIZE
(
xvPutImageReq
);
if
(
!
(
draw
=
(
PanoramiXRes
*
)
SecurityLookupIDByClass
(
client
,
stuff
->
drawable
,
XRC_DRAWABLE
,
SecurityWriteAccess
)))
return
BadDrawable
;
if
(
!
(
gc
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
gc
,
XRT_GC
,
SecurityReadAccess
)))
return
BadGC
;
if
(
!
(
port
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
port
,
XvXRTPort
,
SecurityReadAccess
)))
return
_XvBadPort
;
isRoot
=
(
draw
->
type
==
XRT_WINDOW
)
&&
draw
->
u
.
win
.
root
;
x
=
stuff
->
drw_x
;
y
=
stuff
->
drw_y
;
FOR_NSCREENS_BACKWARD
(
i
)
{
if
(
port
->
info
[
i
].
id
)
{
stuff
->
drawable
=
draw
->
info
[
i
].
id
;
stuff
->
port
=
port
->
info
[
i
].
id
;
stuff
->
gc
=
gc
->
info
[
i
].
id
;
stuff
->
drw_x
=
x
;
stuff
->
drw_y
=
y
;
if
(
isRoot
)
{
stuff
->
drw_x
-=
panoramiXdataPtr
[
i
].
x
;
stuff
->
drw_y
-=
panoramiXdataPtr
[
i
].
y
;
}
result
=
ProcXvPutImage
(
client
);
}
}
return
result
;
}
static
int
XineramaXvPutVideo
(
ClientPtr
client
)
{
REQUEST
(
xvPutImageReq
);
PanoramiXRes
*
draw
,
*
gc
,
*
port
;
Bool
isRoot
;
int
result
=
Success
,
i
,
x
,
y
;
REQUEST_AT_LEAST_SIZE
(
xvPutVideoReq
);
if
(
!
(
draw
=
(
PanoramiXRes
*
)
SecurityLookupIDByClass
(
client
,
stuff
->
drawable
,
XRC_DRAWABLE
,
SecurityWriteAccess
)))
return
BadDrawable
;
if
(
!
(
gc
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
gc
,
XRT_GC
,
SecurityReadAccess
)))
return
BadGC
;
if
(
!
(
port
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
port
,
XvXRTPort
,
SecurityReadAccess
)))
return
_XvBadPort
;
isRoot
=
(
draw
->
type
==
XRT_WINDOW
)
&&
draw
->
u
.
win
.
root
;
x
=
stuff
->
drw_x
;
y
=
stuff
->
drw_y
;
FOR_NSCREENS_BACKWARD
(
i
)
{
if
(
port
->
info
[
i
].
id
)
{
stuff
->
drawable
=
draw
->
info
[
i
].
id
;
stuff
->
port
=
port
->
info
[
i
].
id
;
stuff
->
gc
=
gc
->
info
[
i
].
id
;
stuff
->
drw_x
=
x
;
stuff
->
drw_y
=
y
;
if
(
isRoot
)
{
stuff
->
drw_x
-=
panoramiXdataPtr
[
i
].
x
;
stuff
->
drw_y
-=
panoramiXdataPtr
[
i
].
y
;
}
result
=
ProcXvPutVideo
(
client
);
}
}
return
result
;
}
static
int
XineramaXvPutStill
(
ClientPtr
client
)
{
REQUEST
(
xvPutImageReq
);
PanoramiXRes
*
draw
,
*
gc
,
*
port
;
Bool
isRoot
;
int
result
=
Success
,
i
,
x
,
y
;
REQUEST_AT_LEAST_SIZE
(
xvPutImageReq
);
if
(
!
(
draw
=
(
PanoramiXRes
*
)
SecurityLookupIDByClass
(
client
,
stuff
->
drawable
,
XRC_DRAWABLE
,
SecurityWriteAccess
)))
return
BadDrawable
;
if
(
!
(
gc
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
gc
,
XRT_GC
,
SecurityReadAccess
)))
return
BadGC
;
if
(
!
(
port
=
(
PanoramiXRes
*
)
SecurityLookupIDByType
(
client
,
stuff
->
port
,
XvXRTPort
,
SecurityReadAccess
)))
return
_XvBadPort
;
isRoot
=
(
draw
->
type
==
XRT_WINDOW
)
&&
draw
->
u
.
win
.
root
;
x
=
stuff
->
drw_x
;
y
=
stuff
->
drw_y
;
FOR_NSCREENS_BACKWARD
(
i
)
{
if
(
port
->
info
[
i
].
id
)
{
stuff
->
drawable
=
draw
->
info
[
i
].
id
;
stuff
->
port
=
port
->
info
[
i
].
id
;
stuff
->
gc
=
gc
->
info
[
i
].
id
;
stuff
->
drw_x
=
x
;
stuff
->
drw_y
=
y
;
if
(
isRoot
)
{
stuff
->
drw_x
-=
panoramiXdataPtr
[
i
].
x
;
stuff
->
drw_y
-=
panoramiXdataPtr
[
i
].
y
;
}
result
=
ProcXvPutStill
(
client
);
}
}
return
result
;
}
void
XineramifyXv
(
void
)
{
ScreenPtr
pScreen
,
screen0
=
screenInfo
.
screens
[
0
];
XvScreenPtr
xvsp0
=
(
XvScreenPtr
)
screen0
->
devPrivates
[
XvScreenIndex
].
ptr
;
XvAdaptorPtr
refAdapt
,
pAdapt
;
XvAttributePtr
pAttr
;
XvScreenPtr
xvsp
;
Bool
isOverlay
,
hasOverlay
;
PanoramiXRes
*
port
;
XvAdaptorPtr
MatchingAdaptors
[
MAXSCREENS
];
int
i
,
j
,
k
,
l
;
XvXRTPort
=
CreateNewResourceType
(
XineramaDeleteResource
);
if
(
!
xvsp0
)
return
;
for
(
i
=
0
;
i
<
xvsp0
->
nAdaptors
;
i
++
)
{
refAdapt
=
xvsp0
->
pAdaptors
+
i
;
bzero
(
MatchingAdaptors
,
sizeof
(
XvAdaptorPtr
)
*
MAXSCREENS
);
MatchingAdaptors
[
0
]
=
refAdapt
;
if
(
!
(
refAdapt
->
type
&
XvInputMask
))
continue
;
isOverlay
=
FALSE
;
for
(
j
=
0
;
j
<
refAdapt
->
nAttributes
;
j
++
)
{
pAttr
=
refAdapt
->
pAttributes
+
j
;
if
(
!
strcmp
(
pAttr
->
name
,
"XV_COLORKEY"
))
{
isOverlay
=
TRUE
;
break
;
}
}
for
(
j
=
1
;
j
<
PanoramiXNumScreens
;
j
++
)
{
pScreen
=
screenInfo
.
screens
[
j
];
xvsp
=
(
XvScreenPtr
)
pScreen
->
devPrivates
[
XvScreenIndex
].
ptr
;
/* Do not try to go on if xv is not supported on this screen */
if
(
xvsp
==
NULL
)
continue
;
/* if the adaptor has the same name it's a perfect match */
for
(
k
=
0
;
k
<
xvsp
->
nAdaptors
;
k
++
)
{
pAdapt
=
xvsp
->
pAdaptors
+
k
;
if
(
!
strcmp
(
refAdapt
->
name
,
pAdapt
->
name
))
{
MatchingAdaptors
[
j
]
=
pAdapt
;
break
;
}
}
if
(
MatchingAdaptors
[
j
])
continue
;
/* found it */
/* otherwise we only look for XvImage adaptors */
if
(
!
(
refAdapt
->
type
&
XvImageMask
))
continue
;
if
(
refAdapt
->
nImages
<=
0
)
continue
;
/* prefer overlay/overlay non-overlay/non-overlay pairing */
for
(
k
=
0
;
k
<
xvsp
->
nAdaptors
;
k
++
)
{
pAdapt
=
xvsp
->
pAdaptors
+
k
;
if
((
pAdapt
->
type
&
XvImageMask
)
&&
(
pAdapt
->
nImages
>
0
))
{
hasOverlay
=
FALSE
;
for
(
l
=
0
;
l
<
pAdapt
->
nAttributes
;
l
++
)
{
if
(
!
strcmp
(
pAdapt
->
name
,
"XV_COLORKEY"
))
{
hasOverlay
=
TRUE
;
break
;
}
}
if
(
isOverlay
&&
hasOverlay
)
{
MatchingAdaptors
[
j
]
=
pAdapt
;
break
;
}
else
if
(
!
isOverlay
&&
!
hasOverlay
)
{
MatchingAdaptors
[
j
]
=
pAdapt
;
break
;
}
}
}
if
(
MatchingAdaptors
[
j
])
continue
;
/* found it */
/* but we'll take any XvImage pairing if we can get it */
for
(
k
=
0
;
k
<
xvsp
->
nAdaptors
;
k
++
)
{
pAdapt
=
xvsp
->
pAdaptors
+
k
;
if
((
pAdapt
->
type
&
XvImageMask
)
&&
(
pAdapt
->
nImages
>
0
))
{
MatchingAdaptors
[
j
]
=
pAdapt
;
break
;
}
}
}
/* now create a resource for each port */
for
(
j
=
0
;
j
<
refAdapt
->
nPorts
;
j
++
)
{
if
(
!
(
port
=
xalloc
(
sizeof
(
PanoramiXRes
))))
break
;
port
->
info
[
0
].
id
=
MatchingAdaptors
[
0
]
->
base_id
+
j
;
AddResource
(
port
->
info
[
0
].
id
,
XvXRTPort
,
port
);
for
(
k
=
1
;
k
<
PanoramiXNumScreens
;
k
++
)
{
if
(
MatchingAdaptors
[
k
]
&&
(
MatchingAdaptors
[
k
]
->
nPorts
>
j
))
port
->
info
[
k
].
id
=
MatchingAdaptors
[
k
]
->
base_id
+
j
;
else
port
->
info
[
k
].
id
=
0
;
}
}
}
}
#endif
#endif
/* !defined(__sun) && !defined(__CYGWIN__) */
#endif
/* !defined(__sun) && !defined(__CYGWIN__) */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment