ephyr: Remove the host/server split for XV adaptors.
Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Julien Cristau <jcristau@debian.org>
This commit is contained in:
parent
fad79d2e3e
commit
1342a93c49
|
|
@ -43,75 +43,6 @@
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
#endif /*FALSE*/
|
#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*
|
EphyrHostVideoFormat*
|
||||||
ephyrHostXVAdaptorGetVideoFormats (const xcb_xv_adaptor_info_t *a_this,
|
ephyrHostXVAdaptorGetVideoFormats (const xcb_xv_adaptor_info_t *a_this,
|
||||||
int *a_nb_formats)
|
int *a_nb_formats)
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@
|
||||||
#ifndef __EPHYRHOSTVIDEO_H__
|
#ifndef __EPHYRHOSTVIDEO_H__
|
||||||
#define __EPHYRHOSTVIDEO_H__
|
#define __EPHYRHOSTVIDEO_H__
|
||||||
|
|
||||||
typedef struct _EphyrHostXVAdaptorArray EphyrHostXVAdaptorArray;
|
|
||||||
#include <xcb/xv.h>
|
#include <xcb/xv.h>
|
||||||
#include <X11/Xdefs.h>
|
#include <X11/Xdefs.h>
|
||||||
|
|
||||||
|
|
@ -82,19 +81,9 @@ typedef struct {
|
||||||
unsigned short x1, y1, x2, y2;
|
unsigned short x1, y1, x2, y2;
|
||||||
} EphyrHostBox;
|
} 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
|
* host adaptor
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char ephyrHostXVAdaptorGetType(const xcb_xv_adaptor_info_t *a_this);
|
|
||||||
char* ephyrHostXVAdaptorGetName(const xcb_xv_adaptor_info_t *a_this);
|
|
||||||
EphyrHostVideoFormat *ephyrHostXVAdaptorGetVideoFormats
|
EphyrHostVideoFormat *ephyrHostXVAdaptorGetVideoFormats
|
||||||
(const xcb_xv_adaptor_info_t *a_this, int *a_nb_formats);
|
(const xcb_xv_adaptor_info_t *a_this, int *a_nb_formats);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,8 @@
|
||||||
#endif
|
#endif
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <X11/extensions/Xv.h>
|
#include <X11/extensions/Xv.h>
|
||||||
|
#include <xcb/xcb.h>
|
||||||
|
#include <xcb/xcb_aux.h>
|
||||||
#include "ephyrlog.h"
|
#include "ephyrlog.h"
|
||||||
#include "kdrive.h"
|
#include "kdrive.h"
|
||||||
#include "kxv.h"
|
#include "kxv.h"
|
||||||
|
|
@ -381,7 +383,8 @@ portAttributesDup(const xcb_xv_query_port_attributes_reply_t *a_encodings)
|
||||||
static Bool
|
static Bool
|
||||||
ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this)
|
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;
|
EphyrHostVideoFormat *video_formats = NULL;
|
||||||
EphyrHostEncoding *encodings = NULL;
|
EphyrHostEncoding *encodings = NULL;
|
||||||
xcb_xv_query_port_attributes_reply_t *attributes = NULL;
|
xcb_xv_query_port_attributes_reply_t *attributes = NULL;
|
||||||
|
|
@ -390,15 +393,23 @@ ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this)
|
||||||
num_formats = 0, i = 0, port_priv_offset = 0;
|
num_formats = 0, i = 0, port_priv_offset = 0;
|
||||||
unsigned num_encodings = 0;
|
unsigned num_encodings = 0;
|
||||||
Bool is_ok = FALSE;
|
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_RETURN_VAL_IF_FAIL(a_this, FALSE);
|
||||||
|
|
||||||
EPHYR_LOG("enter\n");
|
EPHYR_LOG("enter\n");
|
||||||
|
|
||||||
if (!ephyrHostXVQueryAdaptors(&a_this->host_adaptors)) {
|
{
|
||||||
|
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");
|
EPHYR_LOG_ERROR("failed to query host adaptors\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (a_this->host_adaptors)
|
if (a_this->host_adaptors)
|
||||||
a_this->num_adaptors = a_this->host_adaptors->num_adaptors;
|
a_this->num_adaptors = a_this->host_adaptors->num_adaptors;
|
||||||
if (a_this->num_adaptors < 0) {
|
if (a_this->num_adaptors < 0) {
|
||||||
|
|
@ -417,22 +428,24 @@ ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
it = xcb_xv_query_adaptors_info_iterator(a_this->host_adaptors);
|
||||||
for (i = 0; i < a_this->num_adaptors; i++) {
|
for (i = 0; i < a_this->num_adaptors; i++) {
|
||||||
|
xcb_xv_adaptor_info_t *cur_host_adaptor = it.data;
|
||||||
int j = 0;
|
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;
|
a_this->adaptors[i].nPorts = cur_host_adaptor->num_ports;
|
||||||
if (a_this->adaptors[i].nPorts <= 0) {
|
if (a_this->adaptors[i].nPorts <= 0) {
|
||||||
EPHYR_LOG_ERROR("Could not find any port of adaptor %d\n", i);
|
EPHYR_LOG_ERROR("Could not find any port of adaptor %d\n", i);
|
||||||
continue;
|
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].type |= XvWindowMask;
|
||||||
a_this->adaptors[i].flags =
|
a_this->adaptors[i].flags =
|
||||||
VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
|
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)
|
if (!a_this->adaptors[i].name)
|
||||||
a_this->adaptors[i].name = strdup("Xephyr Video Overlay");
|
a_this->adaptors[i].name = strdup("Xephyr Video Overlay");
|
||||||
base_port_id = cur_host_adaptor->base_id;
|
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].pImages = (KdImagePtr) image_formats;
|
||||||
a_this->adaptors[i].nImages = num_formats;
|
a_this->adaptors[i].nImages = num_formats;
|
||||||
|
|
||||||
|
xcb_xv_adaptor_info_next(&it);
|
||||||
}
|
}
|
||||||
is_ok = TRUE;
|
is_ok = TRUE;
|
||||||
|
|
||||||
|
|
@ -514,13 +529,16 @@ static Bool
|
||||||
ephyrXVPrivSetAdaptorsHooks(EphyrXVPriv * a_this)
|
ephyrXVPrivSetAdaptorsHooks(EphyrXVPriv * a_this)
|
||||||
{
|
{
|
||||||
int i = 0;
|
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_RETURN_VAL_IF_FAIL(a_this, FALSE);
|
||||||
|
|
||||||
EPHYR_LOG("enter\n");
|
EPHYR_LOG("enter\n");
|
||||||
|
|
||||||
|
it = xcb_xv_query_adaptors_info_iterator(a_this->host_adaptors);
|
||||||
for (i = 0; i < a_this->num_adaptors; i++) {
|
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].ReputImage = ephyrReputImage;
|
||||||
a_this->adaptors[i].StopVideo = ephyrStopVideo;
|
a_this->adaptors[i].StopVideo = ephyrStopVideo;
|
||||||
a_this->adaptors[i].SetPortAttribute = ephyrSetPortAttribute;
|
a_this->adaptors[i].SetPortAttribute = ephyrSetPortAttribute;
|
||||||
|
|
@ -528,12 +546,6 @@ ephyrXVPrivSetAdaptorsHooks(EphyrXVPriv * a_this)
|
||||||
a_this->adaptors[i].QueryBestSize = ephyrQueryBestSize;
|
a_this->adaptors[i].QueryBestSize = ephyrQueryBestSize;
|
||||||
a_this->adaptors[i].QueryImageAttributes = ephyrQueryImageAttributes;
|
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,
|
if (adaptor_has_flags(cur_host_adaptor,
|
||||||
XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK))
|
XCB_XV_TYPE_IMAGE_MASK | XCB_XV_TYPE_INPUT_MASK))
|
||||||
a_this->adaptors[i].PutImage = ephyrPutImage;
|
a_this->adaptors[i].PutImage = ephyrPutImage;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue