summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Cristau <jcristau@debian.org>2010-06-20 11:13:26 +0100
committerJulien Cristau <jcristau@debian.org>2010-10-20 21:42:51 +0200
commitbf3e98ea03747f3adcbdc73ef0cb5a3073e3c741 (patch)
treefad86a8eb076fd274d9f97ded1dafed8b3e6dd18
parentae87b4d299371c9ceac705d2da15eb8aefccd981 (diff)
Xephyr: use xcb-xv instead of libXv
Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net> Signed-off-by: Julien Cristau <jcristau@debian.org>
-rw-r--r--configure.ac2
-rw-r--r--hw/kdrive/ephyr/ephyrhostvideo.c914
-rw-r--r--hw/kdrive/ephyr/ephyrhostvideo.h44
-rw-r--r--hw/kdrive/ephyr/ephyrvideo.c47
4 files changed, 383 insertions, 624 deletions
diff --git a/configure.ac b/configure.ac
index 9a1ee4257..0cce083e6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2063,7 +2063,7 @@ if test "$KDRIVE" = yes; then
XEPHYR_REQUIRED_LIBS="x11 $LIBXEXT xau xdmcp xcb x11-xcb xcb-shape xcb-aux xcb-image xcb-icccm xcb-shm xcb-keysyms"
if test "x$XV" = xyes; then
- XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xv"
+ XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xcb-xv"
fi
if test "x$DRI" = xyes && test "x$GLX" = xyes; then
XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS $LIBGL libdrm xcb-glx xcb-xf86dri"
diff --git a/hw/kdrive/ephyr/ephyrhostvideo.c b/hw/kdrive/ephyr/ephyrhostvideo.c
index 600b50f74..945cb9e1a 100644
--- a/hw/kdrive/ephyr/ephyrhostvideo.c
+++ b/hw/kdrive/ephyr/ephyrhostvideo.c
@@ -38,12 +38,8 @@
#ifdef _XSERVER64
#undef _XSERVER64
#endif
-#include <X11/Xutil.h>
-#include <X11/Xlibint.h>
-#include <X11/extensions/Xvlib.h>
-#include <X11/extensions/Xvproto.h>
-#include <X11/extensions/Xext.h>
-#include <X11/extensions/extutil.h>
+#include <xcb/xv.h>
+#include <xcb/xcb_aux.h>
#define _HAVE_XALLOC_DECLS
#include "hostx.h"
@@ -58,300 +54,112 @@
#define FALSE 0
#endif /*FALSE*/
-static XExtensionInfo _xv_info_data;
-static XExtensionInfo *xv_info = &_xv_info_data;
-static char *xv_extension_name = XvName;
-static char *xv_error_string(Display *dpy, int code, XExtCodes *codes,
- char * buf, int n);
-static int xv_close_display(Display *dpy, XExtCodes *codes);
-static Bool xv_wire_to_event(Display *dpy, XEvent *host, xEvent *wire);
-
-static XExtensionHooks xv_extension_hooks = {
- NULL, /* create_gc */
- NULL, /* copy_gc */
- NULL, /* flush_gc */
- NULL, /* free_gc */
- NULL, /* create_font */
- NULL, /* free_font */
- xv_close_display, /* close_display */
- xv_wire_to_event, /* wire_to_event */
- NULL, /* event_to_wire */
- NULL, /* error */
- xv_error_string /* error_string */
-};
-
-
-static char *xv_error_list[] =
-{
- "BadPort", /* XvBadPort */
- "BadEncoding", /* XvBadEncoding */
- "BadControl" /* XvBadControl */
-};
-
-
-#define XvCheckExtension(dpy, i, val) \
- XextCheckExtension(dpy, i, xv_extension_name, val)
-#define XvGetReq(name, req) \
- WORD64ALIGN\
- if ((dpy->bufptr + SIZEOF(xv##name##Req)) > dpy->bufmax)\
- _XFlush(dpy);\
- req = (xv##name##Req *)(dpy->last_req = dpy->bufptr);\
- req->reqType = info->codes->major_opcode;\
- req->xvReqType = xv_##name; \
- req->length = (SIZEOF(xv##name##Req))>>2;\
- dpy->bufptr += SIZEOF(xv##name##Req);\
- dpy->request++
-
-static XEXT_GENERATE_CLOSE_DISPLAY (xv_close_display, xv_info)
-
-
-static XEXT_GENERATE_FIND_DISPLAY (xv_find_display, xv_info,
- xv_extension_name,
- &xv_extension_hooks,
- XvNumEvents, NULL)
-
-static XEXT_GENERATE_ERROR_STRING (xv_error_string, xv_extension_name,
- XvNumErrors, xv_error_list)
-
-struct _EphyrHostXVAdaptorArray {
- XvAdaptorInfo *adaptors ;
- unsigned int nb_adaptors ;
-};
-
-/*heavily copied from libx11*/
-#define BUFSIZE 2048
-static void
-ephyrHostXVLogXErrorEvent (Display *a_display,
- XErrorEvent *a_err_event,
- FILE *a_fp)
-{
- char buffer[BUFSIZ];
- char mesg[BUFSIZ];
- char number[32];
- const char *mtype = "XlibMessage";
- register _XExtension *ext = (_XExtension *)NULL;
- _XExtension *bext = (_XExtension *)NULL;
- Display *dpy = a_display ;
-
- XGetErrorText(dpy, a_err_event->error_code, buffer, BUFSIZ);
- XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
- (void) fprintf(a_fp, "%s: %s\n ", mesg, buffer);
- XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d",
- mesg, BUFSIZ);
- (void) fprintf(a_fp, mesg, a_err_event->request_code);
- if (a_err_event->request_code < 128) {
- sprintf(number, "%d", a_err_event->request_code);
- XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ);
- } else {
- for (ext = dpy->ext_procs;
- ext && (ext->codes.major_opcode != a_err_event->request_code);
- ext = ext->next)
- ;
- if (ext)
- strcpy(buffer, ext->name);
- else
- buffer[0] = '\0';
- }
- (void) fprintf(a_fp, " (%s)\n", buffer);
- if (a_err_event->request_code >= 128) {
- XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
- mesg, BUFSIZ);
- fputs(" ", a_fp);
- (void) fprintf(a_fp, mesg, a_err_event->minor_code);
- if (ext) {
- sprintf(mesg, "%s.%d", ext->name, a_err_event->minor_code);
- XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
- (void) fprintf(a_fp, " (%s)", buffer);
- }
- fputs("\n", a_fp);
- }
- if (a_err_event->error_code >= 128) {
- /* kludge, try to find the extension that caused it */
- buffer[0] = '\0';
- for (ext = dpy->ext_procs; ext; ext = ext->next) {
- if (ext->error_string)
- (*ext->error_string)(dpy, a_err_event->error_code, &ext->codes,
- buffer, BUFSIZ);
- if (buffer[0]) {
- bext = ext;
- break;
- }
- if (ext->codes.first_error &&
- ext->codes.first_error < (int)a_err_event->error_code &&
- (!bext || ext->codes.first_error > bext->codes.first_error))
- bext = ext;
- }
- if (bext)
- sprintf(buffer, "%s.%d", bext->name,
- a_err_event->error_code - bext->codes.first_error);
- else
- strcpy(buffer, "Value");
- XGetErrorDatabaseText(dpy, mtype, buffer, "", mesg, BUFSIZ);
- if (mesg[0]) {
- fputs(" ", a_fp);
- (void) fprintf(a_fp, mesg, a_err_event->resourceid);
- fputs("\n", a_fp);
- }
- /* let extensions try to print the values */
- for (ext = dpy->ext_procs; ext; ext = ext->next) {
- if (ext->error_values)
- (*ext->error_values)(dpy, a_err_event, a_fp);
- }
- } else if ((a_err_event->error_code == BadWindow) ||
- (a_err_event->error_code == BadPixmap) ||
- (a_err_event->error_code == BadCursor) ||
- (a_err_event->error_code == BadFont) ||
- (a_err_event->error_code == BadDrawable) ||
- (a_err_event->error_code == BadColor) ||
- (a_err_event->error_code == BadGC) ||
- (a_err_event->error_code == BadIDChoice) ||
- (a_err_event->error_code == BadValue) ||
- (a_err_event->error_code == BadAtom)) {
- if (a_err_event->error_code == BadValue)
- XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x",
- mesg, BUFSIZ);
- else if (a_err_event->error_code == BadAtom)
- XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x",
- mesg, BUFSIZ);
- else
- XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
- mesg, BUFSIZ);
- fputs(" ", a_fp);
- (void) fprintf(a_fp, mesg, a_err_event->resourceid);
- fputs("\n", a_fp);
- }
- XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d",
- mesg, BUFSIZ);
- fputs(" ", a_fp);
- (void) fprintf(a_fp, mesg, a_err_event->serial);
- XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
- mesg, BUFSIZ);
- fputs("\n ", a_fp);
- (void) fprintf(a_fp, mesg, dpy->request);
- fputs("\n", a_fp);
-}
-
-static int
-ephyrHostXVErrorHandler (Display *a_display,
- XErrorEvent *a_error_event)
-{
- EPHYR_LOG_ERROR ("got an error from the host xserver:\n") ;
- ephyrHostXVLogXErrorEvent (a_display, a_error_event, stderr) ;
- return Success ;
-}
-
void
ephyrHostXVInit (void)
{
- static Bool s_initialized ;
-
- if (s_initialized)
- return ;
- XSetErrorHandler (ephyrHostXVErrorHandler) ;
- s_initialized = TRUE ;
}
Bool
-ephyrHostXVQueryAdaptors (EphyrHostXVAdaptorArray **a_adaptors)
+ephyrHostXVQueryAdaptors (xcb_xv_query_adaptors_reply_t **a_adaptors)
{
- EphyrHostXVAdaptorArray *result=NULL ;
- int ret=0 ;
Bool is_ok=FALSE ;
+ xcb_connection_t *conn = hostx_get_xcbconn();
+ xcb_xv_query_adaptors_cookie_t cookie;
+ xcb_xv_query_adaptors_reply_t *reply = NULL;
+ xcb_generic_error_t *e = NULL;
EPHYR_RETURN_VAL_IF_FAIL (a_adaptors, FALSE) ;
EPHYR_LOG ("enter\n") ;
- result = calloc (1, sizeof (EphyrHostXVAdaptorArray)) ;
- if (!result)
- goto out ;
-
- ret = XvQueryAdaptors (hostx_get_display (),
- DefaultRootWindow (hostx_get_display ()),
- &result->nb_adaptors,
- &result->adaptors) ;
- if (ret != Success) {
- EPHYR_LOG_ERROR ("failed to query host adaptors: %d\n", ret) ;
- goto out ;
+ cookie = xcb_xv_query_adaptors(conn,
+ xcb_aux_get_screen(conn, hostx_get_screen())->root);
+ reply = xcb_xv_query_adaptors_reply(hostx_get_xcbconn(), cookie, &e);
+ if (e) {
+ EPHYR_LOG_ERROR ("failed to query host adaptors: %d\n", e->error_code);
+ goto out;
}
- *a_adaptors = result ;
- is_ok = TRUE ;
+ *a_adaptors = reply;
+ is_ok = TRUE;
out:
EPHYR_LOG ("leave\n") ;
+ free(e);
return is_ok ;
}
void
-ephyrHostXVAdaptorArrayDelete (EphyrHostXVAdaptorArray *a_adaptors)
+ephyrHostXVAdaptorArrayDelete (xcb_xv_query_adaptors_reply_t *a_adaptors)
{
- if (!a_adaptors)
- return ;
- if (a_adaptors->adaptors) {
- XvFreeAdaptorInfo (a_adaptors->adaptors) ;
- a_adaptors->adaptors = NULL ;
- a_adaptors->nb_adaptors = 0 ;
- }
- XFree (a_adaptors) ;
+ free (a_adaptors) ;
}
int
-ephyrHostXVAdaptorArrayGetSize (const EphyrHostXVAdaptorArray *a_this)
+ephyrHostXVAdaptorArrayGetSize (const xcb_xv_query_adaptors_reply_t *a_this)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this, -1) ;
- return a_this->nb_adaptors ;
+ return a_this->num_adaptors;
}
-EphyrHostXVAdaptor*
-ephyrHostXVAdaptorArrayAt (const EphyrHostXVAdaptorArray *a_this,
+xcb_xv_adaptor_info_t *
+ephyrHostXVAdaptorArrayAt (const xcb_xv_query_adaptors_reply_t *a_this,
int a_index)
{
+ int i;
+ xcb_xv_adaptor_info_iterator_t it;
EPHYR_RETURN_VAL_IF_FAIL (a_this, NULL) ;
-
- if (a_index >= a_this->nb_adaptors)
+
+ it = xcb_xv_query_adaptors_info_iterator(a_this);
+ if (a_index >= a_this->num_adaptors)
return NULL ;
- return (EphyrHostXVAdaptor*)&a_this->adaptors[a_index] ;
+ for (i = 0; i < a_index; i++)
+ xcb_xv_adaptor_info_next(&it);
+
+ return it.data;
}
char
-ephyrHostXVAdaptorGetType (const EphyrHostXVAdaptor *a_this)
+ephyrHostXVAdaptorGetType (const xcb_xv_adaptor_info_t *a_this)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this, -1) ;
- return ((XvAdaptorInfo*)a_this)->type ;
+ return a_this->type ;
}
-const char*
-ephyrHostXVAdaptorGetName (const EphyrHostXVAdaptor *a_this)
+char*
+ephyrHostXVAdaptorGetName (const xcb_xv_adaptor_info_t *a_this)
{
+ char *name;
+
EPHYR_RETURN_VAL_IF_FAIL (a_this, NULL) ;
- return ((XvAdaptorInfo*)a_this)->name ;
+ name = malloc(a_this->name_size + 1);
+ if (!name)
+ return NULL;
+ memcpy(name, xcb_xv_adaptor_info_name(a_this), a_this->name_size);
+ name[a_this->name_size] = '\0';
+
+ return name;
}
EphyrHostVideoFormat*
-ephyrHostXVAdaptorGetVideoFormats (const EphyrHostXVAdaptor *a_this,
+ephyrHostXVAdaptorGetVideoFormats (const xcb_xv_adaptor_info_t *a_this,
int *a_nb_formats)
{
EphyrHostVideoFormat *formats=NULL ;
int nb_formats=0, i=0 ;
- XVisualInfo *visual_info, visual_info_template ;
- int nb_visual_info ;
+ xcb_xv_format_t *format = xcb_xv_adaptor_info_formats(a_this);
EPHYR_RETURN_VAL_IF_FAIL (a_this, NULL) ;
- nb_formats = ((XvAdaptorInfo*)a_this)->num_formats ;
+ nb_formats = a_this->num_formats ;
formats = calloc (nb_formats, sizeof (EphyrHostVideoFormat)) ;
for (i=0; i < nb_formats; i++) {
- memset (&visual_info_template, 0, sizeof (visual_info_template)) ;
- visual_info_template.visualid =
- ((XvAdaptorInfo*)a_this)->formats[i].visual_id;
- visual_info = XGetVisualInfo (hostx_get_display (),
- VisualIDMask,
- &visual_info_template,
- &nb_visual_info) ;
- formats[i].depth = ((XvAdaptorInfo*)a_this)->formats[i].depth ;
- formats[i].visual_class = visual_info->class ;
- XFree (visual_info) ;
+ xcb_visualtype_t *visual =
+ xcb_aux_find_visual_by_id(
+ xcb_aux_get_screen(hostx_get_xcbconn(), hostx_get_screen()),
+ format[i].visual);
+ formats[i].depth = format[i].depth;
+ formats[i].visual_class = visual->_class;
}
if (a_nb_formats)
*a_nb_formats = nb_formats ;
@@ -359,29 +167,29 @@ ephyrHostXVAdaptorGetVideoFormats (const EphyrHostXVAdaptor *a_this,
}
int
-ephyrHostXVAdaptorGetNbPorts (const EphyrHostXVAdaptor *a_this)
+ephyrHostXVAdaptorGetNbPorts (const xcb_xv_adaptor_info_t *a_this)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this, -1) ;
- return ((XvAdaptorInfo*)a_this)->num_ports ;
+ return a_this->num_ports;
}
int
-ephyrHostXVAdaptorGetFirstPortID (const EphyrHostXVAdaptor *a_this)
+ephyrHostXVAdaptorGetFirstPortID (const xcb_xv_adaptor_info_t *a_this)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this, -1) ;
- return ((XvAdaptorInfo*)a_this)->base_id ;
+ return a_this->base_id;
}
Bool
-ephyrHostXVAdaptorHasPutVideo (const EphyrHostXVAdaptor *a_this,
+ephyrHostXVAdaptorHasPutVideo (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this && a_result, FALSE) ;
- if ((((XvAdaptorInfo*)a_this)->type & (XvVideoMask | XvInputMask)) ==
- (XvVideoMask | XvInputMask))
+ if ((a_this->type & (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_INPUT_MASK)) ==
+ (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_INPUT_MASK))
*a_result = TRUE ;
else
*a_result = FALSE ;
@@ -389,11 +197,11 @@ ephyrHostXVAdaptorHasPutVideo (const EphyrHostXVAdaptor *a_this,
}
Bool
-ephyrHostXVAdaptorHasGetVideo (const EphyrHostXVAdaptor *a_this,
+ephyrHostXVAdaptorHasGetVideo (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result)
{
- if ((((XvAdaptorInfo*)a_this)->type & (XvVideoMask | XvOutputMask)) ==
- (XvVideoMask | XvOutputMask))
+ if ((a_this->type & (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_OUTPUT_MASK)) ==
+ (XCB_XV_TYPE_VIDEO_MASK | XCB_XV_TYPE_OUTPUT_MASK))
*a_result = TRUE ;
else
*a_result = FALSE ;
@@ -401,13 +209,13 @@ ephyrHostXVAdaptorHasGetVideo (const EphyrHostXVAdaptor *a_this,
}
Bool
-ephyrHostXVAdaptorHasPutStill (const EphyrHostXVAdaptor *a_this,
+ephyrHostXVAdaptorHasPutStill (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this && a_result, FALSE) ;
- if ((((XvAdaptorInfo*)a_this)->type & (XvStillMask | XvInputMask)) ==
- (XvStillMask | XvInputMask))
+ if ((a_this->type & (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_INPUT_MASK)) ==
+ (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_INPUT_MASK))
*a_result = TRUE ;
else
*a_result = FALSE ;
@@ -415,13 +223,13 @@ ephyrHostXVAdaptorHasPutStill (const EphyrHostXVAdaptor *a_this,
}
Bool
-ephyrHostXVAdaptorHasGetStill (const EphyrHostXVAdaptor *a_this,
+ephyrHostXVAdaptorHasGetStill (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this && a_result, FALSE) ;
- if ((((XvAdaptorInfo*)a_this)->type & (XvStillMask | XvOutputMask)) ==
- (XvStillMask | XvOutputMask))
+ if ((a_this->type & (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_OUTPUT_MASK)) ==
+ (XCB_XV_TYPE_STILL_MASK | XCB_XV_TYPE_OUTPUT_MASK))
*a_result = TRUE ;
else
*a_result = FALSE ;
@@ -429,13 +237,13 @@ ephyrHostXVAdaptorHasGetStill (const EphyrHostXVAdaptor *a_this,
}
Bool
-ephyrHostXVAdaptorHasPutImage (const EphyrHostXVAdaptor *a_this,
+ephyrHostXVAdaptorHasPutImage (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result)
{
EPHYR_RETURN_VAL_IF_FAIL (a_this && a_result, FALSE) ;
- if ((((XvAdaptorInfo*)a_this)->type & (XvImageMask | XvInputMask)) ==
- (XvImageMask | XvInputMask))
+ if ((a_this->type & (XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK)) ==
+ (XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK))
*a_result = TRUE ;
else
*a_result = FALSE ;
@@ -448,36 +256,36 @@ ephyrHostXVQueryEncodings (int a_port_id,
unsigned int *a_num_encodings)
{
EphyrHostEncoding *encodings=NULL ;
- XvEncodingInfo *encoding_info=NULL ;
+ xcb_xv_encoding_info_iterator_t encoding_info;
+ xcb_xv_query_encodings_cookie_t cookie;
+ xcb_xv_query_encodings_reply_t *reply;
unsigned int num_encodings=0, i;
- int ret=0 ;
EPHYR_RETURN_VAL_IF_FAIL (a_encodings && a_num_encodings, FALSE) ;
- ret = XvQueryEncodings (hostx_get_display (),
- a_port_id,
- &num_encodings,
- &encoding_info) ;
- if (num_encodings && encoding_info) {
+ cookie = xcb_xv_query_encodings(hostx_get_xcbconn(), a_port_id);
+ reply = xcb_xv_query_encodings_reply(hostx_get_xcbconn(), cookie, NULL);
+ if (!reply)
+ return FALSE;
+ num_encodings = reply->num_encodings;
+ encoding_info = xcb_xv_query_encodings_info_iterator(reply);
+ if (num_encodings) {
encodings = calloc (num_encodings, sizeof (EphyrHostEncoding)) ;
- for (i=0; i<num_encodings; i++) {
- encodings[i].id = encoding_info[i].encoding_id ;
- encodings[i].name = strdup (encoding_info[i].name) ;
- encodings[i].width = encoding_info[i].width ;
- encodings[i].height = encoding_info[i].height ;
- encodings[i].rate.numerator = encoding_info[i].rate.numerator ;
- encodings[i].rate.denominator = encoding_info[i].rate.denominator ;
+ for (i=0; i<num_encodings; i++, xcb_xv_encoding_info_next(&encoding_info)) {
+ encodings[i].id = encoding_info.data->encoding;
+ encodings[i].name = malloc(encoding_info.data->name_size + 1);
+ memcpy(encodings[i].name, xcb_xv_encoding_info_name(encoding_info.data), encoding_info.data->name_size);
+ encodings[i].name[encoding_info.data->name_size] = '\0';
+ encodings[i].width = encoding_info.data->width;
+ encodings[i].height = encoding_info.data->height;
+ encodings[i].rate.numerator = encoding_info.data->rate.numerator;
+ encodings[i].rate.denominator = encoding_info.data->rate.denominator;
}
}
- if (encoding_info) {
- XvFreeEncodingInfo (encoding_info) ;
- encoding_info = NULL ;
- }
+ free(reply);
*a_encodings = encodings ;
*a_num_encodings = num_encodings ;
- if (ret != Success)
- return FALSE ;
return TRUE ;
}
@@ -497,26 +305,26 @@ ephyrHostEncodingsDelete (EphyrHostEncoding *a_encodings,
}
void
-ephyrHostAttributesDelete (EphyrHostAttribute *a_attributes)
+ephyrHostAttributesDelete (xcb_xv_query_port_attributes_reply_t *a_attributes)
{
- if (!a_attributes)
- return ;
- XFree (a_attributes) ;
+ free (a_attributes) ;
}
Bool
ephyrHostXVQueryPortAttributes (int a_port_id,
- EphyrHostAttribute **a_attributes,
- int *a_num_attributes)
+ xcb_xv_query_port_attributes_reply_t **a_attributes)
{
- EPHYR_RETURN_VAL_IF_FAIL (a_attributes && a_num_attributes, FALSE) ;
+ xcb_xv_query_port_attributes_cookie_t cookie;
+ xcb_xv_query_port_attributes_reply_t *reply;
+ xcb_connection_t *conn = hostx_get_xcbconn();
- *a_attributes =
- (EphyrHostAttribute*)XvQueryPortAttributes (hostx_get_display (),
- a_port_id,
- a_num_attributes);
+ EPHYR_RETURN_VAL_IF_FAIL (a_attributes, FALSE) ;
- return TRUE ;
+ cookie = xcb_xv_query_port_attributes(conn, a_port_id);
+ reply = xcb_xv_query_port_attributes_reply(conn, cookie, NULL);
+ *a_attributes = reply;
+
+ return (reply != NULL);
}
Bool
@@ -524,14 +332,53 @@ ephyrHostXVQueryImageFormats (int a_port_id,
EphyrHostImageFormat **a_formats,
int *a_num_format)
{
- XvImageFormatValues *result=NULL ;
+ xcb_connection_t *conn = hostx_get_xcbconn();
+ xcb_xv_list_image_formats_cookie_t cookie;
+ xcb_xv_list_image_formats_reply_t *reply;
+ xcb_xv_image_format_info_t *format;
+ EphyrHostImageFormat *ephyrFormats;
+ int i;
EPHYR_RETURN_VAL_IF_FAIL (a_formats && a_num_format, FALSE) ;
- result = XvListImageFormats (hostx_get_display (),
- a_port_id,
- a_num_format) ;
- *a_formats = (EphyrHostImageFormat*) result ;
+ cookie = xcb_xv_list_image_formats(conn, a_port_id);
+ reply = xcb_xv_list_image_formats_reply(conn, cookie, NULL);
+ if (!reply)
+ return FALSE;
+ *a_num_format = reply->num_formats;
+ ephyrFormats = calloc(reply->num_formats, sizeof(EphyrHostImageFormat));
+ if (!ephyrFormats) {
+ free(reply);
+ return FALSE;
+ }
+ format = xcb_xv_list_image_formats_format(reply);
+ for (i = 0; i < reply->num_formats; i++) {
+ ephyrFormats[i].id = format[i].id;
+ ephyrFormats[i].type = format[i].type;
+ ephyrFormats[i].byte_order = format[i].byte_order;
+ memcpy(ephyrFormats[i].guid, format[i].guid, 16);
+ ephyrFormats[i].bits_per_pixel = format[i].bpp;
+ ephyrFormats[i].format = format[i].format;
+ ephyrFormats[i].num_planes = format[i].num_planes;
+ ephyrFormats[i].depth = format[i].depth;
+ ephyrFormats[i].red_mask = format[i].red_mask;
+ ephyrFormats[i].green_mask = format[i].green_mask;
+ ephyrFormats[i].blue_mask = format[i].blue_mask;
+ ephyrFormats[i].y_sample_bits = format[i].y_sample_bits;
+ ephyrFormats[i].u_sample_bits = format[i].u_sample_bits;
+ ephyrFormats[i].v_sample_bits = format[i].v_sample_bits;
+ ephyrFormats[i].horz_y_period = format[i].vhorz_y_period;
+ ephyrFormats[i].horz_u_period = format[i].vhorz_u_period;
+ ephyrFormats[i].horz_v_period = format[i].vhorz_v_period;
+ ephyrFormats[i].vert_y_period = format[i].vvert_y_period;
+ ephyrFormats[i].vert_u_period = format[i].vvert_u_period;
+ ephyrFormats[i].vert_v_period = format[i].vvert_v_period;
+ memcpy(ephyrFormats[i].component_order, format[i].vcomp_order, 32);
+ ephyrFormats[i].scanline_order = format[i].vscanline_order;
+ }
+ *a_formats = ephyrFormats;
+
+ free(reply);
return TRUE ;
}
@@ -541,22 +388,15 @@ ephyrHostXVSetPortAttribute (int a_port_id,
int a_atom,
int a_attr_value)
{
- int res=Success ;
-
- EPHYR_LOG ("atom,name,value: (%d,%s,%d)\n",
+ EPHYR_LOG ("atom,value: (%d,%d)\n",
a_atom,
- XGetAtomName (hostx_get_display (), a_atom),
a_attr_value) ;
- res = XvSetPortAttribute (hostx_get_display (),
+ xcb_xv_set_port_attribute(hostx_get_xcbconn(),
a_port_id,
a_atom,
- a_attr_value) ;
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvSetPortAttribute() failed: %d\n", res) ;
- return FALSE ;
- }
- XFlush (hostx_get_display ()) ;
+ a_attr_value);
+ xcb_flush(hostx_get_xcbconn());
EPHYR_LOG ("leave\n") ;
return TRUE ;
@@ -567,27 +407,30 @@ ephyrHostXVGetPortAttribute (int a_port_id,
int a_atom,
int *a_attr_value)
{
- int res=Success ;
Bool ret=FALSE ;
+ xcb_connection_t *conn = hostx_get_xcbconn();
+ xcb_xv_get_port_attribute_cookie_t cookie;
+ xcb_xv_get_port_attribute_reply_t *reply;
+ xcb_generic_error_t *e;
EPHYR_RETURN_VAL_IF_FAIL (a_attr_value, FALSE) ;
- EPHYR_LOG ("enter, a_port_id: %d, a_atomid: %d, attr_name: %s\n",
- a_port_id, a_atom, XGetAtomName (hostx_get_display (), a_atom)) ;
+ EPHYR_LOG ("enter, a_port_id: %d, a_atomid: %d\n", a_port_id, a_atom) ;
- res = XvGetPortAttribute (hostx_get_display (),
- a_port_id,
- a_atom,
- a_attr_value) ;
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvGetPortAttribute() failed: %d \n", res) ;
+ cookie = xcb_xv_get_port_attribute(conn, a_port_id, a_atom);
+ reply = xcb_xv_get_port_attribute_reply(conn, cookie, &e);
+ if (e) {
+ EPHYR_LOG_ERROR ("XvGetPortAttribute() failed: %d \n", e->error_code) ;
+ free(e);
goto out ;
}
+ *a_attr_value = reply->value;
EPHYR_LOG ("atom,value: (%d, %d)\n", a_atom, *a_attr_value) ;
ret = TRUE ;
out:
+ free(reply);
EPHYR_LOG ("leave\n") ;
return ret ;
}
@@ -602,8 +445,9 @@ ephyrHostXVQueryBestSize (int a_port_id,
unsigned int *a_actual_w,
unsigned int *a_actual_h)
{
- int res=0 ;
Bool is_ok=FALSE ;
+ xcb_xv_query_best_size_cookie_t cookie;
+ xcb_xv_query_best_size_reply_t *reply;
EPHYR_RETURN_VAL_IF_FAIL (a_actual_w && a_actual_h, FALSE) ;
@@ -611,17 +455,19 @@ ephyrHostXVQueryBestSize (int a_port_id,
a_frame_w, a_frame_h,
a_drw_w, a_drw_h) ;
- res = XvQueryBestSize (hostx_get_display (),
- a_port_id,
- a_motion,
- a_frame_w, a_frame_h,
- a_drw_w, a_drw_h,
- a_actual_w, a_actual_h) ;
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvQueryBestSize() failed: %d\n", res) ;
+ cookie = xcb_xv_query_best_size(hostx_get_xcbconn(),
+ a_port_id,
+ a_frame_w, a_frame_h,
+ a_drw_w, a_drw_h,
+ a_motion);
+ reply = xcb_xv_query_best_size_reply(hostx_get_xcbconn(), cookie, NULL);
+ if (!reply) {
+ EPHYR_LOG_ERROR ("XvQueryBestSize() failed\n");
goto out ;
}
- XSync (hostx_get_display (), FALSE) ;
+ *a_actual_w = reply->actual_width;
+ *a_actual_h = reply->actual_height;
+ free(reply);
EPHYR_LOG ("actual (%dx%d)\n", *a_actual_w, *a_actual_h) ;
is_ok = TRUE ;
@@ -631,45 +477,6 @@ out:
return is_ok ;
}
-static Bool
-xv_wire_to_event(Display *dpy, XEvent *host, xEvent *wire)
-{
- XExtDisplayInfo *info = xv_find_display (dpy);
- XvEvent *re = (XvEvent *)host;
- xvEvent *event = (xvEvent *)wire;
-
- XvCheckExtension(dpy, info, False);
-
- switch ((event->u.u.type & 0x7F) - info->codes->first_event) {
- case XvVideoNotify:
- re->xvvideo.type = event->u.u.type & 0x7f;
- re->xvvideo.serial =
- _XSetLastRequestRead(dpy, (xGenericReply *)event);
- re->xvvideo.send_event = ((event->u.u.type & 0x80) != 0);
- re->xvvideo.display = dpy;
- re->xvvideo.time = event->u.videoNotify.time;
- re->xvvideo.reason = event->u.videoNotify.reason;
- re->xvvideo.drawable = event->u.videoNotify.drawable;
- re->xvvideo.port_id = event->u.videoNotify.port;
- break;
- case XvPortNotify:
- re->xvport.type = event->u.u.type & 0x7f;
- re->xvport.serial =
- _XSetLastRequestRead(dpy, (xGenericReply *)event);
- re->xvport.send_event = ((event->u.u.type & 0x80) != 0);
- re->xvport.display = dpy;
- re->xvport.time = event->u.portNotify.time;
- re->xvport.port_id = event->u.portNotify.port;
- re->xvport.attribute = event->u.portNotify.attribute;
- re->xvport.value = event->u.portNotify.value;
- break;
- default:
- return False;
- }
-
- return True ;
-}
-
Bool
ephyrHostXVQueryImageAttributes (int a_port_id,
int a_image_id /*image fourcc code*/,
@@ -679,52 +486,34 @@ ephyrHostXVQueryImageAttributes (int a_port_id,
int *a_pitches,
int *a_offsets)
{
- Display *dpy = hostx_get_display () ;
- Bool ret=FALSE ;
- XExtDisplayInfo *info = xv_find_display (dpy);
- xvQueryImageAttributesReq *req=NULL;
- xvQueryImageAttributesReply rep;
+ xcb_connection_t *conn = hostx_get_xcbconn () ;
+ xcb_xv_query_image_attributes_cookie_t cookie;
+ xcb_xv_query_image_attributes_reply_t *reply;
EPHYR_RETURN_VAL_IF_FAIL (a_width, FALSE) ;
EPHYR_RETURN_VAL_IF_FAIL (a_height, FALSE) ;
EPHYR_RETURN_VAL_IF_FAIL (a_image_size, FALSE) ;
- XvCheckExtension (dpy, info, FALSE);
-
- LockDisplay (dpy);
-
- XvGetReq (QueryImageAttributes, req);
- req->id = a_image_id;
- req->port = a_port_id;
- req->width = *a_width;
- req->height = *a_height;
- /*
- * read the reply
- */
- if (!_XReply (dpy, (xReply *)&rep, 0, xFalse)) {
- EPHYR_LOG_ERROR ("QeryImageAttribute req failed\n") ;
- goto out ;
- }
+ cookie = xcb_xv_query_image_attributes(conn,
+ a_port_id, a_image_id,
+ *a_width, *a_height);
+ reply = xcb_xv_query_image_attributes_reply(conn, cookie, NULL);
+ if (!reply)
+ return FALSE;
if (a_pitches && a_offsets) {
- _XRead (dpy,
- (char*)a_pitches,
- rep.num_planes << 2);
- _XRead (dpy,
- (char*)a_offsets,
- rep.num_planes << 2);
- } else {
- _XEatData(dpy, rep.length << 2);
+ memcpy(a_pitches,
+ xcb_xv_query_image_attributes_pitches(reply),
+ reply->num_planes << 2);
+ memcpy(a_offsets,
+ xcb_xv_query_image_attributes_offsets(reply),
+ reply->num_planes << 2);
}
- *a_width = rep.width ;
- *a_height = rep.height ;
- *a_image_size = rep.data_size ;
-
- ret = TRUE ;
+ *a_width = reply->width ;
+ *a_height = reply->height ;
+ *a_image_size = reply->data_size ;
+ free(reply);
-out:
- UnlockDisplay (dpy) ;
- SyncHandle ();
- return ret ;
+ return TRUE;
}
Bool
@@ -732,29 +521,51 @@ ephyrHostGetAtom (const char* a_name,
Bool a_create_if_not_exists,
int *a_atom)
{
- int atom=None ;
+ xcb_connection_t *conn = hostx_get_xcbconn();
+ xcb_intern_atom_cookie_t cookie;
+ xcb_intern_atom_reply_t *reply;
EPHYR_RETURN_VAL_IF_FAIL (a_atom, FALSE) ;
- atom = XInternAtom (hostx_get_display (), a_name, a_create_if_not_exists);
- if (atom == None) {
+ cookie = xcb_intern_atom(conn,
+ a_create_if_not_exists,
+ strlen(a_name),
+ a_name);
+ reply = xcb_intern_atom_reply(conn, cookie, NULL);
+ if (!reply || reply->atom == None) {
+ free(reply);
return FALSE ;
}
- *a_atom = atom ;
+ *a_atom = reply->atom;
+ free(reply);
return TRUE ;
}
char*
ephyrHostGetAtomName (int a_atom)
{
- return XGetAtomName (hostx_get_display (), a_atom) ;
+ xcb_connection_t *conn = hostx_get_xcbconn();
+ xcb_get_atom_name_cookie_t cookie;
+ xcb_get_atom_name_reply_t *reply;
+ char *ret;
+
+ cookie = xcb_get_atom_name(conn, a_atom);
+ reply = xcb_get_atom_name_reply(conn, cookie, NULL);
+ if (!reply)
+ return NULL;
+ ret = malloc(xcb_get_atom_name_name_length(reply) + 1);
+ if (ret) {
+ memcpy(ret, xcb_get_atom_name_name(reply), xcb_get_atom_name_name_length(reply));
+ ret[xcb_get_atom_name_name_length(reply)] = '\0';
+ }
+ free(reply);
+ return ret;
}
void
ephyrHostFree (void *a_pointer)
{
- if (a_pointer)
- XFree (a_pointer) ;
+ free (a_pointer);
}
Bool
@@ -776,34 +587,38 @@ ephyrHostXVPutImage (int a_screen_num,
int a_clip_rect_nums )
{
Bool is_ok=TRUE ;
- XvImage *xv_image=NULL ;
- GC gc=0 ;
- XGCValues gc_values;
- Display *dpy = hostx_get_display () ;
- XRectangle *rects=NULL ;
- int res = 0 ;
+ xcb_gcontext_t gc;
+ xcb_connection_t *conn = hostx_get_xcbconn () ;
+ xcb_rectangle_t *rects=NULL ;
+ int data_len, width, height;
+ xcb_xv_query_image_attributes_cookie_t image_attr_cookie;
+ xcb_xv_query_image_attributes_reply_t *image_attr_reply;
EPHYR_RETURN_VAL_IF_FAIL (a_buf, FALSE) ;
EPHYR_LOG ("enter, num_clip_rects: %d\n", a_clip_rect_nums) ;
- memset (&gc_values, 0, sizeof (gc_values)) ;
- gc = XCreateGC (dpy, hostx_get_window (a_screen_num), 0L, &gc_values);
- if (!gc) {
- EPHYR_LOG_ERROR ("failed to create gc \n") ;
- goto out ;
- }
- xv_image = (XvImage*) XvCreateImage (hostx_get_display (),
- a_port_id, a_image_id,
- NULL, a_image_width, a_image_height) ;
- if (!xv_image) {
- EPHYR_LOG_ERROR ("failed to create image\n") ;
- goto out ;
- }
- xv_image->data = (char*)a_buf ;
+ gc = xcb_generate_id(conn);
+ xcb_create_gc(conn, gc, hostx_get_window(a_screen_num), 0, NULL);
+
+ image_attr_cookie = xcb_xv_query_image_attributes(conn,
+ a_port_id,
+ a_image_id,
+ a_image_width,
+ a_image_height);
+ image_attr_reply = xcb_xv_query_image_attributes_reply(conn,
+ image_attr_cookie,
+ NULL);
+ if (!image_attr_reply)
+ goto out;
+ data_len = image_attr_reply->data_size;
+ width = image_attr_reply->width;
+ height = image_attr_reply->height;
+ free(image_attr_reply);
+
if (a_clip_rect_nums) {
int i=0 ;
- rects = calloc (a_clip_rect_nums, sizeof (XRectangle)) ;
+ rects = calloc (a_clip_rect_nums, sizeof (xcb_rectangle_t)) ;
for (i=0; i < a_clip_rect_nums; i++) {
rects[i].x = a_clip_rects[i].x1 ;
rects[i].y = a_clip_rects[i].y1 ;
@@ -813,31 +628,28 @@ ephyrHostXVPutImage (int a_screen_num,
rects[i].x, rects[i].y,
rects[i].width, rects[i].height) ;
}
- XSetClipRectangles (dpy, gc, 0, 0, rects, a_clip_rect_nums, YXBanded) ;
- /*this always returns 1*/
- }
- res = XvPutImage (dpy, a_port_id,
- hostx_get_window (a_screen_num),
- gc, xv_image,
- a_src_x, a_src_y, a_src_w, a_src_h,
- a_drw_x, a_drw_y, a_drw_w, a_drw_h) ;
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvPutImage() failed: %d\n", res) ;
- goto out ;
- }
- is_ok = TRUE ;
+ xcb_set_clip_rectangles(conn,
+ XCB_CLIP_ORDERING_YX_BANDED,
+ gc,
+ 0,
+ 0,
+ a_clip_rect_nums,
+ rects);
+ free(rects);
+ }
+ xcb_xv_put_image(conn,
+ a_port_id,
+ hostx_get_window (a_screen_num),
+ gc,
+ a_image_id,
+ a_src_x, a_src_y, a_src_w, a_src_h,
+ a_drw_x, a_drw_y, a_drw_w, a_drw_h,
+ width, height,
+ data_len, a_buf);
+ is_ok = TRUE;
out:
- if (xv_image) {
- XFree (xv_image) ;
- xv_image = NULL ;
- }
- if (gc) {
- XFreeGC (dpy, gc) ;
- gc = NULL ;
- }
- free(rects);
- rects = NULL;
+ xcb_free_gc(conn, gc);
EPHYR_LOG ("leave\n") ;
return is_ok ;
}
@@ -848,34 +660,22 @@ ephyrHostXVPutVideo (int a_screen_num, int a_port_id,
int a_drw_x, int a_drw_y, int a_drw_w, int a_drw_h)
{
Bool is_ok=FALSE ;
- int res=FALSE ;
- GC gc=0 ;
- XGCValues gc_values;
- Display *dpy=hostx_get_display () ;
-
- EPHYR_RETURN_VAL_IF_FAIL (dpy, FALSE) ;
-
- gc = XCreateGC (dpy, hostx_get_window (a_screen_num), 0L, &gc_values);
- if (!gc) {
- EPHYR_LOG_ERROR ("failed to create gc \n") ;
- goto out ;
- }
- res = XvPutVideo (dpy, a_port_id, hostx_get_window (a_screen_num), gc,
- a_vid_x, a_vid_y, a_vid_w, a_vid_h,
- a_drw_x, a_drw_y, a_drw_w, a_drw_h) ;
-
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvPutVideo() failed: %d\n", res) ;
- goto out ;
- }
-
+ xcb_gcontext_t gc;
+ xcb_connection_t *conn = hostx_get_xcbconn() ;
+
+ EPHYR_RETURN_VAL_IF_FAIL (conn, FALSE) ;
+
+ gc = xcb_generate_id(conn);
+ xcb_create_gc(conn, gc, hostx_get_window (a_screen_num), 0, NULL);
+ xcb_xv_put_video(conn,
+ a_port_id,
+ hostx_get_window (a_screen_num), gc,
+ a_vid_x, a_vid_y, a_vid_w, a_vid_h,
+ a_drw_x, a_drw_y, a_drw_w, a_drw_h);
is_ok = TRUE ;
-out:
- if (gc) {
- XFreeGC (dpy, gc) ;
- gc = NULL ;
- }
+ xcb_free_gc(conn, gc);
+
return is_ok ;
}
@@ -885,34 +685,27 @@ ephyrHostXVGetVideo (int a_screen_num, int a_port_id,
int a_drw_x, int a_drw_y, int a_drw_w, int a_drw_h)
{
Bool is_ok=FALSE ;
- int res=FALSE ;
- GC gc=0 ;
- XGCValues gc_values;
- Display *dpy=hostx_get_display () ;
-
- EPHYR_RETURN_VAL_IF_FAIL (dpy, FALSE) ;
-
- gc = XCreateGC (dpy, hostx_get_window (a_screen_num), 0L, &gc_values);
- if (!gc) {
- EPHYR_LOG_ERROR ("failed to create gc \n") ;
- goto out ;
- }
- res = XvGetVideo (dpy, a_port_id, hostx_get_window (a_screen_num), gc,
- a_vid_x, a_vid_y, a_vid_w, a_vid_h,
- a_drw_x, a_drw_y, a_drw_w, a_drw_h) ;
-
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvGetVideo() failed: %d\n", res) ;
- goto out ;
- }
+ xcb_gcontext_t gc;
+ xcb_connection_t *conn = hostx_get_xcbconn();
+
+ EPHYR_RETURN_VAL_IF_FAIL (conn, FALSE) ;
+
+ gc = xcb_generate_id(conn);
+ xcb_create_gc(conn,
+ gc,
+ hostx_get_window (a_screen_num),
+ 0, NULL);
+ xcb_xv_get_video(conn,
+ a_port_id,
+ hostx_get_window (a_screen_num),
+ gc,
+ a_vid_x, a_vid_y, a_vid_w, a_vid_h,
+ a_drw_x, a_drw_y, a_drw_w, a_drw_h);
is_ok = TRUE ;
-out:
- if (gc) {
- XFreeGC (dpy, gc) ;
- gc = NULL ;
- }
+ xcb_free_gc(conn, gc);
+
return is_ok ;
}
@@ -921,36 +714,26 @@ ephyrHostXVPutStill (int a_screen_num, int a_port_id,
int a_vid_x, int a_vid_y, int a_vid_w, int a_vid_h,
int a_drw_x, int a_drw_y, int a_drw_w, int a_drw_h)
{
- Bool is_ok=FALSE ;
- int res=FALSE ;
- GC gc=0 ;
- XGCValues gc_values;
- Display *dpy=hostx_get_display () ;
+ xcb_connection_t *conn=hostx_get_xcbconn();
+ xcb_gcontext_t gc;
- EPHYR_RETURN_VAL_IF_FAIL (dpy, FALSE) ;
+ EPHYR_RETURN_VAL_IF_FAIL (conn, FALSE) ;
- gc = XCreateGC (dpy, hostx_get_window (a_screen_num), 0L, &gc_values);
- if (!gc) {
- EPHYR_LOG_ERROR ("failed to create gc \n") ;
- goto out ;
- }
- res = XvPutStill (dpy, a_port_id, hostx_get_window (a_screen_num), gc,
- a_vid_x, a_vid_y, a_vid_w, a_vid_h,
- a_drw_x, a_drw_y, a_drw_w, a_drw_h) ;
+ gc = xcb_generate_id(conn);
+ xcb_create_gc(conn,
+ gc,
+ hostx_get_window (a_screen_num),
+ 0, NULL);
+ xcb_xv_put_still(conn,
+ a_port_id,
+ hostx_get_window (a_screen_num),
+ gc,
+ a_vid_x, a_vid_y, a_vid_w, a_vid_h,
+ a_drw_x, a_drw_y, a_drw_w, a_drw_h) ;
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvPutStill() failed: %d\n", res) ;
- goto out ;
- }
-
- is_ok = TRUE ;
+ xcb_free_gc(conn, gc);
-out:
- if (gc) {
- XFreeGC (dpy, gc) ;
- gc = NULL ;
- }
- return is_ok ;
+ return TRUE;
}
Bool
@@ -958,58 +741,39 @@ ephyrHostXVGetStill (int a_screen_num, int a_port_id,
int a_vid_x, int a_vid_y, int a_vid_w, int a_vid_h,
int a_drw_x, int a_drw_y, int a_drw_w, int a_drw_h)
{
- Bool is_ok=FALSE ;
- int res=FALSE ;
- GC gc=0 ;
- XGCValues gc_values;
- Display *dpy=hostx_get_display () ;
+ xcb_gcontext_t gc;
+ xcb_connection_t *conn = hostx_get_xcbconn();
- EPHYR_RETURN_VAL_IF_FAIL (dpy, FALSE) ;
+ EPHYR_RETURN_VAL_IF_FAIL (conn, FALSE) ;
- gc = XCreateGC (dpy, hostx_get_window (a_screen_num), 0L, &gc_values);
- if (!gc) {
- EPHYR_LOG_ERROR ("failed to create gc \n") ;
- goto out ;
- }
- res = XvGetStill (dpy, a_port_id, hostx_get_window (a_screen_num), gc,
- a_vid_x, a_vid_y, a_vid_w, a_vid_h,
- a_drw_x, a_drw_y, a_drw_w, a_drw_h) ;
+ gc = xcb_generate_id(conn);
+ xcb_create_gc(conn,
+ gc,
+ hostx_get_window (a_screen_num),
+ 0, NULL);
+ xcb_xv_get_still(conn,
+ a_port_id,
+ hostx_get_window (a_screen_num),
+ gc,
+ a_vid_x, a_vid_y, a_vid_w, a_vid_h,
+ a_drw_x, a_drw_y, a_drw_w, a_drw_h);
+ xcb_free_gc(conn, gc);
- if (res != Success) {
- EPHYR_LOG_ERROR ("XvGetStill() failed: %d\n", res) ;
- goto out ;
- }
-
- is_ok = TRUE ;
-
-out:
- if (gc) {
- XFreeGC (dpy, gc) ;
- gc = NULL ;
- }
- return is_ok ;
+ return TRUE;
}
Bool
ephyrHostXVStopVideo (int a_screen_num, int a_port_id)
{
- int ret=0 ;
- Bool is_ok=FALSE ;
- Display *dpy = hostx_get_display () ;
+ xcb_connection_t *conn = hostx_get_xcbconn();
- EPHYR_RETURN_VAL_IF_FAIL (dpy, FALSE) ;
+ EPHYR_RETURN_VAL_IF_FAIL (conn, FALSE) ;
EPHYR_LOG ("enter\n") ;
- ret = XvStopVideo (dpy, a_port_id, hostx_get_window (a_screen_num)) ;
- if (ret != Success) {
- EPHYR_LOG_ERROR ("XvStopVideo() failed: %d \n", ret) ;
- goto out ;
- }
- is_ok = TRUE ;
+ xcb_xv_stop_video(conn, a_port_id, hostx_get_window (a_screen_num));
-out:
EPHYR_LOG ("leave\n") ;
- return is_ok ;
+ return TRUE;
}
diff --git a/hw/kdrive/ephyr/ephyrhostvideo.h b/hw/kdrive/ephyr/ephyrhostvideo.h
index 05ee38a03..bfb8b251e 100644
--- a/hw/kdrive/ephyr/ephyrhostvideo.h
+++ b/hw/kdrive/ephyr/ephyrhostvideo.h
@@ -28,8 +28,8 @@
#ifndef __EPHYRHOSTVIDEO_H__
#define __EPHYRHOSTVIDEO_H__
-typedef void* EphyrHostXVAdaptor ;
-typedef struct _EphyrHostXVAdaptorArray EphyrHostXVAdaptorArray ;
+#include <xcb/xv.h>
+#include <X11/Xdefs.h>
typedef struct _EphyrHostVideoFormat {
char depth ;
@@ -48,13 +48,6 @@ typedef struct _EphyrHostEncoding {
EphyrHostRational rate ;
} EphyrHostEncoding ;
-typedef struct _EphyrHostAttribute {
- int flags;
- int min_value;
- int max_value;
- char *name;
-} EphyrHostAttribute ;
-
typedef struct _EphyrHostImageFormat {
int id; /* Unique descriptor for the format */
int type; /* XvRGB, XvYUV */
@@ -95,33 +88,33 @@ void ephyrHostFree (void *a_pointer) ;
/*
* host adaptor array
*/
-Bool ephyrHostXVQueryAdaptors (EphyrHostXVAdaptorArray **a_adaptors) ;
-void ephyrHostXVAdaptorArrayDelete (EphyrHostXVAdaptorArray *a_adaptors) ;
-int ephyrHostXVAdaptorArrayGetSize (const EphyrHostXVAdaptorArray *a_this) ;
-EphyrHostXVAdaptor* ephyrHostXVAdaptorArrayAt (const EphyrHostXVAdaptorArray *a_this,
+Bool ephyrHostXVQueryAdaptors (xcb_xv_query_adaptors_reply_t **a_adaptors) ;
+void ephyrHostXVAdaptorArrayDelete (xcb_xv_query_adaptors_reply_t *a_adaptors) ;
+int ephyrHostXVAdaptorArrayGetSize (const xcb_xv_query_adaptors_reply_t *a_this) ;
+xcb_xv_adaptor_info_t* ephyrHostXVAdaptorArrayAt (const xcb_xv_query_adaptors_reply_t *a_this,
int a_index) ;
/*
* host adaptor
*/
-char ephyrHostXVAdaptorGetType (const EphyrHostXVAdaptor *a_this) ;
-const char* ephyrHostXVAdaptorGetName (const EphyrHostXVAdaptor *a_this) ;
+char ephyrHostXVAdaptorGetType (const xcb_xv_adaptor_info_t *a_this) ;
+char* ephyrHostXVAdaptorGetName (const xcb_xv_adaptor_info_t *a_this) ;
EphyrHostVideoFormat* ephyrHostXVAdaptorGetVideoFormats
- (const EphyrHostXVAdaptor *a_this,
+ (const xcb_xv_adaptor_info_t *a_this,
int *a_nb_formats) ;
-int ephyrHostXVAdaptorGetNbPorts (const EphyrHostXVAdaptor *a_this) ;
-int ephyrHostXVAdaptorGetFirstPortID (const EphyrHostXVAdaptor *a_this) ;
+int ephyrHostXVAdaptorGetNbPorts (const xcb_xv_adaptor_info_t *a_this) ;
+int ephyrHostXVAdaptorGetFirstPortID (const xcb_xv_adaptor_info_t *a_this) ;
-Bool ephyrHostXVAdaptorHasPutVideo (const EphyrHostXVAdaptor *a_this,
+Bool ephyrHostXVAdaptorHasPutVideo (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result) ;
-Bool ephyrHostXVAdaptorHasGetVideo (const EphyrHostXVAdaptor *a_this,
+Bool ephyrHostXVAdaptorHasGetVideo (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result) ;
-Bool ephyrHostXVAdaptorHasPutStill (const EphyrHostXVAdaptor *a_this,
+Bool ephyrHostXVAdaptorHasPutStill (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result) ;
-Bool ephyrHostXVAdaptorHasGetStill (const EphyrHostXVAdaptor *a_this,
+Bool ephyrHostXVAdaptorHasGetStill (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result) ;
-Bool ephyrHostXVAdaptorHasPutImage (const EphyrHostXVAdaptor *a_this,
+Bool ephyrHostXVAdaptorHasPutImage (const xcb_xv_adaptor_info_t *a_this,
Bool *a_result) ;
/*
@@ -138,10 +131,9 @@ void ephyrHostEncodingsDelete (EphyrHostEncoding *a_encodings,
* attribute
*/
Bool ephyrHostXVQueryPortAttributes (int a_port_id,
- EphyrHostAttribute **a_attributes,
- int *a_num_attributes) ;
+ xcb_xv_query_port_attributes_reply_t **a_attributes);
-void ephyrHostAttributesDelete (EphyrHostAttribute *a_attributes) ;
+void ephyrHostAttributesDelete (xcb_xv_query_port_attributes_reply_t *a_attributes) ;
/*
* image format
*/
diff --git a/hw/kdrive/ephyr/ephyrvideo.c b/hw/kdrive/ephyr/ephyrvideo.c
index 69a89ae61..358292613 100644
--- a/hw/kdrive/ephyr/ephyrvideo.c
+++ b/hw/kdrive/ephyr/ephyrvideo.c
@@ -39,7 +39,7 @@
#include "ephyrhostvideo.h"
struct _EphyrXVPriv {
- EphyrHostXVAdaptorArray *host_adaptors ;
+ xcb_xv_query_adaptors_reply_t *host_adaptors ;
KdVideoAdaptorPtr adaptors ;
int num_adaptors ;
};
@@ -399,24 +399,29 @@ videoEncodingDup (EphyrHostEncoding *a_encodings,
}
static KdAttributePtr
-portAttributesDup (EphyrHostAttribute *a_encodings,
- int a_num_encodings)
+portAttributesDup (const xcb_xv_query_port_attributes_reply_t *a_encodings)
{
int i=0 ;
KdAttributePtr result=NULL ;
+ xcb_xv_attribute_info_iterator_t it;
- EPHYR_RETURN_VAL_IF_FAIL (a_encodings && a_num_encodings, NULL) ;
+ EPHYR_RETURN_VAL_IF_FAIL (a_encodings, NULL) ;
- result = calloc(a_num_encodings, sizeof (KdAttributeRec)) ;
+ result = calloc(a_encodings->num_attributes, sizeof (KdAttributeRec)) ;
if (!result) {
EPHYR_LOG_ERROR ("failed to allocate attributes\n") ;
return NULL ;
}
- for (i=0; i < a_num_encodings; i++) {
- result[i].flags = a_encodings[i].flags ;
- result[i].min_value = a_encodings[i].min_value ;
- result[i].max_value = a_encodings[i].max_value ;
- result[i].name = strdup (a_encodings[i].name) ;
+ it = xcb_xv_query_port_attributes_attributes_iterator(a_encodings);
+ for (i = 0;
+ i < a_encodings->num_attributes;
+ xcb_xv_attribute_info_next(&it), i++) {
+ result[i].flags = it.data->flags ;
+ result[i].min_value = it.data->min;
+ result[i].max_value = it.data->max;
+ result[i].name = malloc(it.data->size + 1);
+ memcpy (result[i].name, xcb_xv_attribute_info_name(it.data), it.data->size);
+ result[i].name[it.data->size] = '\0';
}
return result ;
}
@@ -424,13 +429,13 @@ portAttributesDup (EphyrHostAttribute *a_encodings,
static Bool
ephyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
{
- EphyrHostXVAdaptor *cur_host_adaptor=NULL ;
+ xcb_xv_adaptor_info_t *cur_host_adaptor=NULL ;
EphyrHostVideoFormat *video_formats=NULL ;
EphyrHostEncoding *encodings=NULL ;
- EphyrHostAttribute *attributes=NULL ;
+ xcb_xv_query_port_attributes_reply_t *attributes=NULL ;
EphyrHostImageFormat *image_formats=NULL ;
int num_video_formats=0, base_port_id=0,
- num_attributes=0, num_formats=0, i=0,
+ num_formats=0, i=0,
port_priv_offset=0;
unsigned num_encodings=0 ;
Bool is_ok = FALSE ;
@@ -479,10 +484,9 @@ ephyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
a_this->adaptors[i].type |= XvWindowMask ;
a_this->adaptors[i].flags =
VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
- if (ephyrHostXVAdaptorGetName (cur_host_adaptor))
- a_this->adaptors[i].name =
- strdup (ephyrHostXVAdaptorGetName (cur_host_adaptor)) ;
- else
+ a_this->adaptors[i].name =
+ ephyrHostXVAdaptorGetName(cur_host_adaptor) ;
+ if (!a_this->adaptors[i].name)
a_this->adaptors[i].name = strdup ("Xephyr Video Overlay");
base_port_id = ephyrHostXVAdaptorGetFirstPortID (cur_host_adaptor) ;
if (base_port_id < 0) {
@@ -526,15 +530,14 @@ ephyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
a_this->adaptors[i].pPortPrivates[j].ptr = port_priv;
}
if (!ephyrHostXVQueryPortAttributes (base_port_id,
- &attributes,
- &num_attributes)) {
+ &attributes)) {
EPHYR_LOG_ERROR ("failed to get port attribute "
"for adaptor %d\n", i) ;
continue ;
}
a_this->adaptors[i].pAttributes =
- portAttributesDup (attributes, num_attributes);
- a_this->adaptors[i].nAttributes = num_attributes ;
+ portAttributesDup (attributes);
+ a_this->adaptors[i].nAttributes = attributes->num_attributes ;
/*make sure atoms of attrs names are created in xephyr*/
for (j=0; j < a_this->adaptors[i].nAttributes; j++) {
if (a_this->adaptors[i].pAttributes[j].name)
@@ -572,7 +575,7 @@ ephyrXVPrivSetAdaptorsHooks (EphyrXVPriv *a_this)
{
int i=0 ;
Bool has_it=FALSE ;
- EphyrHostXVAdaptor *cur_host_adaptor=NULL ;
+ xcb_xv_adaptor_info_t *cur_host_adaptor=NULL ;
EPHYR_RETURN_VAL_IF_FAIL (a_this, FALSE) ;