2012-05-11 02:06:22 +02:00
// Package xvmc is the X client API for the XVideo-MotionCompensation extension.
2012-05-10 23:01:42 +02:00
package xvmc
2013-08-12 02:45:36 +02:00
// This file is automatically generated from xvmc.xml. Edit at your peril!
2012-05-10 23:01:42 +02:00
import (
2018-09-08 19:57:27 +02:00
xgb "janouch.name/haven/nexgb"
2012-05-10 23:01:42 +02:00
2018-09-08 19:57:27 +02:00
"janouch.name/haven/nexgb/xproto"
"janouch.name/haven/nexgb/xv"
2012-05-10 23:01:42 +02:00
)
2018-09-21 08:37:21 +02:00
const (
MajorVersion = 1
MinorVersion = 1
)
2012-05-10 23:01:42 +02:00
// Init must be called before using the XVideo-MotionCompensation extension.
func Init ( c * xgb . Conn ) error {
reply , err := xproto . QueryExtension ( c , 25 , "XVideo-MotionCompensation" ) . Reply ( )
switch {
case err != nil :
return err
case ! reply . Present :
return xgb . Errorf ( "No extension named XVideo-MotionCompensation could be found on on the server." )
}
2016-03-01 15:41:38 +01:00
c . ExtLock . Lock ( )
2012-05-10 23:01:42 +02:00
c . Extensions [ "XVideo-MotionCompensation" ] = reply . MajorOpcode
2016-03-01 15:41:38 +01:00
c . ExtLock . Unlock ( )
2012-05-10 23:01:42 +02:00
for evNum , fun := range xgb . NewExtEventFuncs [ "XVideo-MotionCompensation" ] {
xgb . NewEventFuncs [ int ( reply . FirstEvent ) + evNum ] = fun
}
for errNum , fun := range xgb . NewExtErrorFuncs [ "XVideo-MotionCompensation" ] {
xgb . NewErrorFuncs [ int ( reply . FirstError ) + errNum ] = fun
}
return nil
}
func init ( ) {
xgb . NewExtEventFuncs [ "XVideo-MotionCompensation" ] = make ( map [ int ] xgb . NewEventFun )
xgb . NewExtErrorFuncs [ "XVideo-MotionCompensation" ] = make ( map [ int ] xgb . NewErrorFun )
}
type Context uint32
func NewContextId ( c * xgb . Conn ) ( Context , error ) {
id , err := c . NewId ( )
if err != nil {
return 0 , err
}
return Context ( id ) , nil
}
2013-08-12 02:43:26 +02:00
type Subpicture uint32
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
func NewSubpictureId ( c * xgb . Conn ) ( Subpicture , error ) {
2012-05-10 23:01:42 +02:00
id , err := c . NewId ( )
if err != nil {
return 0 , err
}
2013-08-12 02:43:26 +02:00
return Subpicture ( id ) , nil
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
type Surface uint32
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
func NewSurfaceId ( c * xgb . Conn ) ( Surface , error ) {
2012-05-10 23:01:42 +02:00
id , err := c . NewId ( )
if err != nil {
return 0 , err
}
2013-08-12 02:43:26 +02:00
return Surface ( id ) , nil
2012-05-10 23:01:42 +02:00
}
type SurfaceInfo struct {
Id Surface
ChromaFormat uint16
Pad0 uint16
MaxWidth uint16
MaxHeight uint16
SubpictureMaxWidth uint16
SubpictureMaxHeight uint16
McType uint32
Flags uint32
}
2012-05-11 05:57:34 +02:00
// SurfaceInfoRead reads a byte slice into a SurfaceInfo value.
2012-05-10 23:01:42 +02:00
func SurfaceInfoRead ( buf [ ] byte , v * SurfaceInfo ) int {
b := 0
v . Id = Surface ( xgb . Get32 ( buf [ b : ] ) )
b += 4
v . ChromaFormat = xgb . Get16 ( buf [ b : ] )
b += 2
v . Pad0 = xgb . Get16 ( buf [ b : ] )
b += 2
v . MaxWidth = xgb . Get16 ( buf [ b : ] )
b += 2
v . MaxHeight = xgb . Get16 ( buf [ b : ] )
b += 2
v . SubpictureMaxWidth = xgb . Get16 ( buf [ b : ] )
b += 2
v . SubpictureMaxHeight = xgb . Get16 ( buf [ b : ] )
b += 2
v . McType = xgb . Get32 ( buf [ b : ] )
b += 4
v . Flags = xgb . Get32 ( buf [ b : ] )
b += 4
return b
}
2012-05-11 05:57:34 +02:00
// SurfaceInfoReadList reads a byte slice into a list of SurfaceInfo values.
2012-05-10 23:01:42 +02:00
func SurfaceInfoReadList ( buf [ ] byte , dest [ ] SurfaceInfo ) int {
b := 0
for i := 0 ; i < len ( dest ) ; i ++ {
dest [ i ] = SurfaceInfo { }
b += SurfaceInfoRead ( buf [ b : ] , & dest [ i ] )
}
return xgb . Pad ( b )
}
2012-05-11 05:57:34 +02:00
// Bytes writes a SurfaceInfo value to a byte slice.
2012-05-10 23:01:42 +02:00
func ( v SurfaceInfo ) Bytes ( ) [ ] byte {
buf := make ( [ ] byte , 24 )
b := 0
xgb . Put32 ( buf [ b : ] , uint32 ( v . Id ) )
b += 4
xgb . Put16 ( buf [ b : ] , v . ChromaFormat )
b += 2
xgb . Put16 ( buf [ b : ] , v . Pad0 )
b += 2
xgb . Put16 ( buf [ b : ] , v . MaxWidth )
b += 2
xgb . Put16 ( buf [ b : ] , v . MaxHeight )
b += 2
xgb . Put16 ( buf [ b : ] , v . SubpictureMaxWidth )
b += 2
xgb . Put16 ( buf [ b : ] , v . SubpictureMaxHeight )
b += 2
xgb . Put32 ( buf [ b : ] , v . McType )
b += 4
xgb . Put32 ( buf [ b : ] , v . Flags )
b += 4
2014-05-02 15:09:23 +02:00
return buf [ : b ]
2012-05-10 23:01:42 +02:00
}
2012-05-27 00:24:52 +02:00
// SurfaceInfoListBytes writes a list of SurfaceInfo values to a byte slice.
2012-05-10 23:01:42 +02:00
func SurfaceInfoListBytes ( buf [ ] byte , list [ ] SurfaceInfo ) int {
b := 0
var structBytes [ ] byte
for _ , item := range list {
structBytes = item . Bytes ( )
copy ( buf [ b : ] , structBytes )
2013-08-12 02:54:15 +02:00
b += len ( structBytes )
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:54:15 +02:00
return xgb . Pad ( b )
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Bool'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Byte'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Card8'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Char'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Void'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Double'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Float'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Int16'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Int32'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Int8'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Card16'
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
// Skipping definition for base type 'Card32'
2012-05-10 23:01:42 +02:00
2012-05-11 05:57:34 +02:00
// CreateContextCookie is a cookie used only for CreateContext requests.
2012-05-10 23:01:42 +02:00
type CreateContextCookie struct {
* xgb . Cookie
}
2012-05-11 05:57:34 +02:00
// CreateContext sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it will be returned with the reply by calling CreateContextCookie.Reply.
func CreateContext ( c * xgb . Conn , ContextId Context , PortId xv . Port , SurfaceId Surface , Width , Height uint16 , Flags uint32 ) CreateContextCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2012-05-12 05:58:52 +02:00
panic ( "Cannot issue request 'CreateContext' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( true , true )
c . NewRequest ( createContextRequest ( c , ContextId , PortId , SurfaceId , Width , Height , Flags ) , cookie )
return CreateContextCookie { cookie }
}
2012-05-11 05:57:34 +02:00
// CreateContextUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
2018-09-30 16:32:47 +02:00
func CreateContextUnchecked ( c * xgb . Conn , ContextId Context , PortId xv . Port , SurfaceId Surface , Width , Height uint16 , Flags uint32 ) CreateContextCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2012-05-12 05:58:52 +02:00
panic ( "Cannot issue request 'CreateContext' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( false , true )
c . NewRequest ( createContextRequest ( c , ContextId , PortId , SurfaceId , Width , Height , Flags ) , cookie )
return CreateContextCookie { cookie }
}
2012-05-11 05:57:34 +02:00
// CreateContextReply represents the data returned from a CreateContext request.
2012-05-10 23:01:42 +02:00
type CreateContextReply struct {
2012-05-11 05:57:34 +02:00
Sequence uint16 // sequence number of the request for this reply
Length uint32 // number of bytes in this reply
2012-05-10 23:01:42 +02:00
// padding: 1 bytes
WidthActual uint16
HeightActual uint16
FlagsReturn uint32
// padding: 20 bytes
PrivData [ ] uint32 // size: xgb.Pad((int(Length) * 4))
}
2012-05-11 05:57:34 +02:00
// Reply blocks and returns the reply data for a CreateContext request.
2012-05-10 23:01:42 +02:00
func ( cook CreateContextCookie ) Reply ( ) ( * CreateContextReply , error ) {
buf , err := cook . Cookie . Reply ( )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return createContextReply ( buf ) , nil
}
2012-05-11 05:57:34 +02:00
// createContextReply reads a byte slice into a CreateContextReply value.
2012-05-10 23:01:42 +02:00
func createContextReply ( buf [ ] byte ) * CreateContextReply {
v := new ( CreateContextReply )
b := 1 // skip reply determinant
b += 1 // padding
v . Sequence = xgb . Get16 ( buf [ b : ] )
b += 2
v . Length = xgb . Get32 ( buf [ b : ] ) // 4-byte units
b += 4
v . WidthActual = xgb . Get16 ( buf [ b : ] )
b += 2
v . HeightActual = xgb . Get16 ( buf [ b : ] )
b += 2
v . FlagsReturn = xgb . Get32 ( buf [ b : ] )
b += 4
b += 20 // padding
v . PrivData = make ( [ ] uint32 , v . Length )
for i := 0 ; i < int ( v . Length ) ; i ++ {
v . PrivData [ i ] = xgb . Get32 ( buf [ b : ] )
b += 4
}
return v
}
2018-09-30 16:32:47 +02:00
// createContextRequest writes a CreateContext request to a byte slice for transfer.
func createContextRequest ( c * xgb . Conn , ContextId Context , PortId xv . Port , SurfaceId Surface , Width , Height uint16 , Flags uint32 ) [ ] byte {
2012-05-10 23:01:42 +02:00
size := 24
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2012-05-10 23:01:42 +02:00
b += 1
buf [ b ] = 2 // request opcode
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
xgb . Put32 ( buf [ b : ] , uint32 ( ContextId ) )
b += 4
xgb . Put32 ( buf [ b : ] , uint32 ( PortId ) )
b += 4
xgb . Put32 ( buf [ b : ] , uint32 ( SurfaceId ) )
b += 4
xgb . Put16 ( buf [ b : ] , Width )
b += 2
xgb . Put16 ( buf [ b : ] , Height )
b += 2
xgb . Put32 ( buf [ b : ] , Flags )
b += 4
return buf
}
2013-08-12 02:43:26 +02:00
// CreateSubpictureCookie is a cookie used only for CreateSubpicture requests.
type CreateSubpictureCookie struct {
2012-05-10 23:01:42 +02:00
* xgb . Cookie
}
2013-08-12 02:43:26 +02:00
// CreateSubpicture sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it will be returned with the reply by calling CreateSubpictureCookie.Reply.
func CreateSubpicture ( c * xgb . Conn , SubpictureId Subpicture , Context Context , XvimageId uint32 , Width , Height uint16 ) CreateSubpictureCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'CreateSubpicture' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2013-08-12 02:43:26 +02:00
cookie := c . NewCookie ( true , true )
c . NewRequest ( createSubpictureRequest ( c , SubpictureId , Context , XvimageId , Width , Height ) , cookie )
return CreateSubpictureCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// CreateSubpictureUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
2018-09-30 16:32:47 +02:00
func CreateSubpictureUnchecked ( c * xgb . Conn , SubpictureId Subpicture , Context Context , XvimageId uint32 , Width , Height uint16 ) CreateSubpictureCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'CreateSubpicture' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2013-08-12 02:43:26 +02:00
cookie := c . NewCookie ( false , true )
c . NewRequest ( createSubpictureRequest ( c , SubpictureId , Context , XvimageId , Width , Height ) , cookie )
return CreateSubpictureCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// CreateSubpictureReply represents the data returned from a CreateSubpicture request.
type CreateSubpictureReply struct {
Sequence uint16 // sequence number of the request for this reply
Length uint32 // number of bytes in this reply
// padding: 1 bytes
WidthActual uint16
HeightActual uint16
NumPaletteEntries uint16
EntryBytes uint16
ComponentOrder [ ] byte // size: 4
// padding: 12 bytes
PrivData [ ] uint32 // size: xgb.Pad((int(Length) * 4))
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// Reply blocks and returns the reply data for a CreateSubpicture request.
func ( cook CreateSubpictureCookie ) Reply ( ) ( * CreateSubpictureReply , error ) {
buf , err := cook . Cookie . Reply ( )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return createSubpictureReply ( buf ) , nil
}
// createSubpictureReply reads a byte slice into a CreateSubpictureReply value.
func createSubpictureReply ( buf [ ] byte ) * CreateSubpictureReply {
v := new ( CreateSubpictureReply )
b := 1 // skip reply determinant
b += 1 // padding
v . Sequence = xgb . Get16 ( buf [ b : ] )
b += 2
v . Length = xgb . Get32 ( buf [ b : ] ) // 4-byte units
b += 4
v . WidthActual = xgb . Get16 ( buf [ b : ] )
b += 2
v . HeightActual = xgb . Get16 ( buf [ b : ] )
b += 2
v . NumPaletteEntries = xgb . Get16 ( buf [ b : ] )
b += 2
v . EntryBytes = xgb . Get16 ( buf [ b : ] )
b += 2
v . ComponentOrder = make ( [ ] byte , 4 )
copy ( v . ComponentOrder [ : 4 ] , buf [ b : ] )
2014-05-02 15:09:23 +02:00
b += int ( 4 )
2013-08-12 02:43:26 +02:00
b += 12 // padding
v . PrivData = make ( [ ] uint32 , v . Length )
for i := 0 ; i < int ( v . Length ) ; i ++ {
v . PrivData [ i ] = xgb . Get32 ( buf [ b : ] )
b += 4
}
return v
}
2018-09-30 16:32:47 +02:00
// createSubpictureRequest writes a CreateSubpicture request to a byte slice for transfer.
func createSubpictureRequest ( c * xgb . Conn , SubpictureId Subpicture , Context Context , XvimageId uint32 , Width , Height uint16 ) [ ] byte {
2013-08-12 02:43:26 +02:00
size := 20
2012-05-10 23:01:42 +02:00
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2012-05-10 23:01:42 +02:00
b += 1
2013-08-12 02:43:26 +02:00
buf [ b ] = 6 // request opcode
2012-05-10 23:01:42 +02:00
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
2013-08-12 02:43:26 +02:00
xgb . Put32 ( buf [ b : ] , uint32 ( SubpictureId ) )
b += 4
xgb . Put32 ( buf [ b : ] , uint32 ( Context ) )
2012-05-10 23:01:42 +02:00
b += 4
2013-08-12 02:43:26 +02:00
xgb . Put32 ( buf [ b : ] , XvimageId )
b += 4
xgb . Put16 ( buf [ b : ] , Width )
b += 2
xgb . Put16 ( buf [ b : ] , Height )
b += 2
2012-05-10 23:01:42 +02:00
return buf
}
2012-05-11 05:57:34 +02:00
// CreateSurfaceCookie is a cookie used only for CreateSurface requests.
2012-05-10 23:01:42 +02:00
type CreateSurfaceCookie struct {
* xgb . Cookie
}
2012-05-11 05:57:34 +02:00
// CreateSurface sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it will be returned with the reply by calling CreateSurfaceCookie.Reply.
2012-05-10 23:01:42 +02:00
func CreateSurface ( c * xgb . Conn , SurfaceId Surface , ContextId Context ) CreateSurfaceCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2012-05-12 05:58:52 +02:00
panic ( "Cannot issue request 'CreateSurface' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( true , true )
c . NewRequest ( createSurfaceRequest ( c , SurfaceId , ContextId ) , cookie )
return CreateSurfaceCookie { cookie }
}
2012-05-11 05:57:34 +02:00
// CreateSurfaceUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
2012-05-10 23:01:42 +02:00
func CreateSurfaceUnchecked ( c * xgb . Conn , SurfaceId Surface , ContextId Context ) CreateSurfaceCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2012-05-12 05:58:52 +02:00
panic ( "Cannot issue request 'CreateSurface' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( false , true )
c . NewRequest ( createSurfaceRequest ( c , SurfaceId , ContextId ) , cookie )
return CreateSurfaceCookie { cookie }
}
2012-05-11 05:57:34 +02:00
// CreateSurfaceReply represents the data returned from a CreateSurface request.
2012-05-10 23:01:42 +02:00
type CreateSurfaceReply struct {
2012-05-11 05:57:34 +02:00
Sequence uint16 // sequence number of the request for this reply
Length uint32 // number of bytes in this reply
2012-05-10 23:01:42 +02:00
// padding: 1 bytes
// padding: 24 bytes
PrivData [ ] uint32 // size: xgb.Pad((int(Length) * 4))
}
2012-05-11 05:57:34 +02:00
// Reply blocks and returns the reply data for a CreateSurface request.
2012-05-10 23:01:42 +02:00
func ( cook CreateSurfaceCookie ) Reply ( ) ( * CreateSurfaceReply , error ) {
buf , err := cook . Cookie . Reply ( )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return createSurfaceReply ( buf ) , nil
}
2012-05-11 05:57:34 +02:00
// createSurfaceReply reads a byte slice into a CreateSurfaceReply value.
2012-05-10 23:01:42 +02:00
func createSurfaceReply ( buf [ ] byte ) * CreateSurfaceReply {
v := new ( CreateSurfaceReply )
b := 1 // skip reply determinant
b += 1 // padding
v . Sequence = xgb . Get16 ( buf [ b : ] )
b += 2
v . Length = xgb . Get32 ( buf [ b : ] ) // 4-byte units
b += 4
b += 24 // padding
v . PrivData = make ( [ ] uint32 , v . Length )
for i := 0 ; i < int ( v . Length ) ; i ++ {
v . PrivData [ i ] = xgb . Get32 ( buf [ b : ] )
b += 4
}
return v
}
2018-09-30 16:32:47 +02:00
// createSurfaceRequest writes a CreateSurface request to a byte slice for transfer.
2012-05-10 23:01:42 +02:00
func createSurfaceRequest ( c * xgb . Conn , SurfaceId Surface , ContextId Context ) [ ] byte {
size := 12
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2012-05-10 23:01:42 +02:00
b += 1
buf [ b ] = 4 // request opcode
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
xgb . Put32 ( buf [ b : ] , uint32 ( SurfaceId ) )
b += 4
xgb . Put32 ( buf [ b : ] , uint32 ( ContextId ) )
b += 4
return buf
}
2013-08-12 02:43:26 +02:00
// DestroyContextCookie is a cookie used only for DestroyContext requests.
type DestroyContextCookie struct {
* xgb . Cookie
}
// DestroyContext sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func DestroyContext ( c * xgb . Conn , ContextId Context ) DestroyContextCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'DestroyContext' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
cookie := c . NewCookie ( false , false )
c . NewRequest ( destroyContextRequest ( c , ContextId ) , cookie )
return DestroyContextCookie { cookie }
}
// DestroyContextChecked sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it can be retrieved using DestroyContextCookie.Check.
2013-08-12 02:43:26 +02:00
func DestroyContextChecked ( c * xgb . Conn , ContextId Context ) DestroyContextCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'DestroyContext' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
cookie := c . NewCookie ( true , false )
c . NewRequest ( destroyContextRequest ( c , ContextId ) , cookie )
return DestroyContextCookie { cookie }
}
// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func ( cook DestroyContextCookie ) Check ( ) error {
return cook . Cookie . Check ( )
}
2018-09-30 16:32:47 +02:00
// destroyContextRequest writes a DestroyContext request to a byte slice for transfer.
2013-08-12 02:43:26 +02:00
func destroyContextRequest ( c * xgb . Conn , ContextId Context ) [ ] byte {
size := 8
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2013-08-12 02:43:26 +02:00
b += 1
buf [ b ] = 3 // request opcode
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
xgb . Put32 ( buf [ b : ] , uint32 ( ContextId ) )
b += 4
return buf
}
// DestroySubpictureCookie is a cookie used only for DestroySubpicture requests.
type DestroySubpictureCookie struct {
* xgb . Cookie
}
// DestroySubpicture sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func DestroySubpicture ( c * xgb . Conn , SubpictureId Subpicture ) DestroySubpictureCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'DestroySubpicture' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
cookie := c . NewCookie ( false , false )
c . NewRequest ( destroySubpictureRequest ( c , SubpictureId ) , cookie )
return DestroySubpictureCookie { cookie }
}
// DestroySubpictureChecked sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it can be retrieved using DestroySubpictureCookie.Check.
2013-08-12 02:43:26 +02:00
func DestroySubpictureChecked ( c * xgb . Conn , SubpictureId Subpicture ) DestroySubpictureCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'DestroySubpicture' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
cookie := c . NewCookie ( true , false )
c . NewRequest ( destroySubpictureRequest ( c , SubpictureId ) , cookie )
return DestroySubpictureCookie { cookie }
}
// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
func ( cook DestroySubpictureCookie ) Check ( ) error {
return cook . Cookie . Check ( )
}
2018-09-30 16:32:47 +02:00
// destroySubpictureRequest writes a DestroySubpicture request to a byte slice for transfer.
2013-08-12 02:43:26 +02:00
func destroySubpictureRequest ( c * xgb . Conn , SubpictureId Subpicture ) [ ] byte {
size := 8
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2013-08-12 02:43:26 +02:00
b += 1
buf [ b ] = 7 // request opcode
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
xgb . Put32 ( buf [ b : ] , uint32 ( SubpictureId ) )
b += 4
return buf
}
2012-05-11 05:57:34 +02:00
// DestroySurfaceCookie is a cookie used only for DestroySurface requests.
2012-05-10 23:01:42 +02:00
type DestroySurfaceCookie struct {
* xgb . Cookie
}
2012-05-11 05:57:34 +02:00
// DestroySurface sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
2012-05-10 23:01:42 +02:00
func DestroySurface ( c * xgb . Conn , SurfaceId Surface ) DestroySurfaceCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2012-05-12 05:58:52 +02:00
panic ( "Cannot issue request 'DestroySurface' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( false , false )
c . NewRequest ( destroySurfaceRequest ( c , SurfaceId ) , cookie )
return DestroySurfaceCookie { cookie }
}
2012-05-11 05:57:34 +02:00
// DestroySurfaceChecked sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it can be retrieved using DestroySurfaceCookie.Check.
2012-05-10 23:01:42 +02:00
func DestroySurfaceChecked ( c * xgb . Conn , SurfaceId Surface ) DestroySurfaceCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2012-05-12 05:58:52 +02:00
panic ( "Cannot issue request 'DestroySurface' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( true , false )
c . NewRequest ( destroySurfaceRequest ( c , SurfaceId ) , cookie )
return DestroySurfaceCookie { cookie }
}
2012-05-11 05:57:34 +02:00
// Check returns an error if one occurred for checked requests that are not expecting a reply.
// This cannot be called for requests expecting a reply, nor for unchecked requests.
2012-05-10 23:01:42 +02:00
func ( cook DestroySurfaceCookie ) Check ( ) error {
return cook . Cookie . Check ( )
}
2018-09-30 16:32:47 +02:00
// destroySurfaceRequest writes a DestroySurface request to a byte slice for transfer.
2012-05-10 23:01:42 +02:00
func destroySurfaceRequest ( c * xgb . Conn , SurfaceId Surface ) [ ] byte {
size := 8
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2012-05-10 23:01:42 +02:00
b += 1
buf [ b ] = 5 // request opcode
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
xgb . Put32 ( buf [ b : ] , uint32 ( SurfaceId ) )
b += 4
return buf
}
2013-08-12 02:43:26 +02:00
// ListSubpictureTypesCookie is a cookie used only for ListSubpictureTypes requests.
type ListSubpictureTypesCookie struct {
2012-05-10 23:01:42 +02:00
* xgb . Cookie
}
2013-08-12 02:43:26 +02:00
// ListSubpictureTypes sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it will be returned with the reply by calling ListSubpictureTypesCookie.Reply.
2013-08-12 02:43:26 +02:00
func ListSubpictureTypes ( c * xgb . Conn , PortId xv . Port , SurfaceId Surface ) ListSubpictureTypesCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'ListSubpictureTypes' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( true , true )
2013-08-12 02:43:26 +02:00
c . NewRequest ( listSubpictureTypesRequest ( c , PortId , SurfaceId ) , cookie )
return ListSubpictureTypesCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// ListSubpictureTypesUnchecked sends an unchecked request.
2012-05-11 05:57:34 +02:00
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
2013-08-12 02:43:26 +02:00
func ListSubpictureTypesUnchecked ( c * xgb . Conn , PortId xv . Port , SurfaceId Surface ) ListSubpictureTypesCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'ListSubpictureTypes' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( false , true )
2013-08-12 02:43:26 +02:00
c . NewRequest ( listSubpictureTypesRequest ( c , PortId , SurfaceId ) , cookie )
return ListSubpictureTypesCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// ListSubpictureTypesReply represents the data returned from a ListSubpictureTypes request.
type ListSubpictureTypesReply struct {
2012-05-11 05:57:34 +02:00
Sequence uint16 // sequence number of the request for this reply
Length uint32 // number of bytes in this reply
2012-05-10 23:01:42 +02:00
// padding: 1 bytes
2013-08-12 02:43:26 +02:00
Num uint32
// padding: 20 bytes
Types [ ] xv . ImageFormatInfo // size: xv.ImageFormatInfoListSize(Types)
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// Reply blocks and returns the reply data for a ListSubpictureTypes request.
func ( cook ListSubpictureTypesCookie ) Reply ( ) ( * ListSubpictureTypesReply , error ) {
2012-05-10 23:01:42 +02:00
buf , err := cook . Cookie . Reply ( )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
2013-08-12 02:43:26 +02:00
return listSubpictureTypesReply ( buf ) , nil
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// listSubpictureTypesReply reads a byte slice into a ListSubpictureTypesReply value.
func listSubpictureTypesReply ( buf [ ] byte ) * ListSubpictureTypesReply {
v := new ( ListSubpictureTypesReply )
2012-05-10 23:01:42 +02:00
b := 1 // skip reply determinant
b += 1 // padding
v . Sequence = xgb . Get16 ( buf [ b : ] )
b += 2
v . Length = xgb . Get32 ( buf [ b : ] ) // 4-byte units
b += 4
2013-08-12 02:43:26 +02:00
v . Num = xgb . Get32 ( buf [ b : ] )
b += 4
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
b += 20 // padding
2012-05-10 23:01:42 +02:00
2013-08-12 02:43:26 +02:00
v . Types = make ( [ ] xv . ImageFormatInfo , v . Num )
b += xv . ImageFormatInfoReadList ( buf [ b : ] , v . Types )
2012-05-10 23:01:42 +02:00
return v
}
2018-09-30 16:32:47 +02:00
// listSubpictureTypesRequest writes a ListSubpictureTypes request to a byte slice for transfer.
2013-08-12 02:43:26 +02:00
func listSubpictureTypesRequest ( c * xgb . Conn , PortId xv . Port , SurfaceId Surface ) [ ] byte {
size := 12
2012-05-10 23:01:42 +02:00
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2012-05-10 23:01:42 +02:00
b += 1
2013-08-12 02:43:26 +02:00
buf [ b ] = 8 // request opcode
2012-05-10 23:01:42 +02:00
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
2013-08-12 02:43:26 +02:00
xgb . Put32 ( buf [ b : ] , uint32 ( PortId ) )
2012-05-10 23:01:42 +02:00
b += 4
2013-08-12 02:43:26 +02:00
xgb . Put32 ( buf [ b : ] , uint32 ( SurfaceId ) )
2012-05-10 23:01:42 +02:00
b += 4
return buf
}
2013-08-12 02:43:26 +02:00
// ListSurfaceTypesCookie is a cookie used only for ListSurfaceTypes requests.
type ListSurfaceTypesCookie struct {
2012-05-10 23:01:42 +02:00
* xgb . Cookie
}
2013-08-12 02:43:26 +02:00
// ListSurfaceTypes sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it will be returned with the reply by calling ListSurfaceTypesCookie.Reply.
2013-08-12 02:43:26 +02:00
func ListSurfaceTypes ( c * xgb . Conn , PortId xv . Port ) ListSurfaceTypesCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'ListSurfaceTypes' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2013-08-12 02:43:26 +02:00
cookie := c . NewCookie ( true , true )
c . NewRequest ( listSurfaceTypesRequest ( c , PortId ) , cookie )
return ListSurfaceTypesCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// ListSurfaceTypesUnchecked sends an unchecked request.
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
func ListSurfaceTypesUnchecked ( c * xgb . Conn , PortId xv . Port ) ListSurfaceTypesCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'ListSurfaceTypes' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2013-08-12 02:43:26 +02:00
cookie := c . NewCookie ( false , true )
c . NewRequest ( listSurfaceTypesRequest ( c , PortId ) , cookie )
return ListSurfaceTypesCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// ListSurfaceTypesReply represents the data returned from a ListSurfaceTypes request.
type ListSurfaceTypesReply struct {
Sequence uint16 // sequence number of the request for this reply
Length uint32 // number of bytes in this reply
// padding: 1 bytes
Num uint32
// padding: 20 bytes
Surfaces [ ] SurfaceInfo // size: xgb.Pad((int(Num) * 24))
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// Reply blocks and returns the reply data for a ListSurfaceTypes request.
func ( cook ListSurfaceTypesCookie ) Reply ( ) ( * ListSurfaceTypesReply , error ) {
buf , err := cook . Cookie . Reply ( )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
return listSurfaceTypesReply ( buf ) , nil
}
// listSurfaceTypesReply reads a byte slice into a ListSurfaceTypesReply value.
func listSurfaceTypesReply ( buf [ ] byte ) * ListSurfaceTypesReply {
v := new ( ListSurfaceTypesReply )
b := 1 // skip reply determinant
b += 1 // padding
v . Sequence = xgb . Get16 ( buf [ b : ] )
b += 2
v . Length = xgb . Get32 ( buf [ b : ] ) // 4-byte units
b += 4
v . Num = xgb . Get32 ( buf [ b : ] )
b += 4
b += 20 // padding
v . Surfaces = make ( [ ] SurfaceInfo , v . Num )
b += SurfaceInfoReadList ( buf [ b : ] , v . Surfaces )
return v
}
2018-09-30 16:32:47 +02:00
// listSurfaceTypesRequest writes a ListSurfaceTypes request to a byte slice for transfer.
2013-08-12 02:43:26 +02:00
func listSurfaceTypesRequest ( c * xgb . Conn , PortId xv . Port ) [ ] byte {
2012-05-10 23:01:42 +02:00
size := 8
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2012-05-10 23:01:42 +02:00
b += 1
2013-08-12 02:43:26 +02:00
buf [ b ] = 1 // request opcode
2012-05-10 23:01:42 +02:00
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
2013-08-12 02:43:26 +02:00
xgb . Put32 ( buf [ b : ] , uint32 ( PortId ) )
2012-05-10 23:01:42 +02:00
b += 4
return buf
}
2013-08-12 02:43:26 +02:00
// QueryVersionCookie is a cookie used only for QueryVersion requests.
type QueryVersionCookie struct {
2012-05-10 23:01:42 +02:00
* xgb . Cookie
}
2013-08-12 02:43:26 +02:00
// QueryVersion sends a checked request.
2018-09-30 16:32:47 +02:00
// If an error occurs, it will be returned with the reply by calling QueryVersionCookie.Reply.
2013-08-12 02:43:26 +02:00
func QueryVersion ( c * xgb . Conn ) QueryVersionCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'QueryVersion' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( true , true )
2013-08-12 02:43:26 +02:00
c . NewRequest ( queryVersionRequest ( c ) , cookie )
return QueryVersionCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// QueryVersionUnchecked sends an unchecked request.
2012-05-11 05:57:34 +02:00
// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
2013-08-12 02:43:26 +02:00
func QueryVersionUnchecked ( c * xgb . Conn ) QueryVersionCookie {
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
defer c . ExtLock . RUnlock ( )
2013-12-28 16:13:20 +01:00
if _ , ok := c . Extensions [ "XVideo-MotionCompensation" ] ; ! ok {
2013-08-12 02:43:26 +02:00
panic ( "Cannot issue request 'QueryVersion' using the uninitialized extension 'XVideo-MotionCompensation'. xvmc.Init(connObj) must be called first." )
2012-05-12 05:58:52 +02:00
}
2012-05-10 23:01:42 +02:00
cookie := c . NewCookie ( false , true )
2013-08-12 02:43:26 +02:00
c . NewRequest ( queryVersionRequest ( c ) , cookie )
return QueryVersionCookie { cookie }
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// QueryVersionReply represents the data returned from a QueryVersion request.
type QueryVersionReply struct {
2012-05-11 05:57:34 +02:00
Sequence uint16 // sequence number of the request for this reply
Length uint32 // number of bytes in this reply
2012-05-10 23:01:42 +02:00
// padding: 1 bytes
2013-08-12 02:43:26 +02:00
Major uint32
Minor uint32
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// Reply blocks and returns the reply data for a QueryVersion request.
func ( cook QueryVersionCookie ) Reply ( ) ( * QueryVersionReply , error ) {
2012-05-10 23:01:42 +02:00
buf , err := cook . Cookie . Reply ( )
if err != nil {
return nil , err
}
if buf == nil {
return nil , nil
}
2013-08-12 02:43:26 +02:00
return queryVersionReply ( buf ) , nil
2012-05-10 23:01:42 +02:00
}
2013-08-12 02:43:26 +02:00
// queryVersionReply reads a byte slice into a QueryVersionReply value.
func queryVersionReply ( buf [ ] byte ) * QueryVersionReply {
v := new ( QueryVersionReply )
2012-05-10 23:01:42 +02:00
b := 1 // skip reply determinant
b += 1 // padding
v . Sequence = xgb . Get16 ( buf [ b : ] )
b += 2
v . Length = xgb . Get32 ( buf [ b : ] ) // 4-byte units
b += 4
2013-08-12 02:43:26 +02:00
v . Major = xgb . Get32 ( buf [ b : ] )
2012-05-10 23:01:42 +02:00
b += 4
2013-08-12 02:43:26 +02:00
v . Minor = xgb . Get32 ( buf [ b : ] )
b += 4
2012-05-10 23:01:42 +02:00
return v
}
2018-09-30 16:32:47 +02:00
// queryVersionRequest writes a QueryVersion request to a byte slice for transfer.
2013-08-12 02:43:26 +02:00
func queryVersionRequest ( c * xgb . Conn ) [ ] byte {
size := 4
2012-05-10 23:01:42 +02:00
b := 0
buf := make ( [ ] byte , size )
2016-03-01 15:41:38 +01:00
c . ExtLock . RLock ( )
2013-12-28 16:13:20 +01:00
buf [ b ] = c . Extensions [ "XVideo-MotionCompensation" ]
2016-03-01 15:41:38 +01:00
c . ExtLock . RUnlock ( )
2012-05-10 23:01:42 +02:00
b += 1
2013-08-12 02:43:26 +02:00
buf [ b ] = 0 // request opcode
2012-05-10 23:01:42 +02:00
b += 1
xgb . Put16 ( buf [ b : ] , uint16 ( size / 4 ) ) // write request size in 4-byte units
b += 2
return buf
}