diff options
author | Julien Cristau <jcristau@debian.org> | 2010-06-20 11:13:26 +0100 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2013-09-03 11:00:59 -0700 |
commit | aea119cd05807ed77336f96a40f8e4607c6ce169 (patch) | |
tree | 225c05bc960144cbcac1aaeed1f3171a451db1c4 | |
parent | 3ea75a59d5fec3c4099388724942e216f2344328 (diff) |
Xephyr: use xcb-xv instead of libXv
v2: Massive, conflict-filled rebase. I think I resolved everything
right, but this host xv code makes my eyes bleed. Touch-tested XV
after the rebase (anholt).
Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net> (v1)
Signed-off-by: Julien Cristau <jcristau@debian.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyrhostvideo.c | 892 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyrhostvideo.h | 45 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyrvideo.c | 45 |
4 files changed, 382 insertions, 602 deletions
diff --git a/configure.ac b/configure.ac index db7ef7cd1..b8d9a2514 100644 --- a/configure.ac +++ b/configure.ac @@ -2118,7 +2118,7 @@ if test "$KDRIVE" = yes; then XEPHYR_REQUIRED_LIBS="x11 >= 1.6 $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 99f0f5071..8b716878a 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" @@ -56,295 +52,114 @@ #ifndef FALSE #define FALSE 0 #endif /*FALSE*/ -static XExtensionInfo _xv_info_data; -static XExtensionInfo *xv_info = &_xv_info_data; -static const 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 const 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) { - snprintf(number, sizeof(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) { - snprintf(mesg, sizeof(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) - snprintf(buffer, sizeof(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); + 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; + *a_adaptors = reply; is_ok = TRUE; - out: +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, int a_index) +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 ((const 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 ((const 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, - int *a_nb_formats) +EphyrHostVideoFormat* +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 = ((const 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 = - ((const XvAdaptorInfo *) a_this)->formats[i].visual_id; - visual_info = XGetVisualInfo(hostx_get_display(), - VisualIDMask, - &visual_info_template, &nb_visual_info); - formats[i].depth = ((const 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; @@ -352,28 +167,27 @@ 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 ((const 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 ((const XvAdaptorInfo *) a_this)->base_id; + return a_this->base_id; } Bool -ephyrHostXVAdaptorHasPutVideo(const EphyrHostXVAdaptor * a_this, Bool *a_result) +ephyrHostXVAdaptorHasPutVideo (const xcb_xv_adaptor_info_t *a_this, + Bool *a_result) { EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE); - if ((((const 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; @@ -381,10 +195,11 @@ ephyrHostXVAdaptorHasPutVideo(const EphyrHostXVAdaptor * a_this, Bool *a_result) } Bool -ephyrHostXVAdaptorHasGetVideo(const EphyrHostXVAdaptor * a_this, Bool *a_result) +ephyrHostXVAdaptorHasGetVideo(const xcb_xv_adaptor_info_t *a_this, + Bool *a_result) { - if ((((const 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; @@ -392,12 +207,13 @@ ephyrHostXVAdaptorHasGetVideo(const EphyrHostXVAdaptor * a_this, Bool *a_result) } Bool -ephyrHostXVAdaptorHasPutStill(const EphyrHostXVAdaptor * a_this, Bool *a_result) +ephyrHostXVAdaptorHasPutStill(const xcb_xv_adaptor_info_t *a_this, + Bool *a_result) { EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE); - if ((((const 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; @@ -405,12 +221,13 @@ ephyrHostXVAdaptorHasPutStill(const EphyrHostXVAdaptor * a_this, Bool *a_result) } Bool -ephyrHostXVAdaptorHasGetStill(const EphyrHostXVAdaptor * a_this, Bool *a_result) +ephyrHostXVAdaptorHasGetStill(const xcb_xv_adaptor_info_t *a_this, + Bool *a_result) { EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE); - if ((((const 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; @@ -418,12 +235,13 @@ ephyrHostXVAdaptorHasGetStill(const EphyrHostXVAdaptor * a_this, Bool *a_result) } Bool -ephyrHostXVAdaptorHasPutImage(const EphyrHostXVAdaptor * a_this, Bool *a_result) +ephyrHostXVAdaptorHasPutImage(const xcb_xv_adaptor_info_t *a_this, + Bool *a_result) { EPHYR_RETURN_VAL_IF_FAIL(a_this && a_result, FALSE); - if ((((const 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; @@ -436,34 +254,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) { - 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; + 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++, 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; } @@ -482,26 +302,26 @@ ephyrHostEncodingsDelete(EphyrHostEncoding * a_encodings, int a_num_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 @@ -509,31 +329,66 @@ 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; - } Bool ephyrHostXVSetPortAttribute(int a_port_id, int a_atom, int a_attr_value) { - int res = Success; - - EPHYR_LOG("atom,name,value: (%d,%s,%d)\n", - a_atom, XGetAtomName(hostx_get_display(), a_atom), a_attr_value); + EPHYR_LOG("atom,value: (%d,%d)\n", a_atom, a_attr_value); - res = XvSetPortAttribute(hostx_get_display(), - 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()); + xcb_xv_set_port_attribute(hostx_get_xcbconn(), + a_port_id, + a_atom, + a_attr_value); + xcb_flush(hostx_get_xcbconn()); EPHYR_LOG("leave\n"); return TRUE; @@ -542,20 +397,24 @@ ephyrHostXVSetPortAttribute(int a_port_id, int a_atom, int a_attr_value) Bool 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; @@ -574,70 +433,38 @@ ephyrHostXVQueryBestSize(int a_port_id, unsigned int a_drw_h, 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); EPHYR_LOG("enter: frame (%dx%d), drw (%dx%d)\n", 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; - out: +out: + free(reply); EPHYR_LOG("leave\n"); 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 */ , @@ -646,77 +473,85 @@ ephyrHostXVQueryImageAttributes(int a_port_id, int *a_image_size, 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 { - _XEatDataWords(dpy, rep.length); - } - *a_width = rep.width; - *a_height = rep.height; - *a_image_size = rep.data_size; - - ret = TRUE; + 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 = reply->width; + *a_height = reply->height; + *a_image_size = reply->data_size; + free(reply); - out: - UnlockDisplay(dpy); - SyncHandle(); - return ret; + return TRUE; } Bool 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 @@ -737,36 +572,39 @@ ephyrHostXVPutImage(int a_screen_num, EphyrHostBox * a_clip_rects, 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_connection_t *conn = hostx_get_xcbconn (); + xcb_gcontext_t gc; + 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"); + 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; - } - 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; + 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)); - for (i = 0; i < a_clip_rect_nums; i++) { + 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; rects[i].width = a_clip_rects[i].x2 - a_clip_rects[i].x1; @@ -774,31 +612,28 @@ ephyrHostXVPutImage(int a_screen_num, EPHYR_LOG("(x,y,w,h): (%d,%d,%d,%d)\n", 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, + 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); - if (res != Success) { - EPHYR_LOG_ERROR("XvPutImage() failed: %d\n", res); - goto out; - } + 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; +out: + xcb_free_gc(conn, gc); EPHYR_LOG("leave\n"); return is_ok; } @@ -809,34 +644,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(); + 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 = XvPutVideo(dpy, a_port_id, hostx_get_window(a_screen_num), gc, + 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); - - if (res != Success) { - EPHYR_LOG_ERROR("XvPutVideo() failed: %d\n", res); - goto out; - } - is_ok = TRUE; - out: - if (gc) { - XFreeGC(dpy, gc); - gc = NULL; - } + xcb_free_gc(conn, gc); + return is_ok; } @@ -845,36 +668,26 @@ ephyrHostXVGetVideo(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 = XvGetVideo(dpy, a_port_id, hostx_get_window(a_screen_num), gc, + 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); - if (res != Success) { - EPHYR_LOG_ERROR("XvGetVideo() 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 @@ -882,36 +695,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, + 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 @@ -919,57 +722,38 @@ 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, + 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 0d3177277..b946add66 100644 --- a/hw/kdrive/ephyr/ephyrhostvideo.h +++ b/hw/kdrive/ephyr/ephyrhostvideo.h @@ -28,8 +28,9 @@ #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 +49,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,32 +89,32 @@ 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, int a_index); +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, int *a_nb_formats); -int ephyrHostXVAdaptorGetNbPorts(const EphyrHostXVAdaptor * a_this); -int ephyrHostXVAdaptorGetFirstPortID(const EphyrHostXVAdaptor * a_this); + (const xcb_xv_adaptor_info_t *a_this, int *a_nb_formats); +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); /* @@ -137,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 dfc29f533..345c7b95f 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; }; @@ -381,23 +381,29 @@ videoEncodingDup(EphyrHostEncoding * a_encodings, int a_num_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; } @@ -405,13 +411,13 @@ portAttributesDup(EphyrHostAttribute * a_encodings, int a_num_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, port_priv_offset = 0; + num_formats = 0, i = 0, port_priv_offset = 0; unsigned num_encodings = 0; Bool is_ok = FALSE; @@ -458,10 +464,8 @@ 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) { @@ -504,15 +508,14 @@ ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this) port_priv->xv_priv = a_this; a_this->adaptors[i].pPortPrivates[j].ptr = port_priv; } - if (!ephyrHostXVQueryPortAttributes(base_port_id, - &attributes, &num_attributes)) { + if (!ephyrHostXVQueryPortAttributes(base_port_id, &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) @@ -548,7 +551,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); |