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
 | 
			
		||||
#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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,6 @@
 | 
			
		|||
#ifndef __EPHYRHOSTVIDEO_H__
 | 
			
		||||
#define __EPHYRHOSTVIDEO_H__
 | 
			
		||||
 | 
			
		||||
typedef struct _EphyrHostXVAdaptorArray EphyrHostXVAdaptorArray;
 | 
			
		||||
#include <xcb/xv.h>
 | 
			
		||||
#include <X11/Xdefs.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,8 @@
 | 
			
		|||
#endif
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <X11/extensions/Xv.h>
 | 
			
		||||
#include <xcb/xcb.h>
 | 
			
		||||
#include <xcb/xcb_aux.h>
 | 
			
		||||
#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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue