make xvinfo work

* hw/kdrive/ephyr/ephyrhostvideo.c:
          (EphyrHostXVAdaptorGetVideoFormats): properly get visual class instead of
            returning the visual id.
          (EphyrHostXVQueryEncodings): properly copy the fields because simple casting does
            truncate some fields.
           (EphyrHostAttributesDelete): XFree the whole array instead of trying to free invidial members.
        * hw/kdrive/ephyr/ephyrvideo.c:
          (ephyrInitVideo): fix a typo
          (EphyrXVPrivQueryHostAdaptors): set XvWindowMask mask to adaptors type.
           use host adaptor name. Don't forget to set nImages field.
          (EphyrXVPrivRegisterAdaptors): report an error when KdXVScreenInit() fails.
This commit is contained in:
Dodji Seketeli 2007-07-23 12:43:43 +02:00 committed by Dodji Seketeli
parent aa2fae7b75
commit b8cd313be4
3 changed files with 67 additions and 36 deletions

View File

@ -28,7 +28,7 @@
#ifdef HAVE_CONFIG_H
#include <kdrive-config.h>
#endif
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xvlib.h>
#include "hostx.h"
@ -125,15 +125,34 @@ EphyrHostXVAdaptorGetName (const EphyrHostXVAdaptor *a_this)
return ((XvAdaptorInfo*)a_this)->name ;
}
const EphyrHostVideoFormat*
EphyrHostVideoFormat*
EphyrHostXVAdaptorGetVideoFormats (const EphyrHostXVAdaptor *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 ;
EPHYR_RETURN_VAL_IF_FAIL (a_this, NULL) ;
nb_formats = ((XvAdaptorInfo*)a_this)->num_formats ;
formats = Xcalloc (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) ;
}
if (a_nb_formats)
*a_nb_formats = ((XvAdaptorInfo*)a_this)->num_formats ;
return (EphyrHostVideoFormat*) ((XvAdaptorInfo*)a_this)->formats ;
*a_nb_formats = nb_formats ;
return formats ;
}
int
@ -157,16 +176,38 @@ EphyrHostXVQueryEncodings (int a_port_id,
EphyrHostEncoding **a_encodings,
unsigned int *a_num_encodings)
{
int ret = 0 ;
EphyrHostEncoding *encodings=NULL ;
XvEncodingInfo *encoding_info=NULL ;
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,
a_num_encodings,
(XvEncodingInfo**)a_encodings) ;
if (ret == Success)
return TRUE ;
return FALSE ;
&num_encodings,
&encoding_info) ;
if (num_encodings && encoding_info) {
encodings = Xcalloc (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 ;
}
}
if (encoding_info) {
XvFreeEncodingInfo (encoding_info) ;
encoding_info = NULL ;
}
*a_encodings = encodings ;
*a_num_encodings = num_encodings ;
if (ret != Success)
return FALSE ;
return TRUE ;
}
void
@ -187,20 +228,11 @@ EphyrHostEncodingsDelete (EphyrHostEncoding *a_encodings,
}
void
EphyrHostAttributesDelete (EphyrHostAttribute *a_attributes,
int a_num_attributes)
EphyrHostAttributesDelete (EphyrHostAttribute *a_attributes)
{
int i=0 ;
if (!a_attributes)
return ;
for (i=0; i < a_num_attributes; i++) {
if (a_attributes[i].name) {
xfree (a_attributes[i].name) ;
a_attributes[i].name = NULL ;
}
}
xfree (a_attributes) ;
XFree (a_attributes) ;
}
Bool

View File

@ -28,13 +28,12 @@
#ifndef __EPHYRHOSTVIDEO_H__
#define __EPHYRHOSTVIDEO_H__
typedef void* EphyrHostXVAdaptor ;
typedef struct _EphyrHostXVAdaptorArray EphyrHostXVAdaptorArray ;
typedef struct _EphyrHostVideoFormat {
char depth ;
unsigned long visual_id;
short visual_class;
} EphyrHostVideoFormat ;
typedef struct _EphyrHostRational {
@ -100,9 +99,7 @@ EphyrHostXVAdaptor* EphyrHostXVAdaptorArrayAt (const EphyrHostXVAdaptorArray *a_
char EphyrHostXVAdaptorGetType (const EphyrHostXVAdaptor *a_this) ;
const char* EphyrHostXVAdaptorGetName (const EphyrHostXVAdaptor *a_this) ;
const EphyrHostVideoFormat* EphyrHostXVAdaptorGetNbVideoFormats
(const EphyrHostXVAdaptor *a_this) ;
const EphyrHostVideoFormat* EphyrHostXVAdaptorGetVideoFormats
EphyrHostVideoFormat* EphyrHostXVAdaptorGetVideoFormats
(const EphyrHostXVAdaptor *a_this,
int *a_nb_formats) ;
int EphyrHostXVAdaptorGetNbPorts (const EphyrHostXVAdaptor *a_this) ;
@ -125,8 +122,7 @@ Bool EphyrHostXVQueryPortAttributes (int a_port_id,
EphyrHostAttribute **a_attributes,
int *a_num_attributes) ;
void EphyrHostAttributesDelete (EphyrHostAttribute *a_attributes,
int a_num_attributes) ;
void EphyrHostAttributesDelete (EphyrHostAttribute *a_attributes) ;
/*
* image format
*/

View File

@ -121,7 +121,7 @@ ephyrInitVideo (ScreenPtr pScreen)
return FALSE ;
}
if (EphyrXVPrivRegisterAdaptors (xv_priv, pScreen)) {
if (!EphyrXVPrivRegisterAdaptors (xv_priv, pScreen)) {
EPHYR_LOG_ERROR ("failed to register adaptors\n") ;
return FALSE ;
}
@ -266,11 +266,13 @@ EphyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
if (!cur_host_adaptor)
continue ;
a_this->adaptors[i].type = EphyrHostXVAdaptorGetType (cur_host_adaptor) ;
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)) ;
a_this->adaptors[i].name = "Xephyr Video Overlay";
else
a_this->adaptors[i].name = strdup ("Xephyr Video Overlay");
base_port_id = EphyrHostXVAdaptorGetFirstPortID (cur_host_adaptor) ;
if (base_port_id < 0) {
EPHYR_LOG_ERROR ("failed to get port id for adaptor %d\n", i) ;
@ -306,6 +308,7 @@ EphyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
continue ;
}
a_this->adaptors[i].pImages = (KdImagePtr) image_formats ;
a_this->adaptors[i].nImages = num_formats ;
}
is_ok = TRUE ;
@ -315,13 +318,9 @@ out:
encodings = NULL ;
}
if (attributes) {
EphyrHostAttributesDelete (attributes, num_attributes) ;
EphyrHostAttributesDelete (attributes) ;
attributes = NULL ;
}
if (image_formats) {
xfree (image_formats) ;
image_formats = NULL ;
}
EPHYR_LOG ("leave\n") ;
return is_ok ;
}
@ -374,7 +373,11 @@ EphyrXVPrivRegisterAdaptors (EphyrXVPriv *a_this,
for (i=0 ; i < a_this->num_adaptors; i++) {
*(adaptors + num_registered_adaptors + i) = &a_this->adaptors[i] ;
}
KdXVScreenInit (a_screen, adaptors, num_adaptors);
if (!KdXVScreenInit (a_screen, adaptors, num_adaptors)) {
EPHYR_LOG_ERROR ("failed to register adaptors\n");
goto out ;
}
EPHYR_LOG ("registered %d adaptors\n", num_adaptors) ;
is_ok = TRUE ;
out: