diff --git a/hw/kdrive/ephyr/ephyrhostvideo.c b/hw/kdrive/ephyr/ephyrhostvideo.c index 5c3eb051f..7665b25ed 100644 --- a/hw/kdrive/ephyr/ephyrhostvideo.c +++ b/hw/kdrive/ephyr/ephyrhostvideo.c @@ -43,75 +43,6 @@ #define FALSE 0 #endif /*FALSE*/ -Bool -ephyrHostXVQueryAdaptors (xcb_xv_query_adaptors_reply_t **a_adaptors) -{ - 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"); - - 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 = reply; - is_ok = TRUE; - -out: - EPHYR_LOG("leave\n"); - free(e); - return is_ok; -} - -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); - - it = xcb_xv_query_adaptors_info_iterator(a_this); - if (a_index >= a_this->num_adaptors) - return NULL; - for (i = 0; i < a_index; i++) - xcb_xv_adaptor_info_next(&it); - - return it.data; -} - -char -ephyrHostXVAdaptorGetType(const xcb_xv_adaptor_info_t *a_this) -{ - EPHYR_RETURN_VAL_IF_FAIL(a_this, -1); - return a_this->type; -} - -char * -ephyrHostXVAdaptorGetName(const xcb_xv_adaptor_info_t *a_this) -{ - char *name; - - EPHYR_RETURN_VAL_IF_FAIL(a_this, NULL); - - 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 xcb_xv_adaptor_info_t *a_this, int *a_nb_formats) diff --git a/hw/kdrive/ephyr/ephyrhostvideo.h b/hw/kdrive/ephyr/ephyrhostvideo.h index 40a12ace1..7d2dbe2e8 100644 --- a/hw/kdrive/ephyr/ephyrhostvideo.h +++ b/hw/kdrive/ephyr/ephyrhostvideo.h @@ -28,7 +28,6 @@ #ifndef __EPHYRHOSTVIDEO_H__ #define __EPHYRHOSTVIDEO_H__ -typedef struct _EphyrHostXVAdaptorArray EphyrHostXVAdaptorArray; #include #include @@ -82,19 +81,9 @@ typedef struct { unsigned short x1, y1, x2, y2; } EphyrHostBox; -/* - * host adaptor array - */ -Bool ephyrHostXVQueryAdaptors(xcb_xv_query_adaptors_reply_t **a_adaptors); -xcb_xv_adaptor_info_t* ephyrHostXVAdaptorArrayAt(const xcb_xv_query_adaptors_reply_t *a_this, - int a_index); - /* * host adaptor */ - -char ephyrHostXVAdaptorGetType(const xcb_xv_adaptor_info_t *a_this); -char* ephyrHostXVAdaptorGetName(const xcb_xv_adaptor_info_t *a_this); EphyrHostVideoFormat *ephyrHostXVAdaptorGetVideoFormats (const xcb_xv_adaptor_info_t *a_this, int *a_nb_formats); diff --git a/hw/kdrive/ephyr/ephyrvideo.c b/hw/kdrive/ephyr/ephyrvideo.c index bf00694f7..be5988645 100644 --- a/hw/kdrive/ephyr/ephyrvideo.c +++ b/hw/kdrive/ephyr/ephyrvideo.c @@ -31,6 +31,8 @@ #endif #include #include +#include +#include #include "ephyrlog.h" #include "kdrive.h" #include "kxv.h" @@ -381,7 +383,8 @@ portAttributesDup(const xcb_xv_query_port_attributes_reply_t *a_encodings) static Bool ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this) { - xcb_xv_adaptor_info_t *cur_host_adaptor = NULL; + xcb_connection_t *conn = hostx_get_xcbconn(); + xcb_screen_t *xscreen = xcb_aux_get_screen(conn, hostx_get_screen()); EphyrHostVideoFormat *video_formats = NULL; EphyrHostEncoding *encodings = NULL; xcb_xv_query_port_attributes_reply_t *attributes = NULL; @@ -390,14 +393,22 @@ ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this) num_formats = 0, i = 0, port_priv_offset = 0; unsigned num_encodings = 0; Bool is_ok = FALSE; + xcb_generic_error_t *e = NULL; + xcb_xv_adaptor_info_iterator_t it; EPHYR_RETURN_VAL_IF_FAIL(a_this, FALSE); EPHYR_LOG("enter\n"); - if (!ephyrHostXVQueryAdaptors(&a_this->host_adaptors)) { - EPHYR_LOG_ERROR("failed to query host adaptors\n"); - goto out; + { + xcb_xv_query_adaptors_cookie_t cookie = + xcb_xv_query_adaptors(conn, xscreen->root); + a_this->host_adaptors = xcb_xv_query_adaptors_reply(conn, cookie, &e); + if (e) { + free(e); + EPHYR_LOG_ERROR("failed to query host adaptors\n"); + goto out; + } } if (a_this->host_adaptors) a_this->num_adaptors = a_this->host_adaptors->num_adaptors; @@ -417,22 +428,24 @@ ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this) goto out; } } + + it = xcb_xv_query_adaptors_info_iterator(a_this->host_adaptors); for (i = 0; i < a_this->num_adaptors; i++) { + xcb_xv_adaptor_info_t *cur_host_adaptor = it.data; int j = 0; - cur_host_adaptor = ephyrHostXVAdaptorArrayAt(a_this->host_adaptors, i); - if (!cur_host_adaptor) - continue; a_this->adaptors[i].nPorts = cur_host_adaptor->num_ports; if (a_this->adaptors[i].nPorts <= 0) { EPHYR_LOG_ERROR("Could not find any port of adaptor %d\n", i); continue; } - a_this->adaptors[i].type = ephyrHostXVAdaptorGetType(cur_host_adaptor); + a_this->adaptors[i].type = cur_host_adaptor->type; a_this->adaptors[i].type |= XvWindowMask; a_this->adaptors[i].flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; - a_this->adaptors[i].name = ephyrHostXVAdaptorGetName(cur_host_adaptor); + a_this->adaptors[i].name = + strndup(xcb_xv_adaptor_info_name(cur_host_adaptor), + cur_host_adaptor->name_size); if (!a_this->adaptors[i].name) a_this->adaptors[i].name = strdup("Xephyr Video Overlay"); base_port_id = cur_host_adaptor->base_id; @@ -494,6 +507,8 @@ ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this) } a_this->adaptors[i].pImages = (KdImagePtr) image_formats; a_this->adaptors[i].nImages = num_formats; + + xcb_xv_adaptor_info_next(&it); } is_ok = TRUE; @@ -514,13 +529,16 @@ static Bool ephyrXVPrivSetAdaptorsHooks(EphyrXVPriv * a_this) { int i = 0; - xcb_xv_adaptor_info_t *cur_host_adaptor = NULL; + xcb_xv_adaptor_info_iterator_t it; EPHYR_RETURN_VAL_IF_FAIL(a_this, FALSE); EPHYR_LOG("enter\n"); + it = xcb_xv_query_adaptors_info_iterator(a_this->host_adaptors); for (i = 0; i < a_this->num_adaptors; i++) { + xcb_xv_adaptor_info_t *cur_host_adaptor = it.data; + a_this->adaptors[i].ReputImage = ephyrReputImage; a_this->adaptors[i].StopVideo = ephyrStopVideo; a_this->adaptors[i].SetPortAttribute = ephyrSetPortAttribute; @@ -528,12 +546,6 @@ ephyrXVPrivSetAdaptorsHooks(EphyrXVPriv * a_this) a_this->adaptors[i].QueryBestSize = ephyrQueryBestSize; a_this->adaptors[i].QueryImageAttributes = ephyrQueryImageAttributes; - cur_host_adaptor = ephyrHostXVAdaptorArrayAt(a_this->host_adaptors, i); - if (!cur_host_adaptor) { - EPHYR_LOG_ERROR("failed to get host adaptor at index %d\n", i); - continue; - } - if (adaptor_has_flags(cur_host_adaptor, XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK)) a_this->adaptors[i].PutImage = ephyrPutImage;