changeset 22857:77def5093daf

switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in
author ben
date Sun, 01 Apr 2007 11:06:06 +0000
parents 27db9ffe00a5
children 6c57087c5a2d
files Makefile vidix/cyberblade_vid.c vidix/drivers.c vidix/drivers.h vidix/mach64_vid.c vidix/mga_vid.c vidix/nvidia_vid.c vidix/pm3_vid.c vidix/radeon_vid.c vidix/savage_vid.c vidix/sis_vid.c vidix/unichrome_vid.c vidix/vidixlib.c vidix/vidixlib.h
diffstat 14 files changed, 664 insertions(+), 390 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Sun Apr 01 09:45:26 2007 +0000
+++ b/Makefile	Sun Apr 01 11:06:06 2007 +0000
@@ -78,7 +78,7 @@
                libao2/libao2.a \
                input/libinput.a \
 
-LIBS_MPLAYER-$(VIDIX)             += vidix/libvidix.a
+LIBS_MPLAYER-$(VIDIX)             += vidix/libvidix.a libdha/libdha.a
 LIBS_MPLAYER-$(GUI)               += Gui/libgui.a
 LIBS_MPLAYER-$(LIBMENU)           += libmenu/libmenu.a
 
--- a/vidix/cyberblade_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/cyberblade_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -44,6 +44,7 @@
 #include <unistd.h>
 
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
@@ -135,7 +136,7 @@
 };
 
 
-unsigned int vixGetVersion(void)
+static unsigned int cyberblade_get_version(void)
 {
 	return(VIDIX_VERSION);
 }
@@ -162,7 +163,7 @@
   return -1;
 }
 
-int vixProbe(int verbose, int force)
+static int cyberblade_probe(int verbose, int force)
 {
 	pciinfo_t lst[MAX_PCI_DEVICES];
 	unsigned i,num_pci;
@@ -206,7 +207,7 @@
 }
 
 
-int vixInit(void)
+static int cyberblade_init(void)
 {
 	cyberblade_mem = map_phys_mem(pci_info.base0, 0x800000); 
 	enable_app_io();
@@ -222,7 +223,7 @@
 	return 0;
 }
 
-void vixDestroy(void)
+static void cyberblade_destroy(void)
 {
 	int protect;
 #ifdef DEBUG_LOGFILE
@@ -244,7 +245,7 @@
 }
 
 
-int vixGetCapability(vidix_capability_t *to)
+static int cyberblade_get_caps(vidix_capability_t *to)
 {
 	memcpy(to, &cyberblade_cap, sizeof(vidix_capability_t));
 	return 0;
@@ -266,7 +267,7 @@
 	}
 }
 
-int vixQueryFourcc(vidix_fourcc_t *to)
+static int cyberblade_query_fourcc(vidix_fourcc_t *to)
 {
 	if(is_supported_fourcc(to->fourcc))
 	{
@@ -288,13 +289,13 @@
 
 static vidix_grkey_t cyberblade_grkey;
 
-int vixGetGrKeys(vidix_grkey_t *grkey)
+static int cyberblade_get_gkeys(vidix_grkey_t *grkey)
 {
 	memcpy(grkey, &cyberblade_grkey, sizeof(vidix_grkey_t));
 	return(0);
 }
 
-int vixSetGrKeys(const vidix_grkey_t *grkey)
+static int cyberblade_set_gkeys(const vidix_grkey_t *grkey)
 {
 	int pixfmt=CRINB(0x38);
 	int protect;
@@ -329,19 +330,19 @@
 }
 
 
-vidix_video_eq_t equal =
+static vidix_video_eq_t equal =
 {
 	VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION | VEQ_CAP_HUE,
 	300, 100, 0, 0, 0, 0, 0, 0
 };
 
-int vixPlaybackGetEq( vidix_video_eq_t * eq)
+static int cyberblade_get_eq( vidix_video_eq_t * eq)
 {
   memcpy(eq,&equal,sizeof(vidix_video_eq_t));
   return 0;
 }
 
-int vixPlaybackSetEq( const vidix_video_eq_t * eq)
+static int cyberblade_set_eq( const vidix_video_eq_t * eq)
 {
 	int br,sat,cr,protect;
 	if(eq->cap & VEQ_CAP_BRIGHTNESS) equal.brightness = eq->brightness;
@@ -381,7 +382,7 @@
 
 static int YOffs,UOffs,VOffs;
 
-int vixConfigPlayback(vidix_playback_t *info)
+static int cyberblade_config_playback(vidix_playback_t *info)
 {
 	int shrink, zoom;
 	int src_w, drw_w;
@@ -465,7 +466,7 @@
 	SROUTB(0x21, 0x34); /* Signature control */
 	SROUTB(0x37, 0x30); /* Video key mode */
 
-        vixSetGrKeys(&cyberblade_grkey);
+        cyberblade_set_gkeys(&cyberblade_grkey);
 
 	/* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */
 	{
@@ -598,7 +599,7 @@
 		SROUTB(0x85, ((base0+info->offset.u) >> 19) &0xf); /* Upper 4 bits of start address */
 	}
 
-	vixPlaybackSetEq(&equal);
+	cyberblade_set_eq(&equal);
 
 	/* Protect hardware registers again */
 	SROUTB(0x11, protect);
@@ -606,7 +607,7 @@
 }
 
 
-int vixPlaybackOn(void)
+static int cyberblade_playback_on(void)
 {
 	LOGWRITE("Enable overlay\n");
 	CROUTB(0x8E, 0xd4); /* VDE Flags*/
@@ -615,7 +616,7 @@
 }
 
 
-int vixPlaybackOff(void)
+static int cyberblade_playback_off(void)
 {
         LOGWRITE("Disable overlay\n"); 
 	CROUTB(0x8E, 0xc4); /* VDE Flags*/
@@ -624,7 +625,7 @@
 }
 
 
-int vixPlaybackFrameSelect(unsigned int frame)
+static int cyberblade_frame_sel(unsigned int frame)
 {
 	int protect;
         LOGWRITE("Frame select\n"); 
@@ -644,4 +645,21 @@
 	return 0;
 }
 
-
+VDXDriver cyberblade_drv = {
+  "cyberblade",
+  NULL,
+  .probe = cyberblade_probe,
+  .get_version = cyberblade_get_version,
+  .get_caps = cyberblade_get_caps,
+  .query_fourcc = cyberblade_query_fourcc,
+  .init = cyberblade_init,
+  .destroy = cyberblade_destroy,
+  .config_playback = cyberblade_config_playback,
+  .playback_on = cyberblade_playback_on,
+  .playback_off = cyberblade_playback_off,
+  .frame_sel = cyberblade_frame_sel,
+  .get_eq = cyberblade_get_eq,
+  .set_eq = cyberblade_set_eq,
+  .get_gkey = cyberblade_get_gkeys,
+  .set_gkey = cyberblade_set_gkeys,
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vidix/drivers.c	Sun Apr 01 11:06:06 2007 +0000
@@ -0,0 +1,123 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include "vidixlib.h"
+#include "../config.h"
+#include "../libavutil/common.h"
+#include "../mpbswap.h"
+
+VDXDriver *first_driver = NULL;
+
+extern VDXDriver cyberblade_drv;
+extern VDXDriver mach64_drv;
+extern VDXDriver mga_drv;
+extern VDXDriver mga_crtc2_drv;
+extern VDXDriver nvidia_drv;
+extern VDXDriver pm3_drv;
+extern VDXDriver radeon_drv;
+extern VDXDriver rage128_drv;
+extern VDXDriver savage_drv;
+extern VDXDriver sis_drv;
+extern VDXDriver unichrome_drv;
+
+static void vidix_register_driver (VDXDriver *drv)
+{
+  VDXDriver **d;
+  
+  d = &first_driver;
+  while (*d != NULL)
+    d = &(*d)->next;
+  *d = drv;
+  drv->next = NULL;
+}
+
+void vidix_register_all_drivers (void)
+{
+  vidix_register_driver (&cyberblade_drv);
+  vidix_register_driver (&mach64_drv);
+  vidix_register_driver (&mga_drv);
+  vidix_register_driver (&mga_crtc2_drv);
+  vidix_register_driver (&nvidia_drv);
+  vidix_register_driver (&pm3_drv);
+  vidix_register_driver (&radeon_drv);
+  vidix_register_driver (&rage128_drv);
+  vidix_register_driver (&savage_drv);
+  vidix_register_driver (&sis_drv);
+  vidix_register_driver (&unichrome_drv);
+}
+
+static int vidix_probe_driver (VDXContext *ctx, VDXDriver *drv,
+                               unsigned int cap, int verbose)
+{
+  vidix_capability_t vid_cap;
+
+  if (verbose)
+    printf ("vidixlib: PROBING: %s\n", drv->name);
+
+  if (!drv->get_version)
+    return 0;
+  
+  if (drv->get_version () != VIDIX_VERSION)
+  {
+    if (verbose)
+      printf ("vidixlib: %s has wrong version\n", drv->name);
+    return 0;
+  }
+
+  if (!drv->probe || drv->probe (verbose, PROBE_NORMAL) != 0)
+    return 0;
+
+  if (!drv->get_caps || drv->get_caps (&vid_cap) != 0)
+    return 0;
+
+  if ((vid_cap.type & cap) != cap)
+  {
+    if (verbose)
+      printf ("vidixlib: Found %s but has no required capability\n",
+              drv->name);
+     return 0;
+  }
+  
+  if (verbose)
+    printf ("vidixlib: %s probed o'k\n", drv->name);
+
+  ctx->drv = drv;
+  return 1;
+}
+
+int vidix_find_driver (VDXContext *ctx, const char *name,
+                       unsigned int cap, int verbose)
+{
+  VDXDriver *drv;
+
+  drv = first_driver;
+  while (drv)
+  {
+    if (name) /* forced driver */
+    {
+      if (!strcmp (drv->name, name))
+      {
+        if (vidix_probe_driver (ctx, drv, cap, verbose))
+          return 1;
+        else
+        {
+          ctx->drv = NULL;
+          return 0;
+        }
+      }
+    }
+    else /* auto-probe */
+    {
+      if (vidix_probe_driver (ctx, drv, cap, verbose))
+        return 1;
+    }
+    drv = drv->next;
+  }
+
+  if (verbose)
+    printf ("vidixlib: No suitable driver can be found.\n");
+  ctx->drv = NULL;
+  return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vidix/drivers.h	Sun Apr 01 11:06:06 2007 +0000
@@ -0,0 +1,10 @@
+
+#ifndef VIDIX_DRIVERS_H
+#define VIDIX_DRIVERS_H
+
+void vidix_register_all_drivers (void);
+
+int vidix_find_driver (VDXContext *ctx, const char *name,
+                       unsigned int cap, int verbose);
+
+#endif /* VIDIX_DRIVERS_H */
--- a/vidix/mach64_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/mach64_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -17,13 +17,13 @@
 #include "../libavutil/common.h"
 #include "../mpbswap.h"
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
 #include "../libdha/pci_names.h"
 
 #include "mach64.h"
-#include "../version.h"
 
 #define UNUSED(x) ((void)(x)) /**< Removes warning about unused arguments */
 
@@ -339,7 +339,7 @@
 }
 
 
-unsigned int vixGetVersion(void)
+static unsigned int mach64_get_version(void)
 {
     return(VIDIX_VERSION);
 }
@@ -396,7 +396,7 @@
   return -1;
 }
 
-int vixProbe(int verbose,int force)
+static int mach64_probe(int verbose,int force)
 {
   pciinfo_t lst[MAX_PCI_DEVICES];
   unsigned i,num_pci;
@@ -456,7 +456,7 @@
 }
 
 
-int vixInit(void)
+static int mach64_init(void)
 {
   int err;
   if(!probed)
@@ -464,7 +464,7 @@
     printf("[mach64] Driver was not probed but is being initializing\n");
     return EINTR;
   }
-  if(__verbose>0) printf("[mach64] version %s\n", VERSION);
+  if(__verbose>0) printf("[mach64] version %d\n", VIDIX_VERSION);
   
   if((mach64_mmio_base = map_phys_mem(pci_info.base2,0x1000))==(void *)-1) return ENOMEM;
   mach64_wait_for_idle();
@@ -516,7 +516,7 @@
   return 0;
 }
 
-void vixDestroy(void)
+static void mach64_destroy(void)
 {
   /*restore this*/
   mach64_wait_for_idle();
@@ -526,7 +526,7 @@
   unmap_phys_mem(mach64_mmio_base,0x1000);
 }
 
-int vixGetCapability(vidix_capability_t *to)
+static int mach64_get_caps(vidix_capability_t *to)
 {
     memcpy(to, &mach64_cap, sizeof(vidix_capability_t));
     return 0;
@@ -872,7 +872,7 @@
     }
 }
 
-int vixQueryFourcc(vidix_fourcc_t *to)
+static int mach64_query_fourcc(vidix_fourcc_t *to)
 {
     if(is_supported_fourcc(to->fourcc))
     {
@@ -888,7 +888,7 @@
     return ENOSYS;
 }
 
-int vixConfigPlayback(vidix_playback_t *info)
+static int mach64_config_playback(vidix_playback_t *info)
 {
   if(!is_supported_fourcc(info->fourcc)) return ENOSYS;
 
@@ -908,19 +908,19 @@
   return 0;
 }
 
-int vixPlaybackOn(void)
+static int mach64_playback_on(void)
 {
   mach64_vid_display_video();
   return 0;
 }
 
-int vixPlaybackOff(void)
+static int mach64_playback_off(void)
 {
   mach64_vid_stop_video();
   return 0;
 }
 
-int vixPlaybackFrameSelect(unsigned int frame)
+static int mach64_frame_sel(unsigned int frame)
 {
     uint32_t off[6];
     int i;
@@ -960,19 +960,19 @@
     return 0;
 }
 
-vidix_video_eq_t equal =
+static vidix_video_eq_t equal =
 {
  VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION
  ,
  0, 0, 0, 0, 0, 0, 0, 0 };
 
-int 	vixPlaybackGetEq( vidix_video_eq_t * eq)
+static int mach64_get_eq( vidix_video_eq_t * eq)
 {
   memcpy(eq,&equal,sizeof(vidix_video_eq_t));
   return 0;
 }
 
-int 	vixPlaybackSetEq( const vidix_video_eq_t * eq)
+static int mach64_set_eq( const vidix_video_eq_t * eq)
 {
   int br,sat;
     if(eq->cap & VEQ_CAP_BRIGHTNESS) equal.brightness = eq->brightness;
@@ -994,13 +994,13 @@
   return 0;
 }
 
-int vixGetGrKeys(vidix_grkey_t *grkey)
+static int mach64_get_gkeys(vidix_grkey_t *grkey)
 {
     memcpy(grkey, &mach64_grkey, sizeof(vidix_grkey_t));
     return(0);
 }
 
-int vixSetGrKeys(const vidix_grkey_t *grkey)
+static int mach64_set_gkeys(const vidix_grkey_t *grkey)
 {
     memcpy(&mach64_grkey, grkey, sizeof(vidix_grkey_t));
 
@@ -1064,3 +1064,22 @@
 
     return(0);
 }
+
+VDXDriver mach64_drv = {
+  "mach64",
+  NULL,
+  .probe = mach64_probe,
+  .get_version = mach64_get_version,
+  .get_caps = mach64_get_caps,
+  .query_fourcc = mach64_query_fourcc,
+  .init = mach64_init,
+  .destroy = mach64_destroy,
+  .config_playback = mach64_config_playback,
+  .playback_on = mach64_playback_on,
+  .playback_off = mach64_playback_off,
+  .frame_sel = mach64_frame_sel,
+  .get_eq = mach64_get_eq,
+  .set_eq = mach64_set_eq,
+  .get_gkey = mach64_get_gkeys,
+  .set_gkey = mach64_set_gkeys,
+};
--- a/vidix/mga_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/mga_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -55,6 +55,7 @@
 #include <inttypes.h>
 
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
@@ -343,7 +344,7 @@
 }
 #endif
 
-int vixPlaybackFrameSelect(unsigned int frame)
+static int mga_frame_select(unsigned int frame)
 {
     mga_next_frame = frame;
     if (mga_verbose>1) printf("[mga] frameselect: %d\n", mga_next_frame);
@@ -696,7 +697,7 @@
 }
 #endif /* MGA_ALLOW_IRQ */
 
-int vixConfigPlayback(vidix_playback_t *config)
+static int mga_config_playback(vidix_playback_t *config)
 {
 	unsigned int i;
 	int x, y, sw, sh, dw, dh;
@@ -1152,7 +1153,7 @@
     return(0);
 }
 
-int vixPlaybackOn(void)
+static int mga_playback_on(void)
 {
     if (mga_verbose) printf("[mga] playback on\n");
 
@@ -1171,7 +1172,7 @@
     return(0);
 }
 
-int vixPlaybackOff(void)
+static int mga_playback_off(void)
 {
     if (mga_verbose) printf("[mga] playback off\n");
 
@@ -1187,7 +1188,7 @@
     return(0);
 }
 
-int vixProbe(int verbose,int force)
+static int mga_probe(int verbose,int force)
 {
 	pciinfo_t lst[MAX_PCI_DEVICES];
 	unsigned int i, num_pci;
@@ -1258,7 +1259,7 @@
 	return(0);
 }
 
-int vixInit(void)
+static int mga_init(void)
 {
     unsigned int card_option = 0;
     int err;
@@ -1387,7 +1388,7 @@
     return(0);
 }
 
-void vixDestroy(void)
+static void mga_destroy(void)
 {
     if (mga_verbose) printf("[mga] destroy\n");
 
@@ -1411,7 +1412,7 @@
     return;
 }
 
-int vixQueryFourcc(vidix_fourcc_t *to)
+static int mga_query_fourcc(vidix_fourcc_t *to)
 {
     if (mga_verbose) printf("[mga] query fourcc (%x)\n", to->fourcc);
 
@@ -1435,31 +1436,31 @@
     return(0);
 }
 
-unsigned int vixGetVersion(void)
+static unsigned int mga_get_version(void)
 {
     return(VIDIX_VERSION);
 }
 
-int vixGetCapability(vidix_capability_t *to)
+static int mga_get_caps(vidix_capability_t *to)
 {
     memcpy(to, &mga_cap, sizeof(vidix_capability_t));
     return(0);
 }
 
-int vixGetGrKeys(vidix_grkey_t *grkey)
+static int mga_get_gkeys(vidix_grkey_t *grkey)
 {
     memcpy(grkey, &mga_grkey, sizeof(vidix_grkey_t));
     return(0);
 }
 
-int vixSetGrKeys(const vidix_grkey_t *grkey)
+static int mga_set_gkeys(const vidix_grkey_t *grkey)
 {
     memcpy(&mga_grkey, grkey, sizeof(vidix_grkey_t));
     mga_vid_write_regs(0);
     return(0);
 }
 
-int vixPlaybackSetEq( const vidix_video_eq_t * eq)
+static int mga_set_eq( const vidix_video_eq_t * eq)
 {
     /* contrast and brightness control isn't supported on G200 - alex */
     if (!is_g400)
@@ -1487,7 +1488,7 @@
     return(0);
 }
 
-int vixPlaybackGetEq( vidix_video_eq_t * eq)
+static int mga_get_eq( vidix_video_eq_t * eq)
 {
     /* contrast and brightness control isn't supported on G200 - alex */
     if (!is_g400)
@@ -1506,3 +1507,28 @@
 
     return(0);
 }
+
+#ifndef CRTC2
+VDXDriver mga_drv = {
+  "mga",
+#else
+VDXDriver mga_crtc2_drv = {
+  "mga_crtc2",
+#endif
+  NULL,
+    
+  .probe = mga_probe,
+  .get_version = mga_get_version,
+  .get_caps = mga_get_caps,
+  .query_fourcc = mga_query_fourcc,
+  .init = mga_init,
+  .destroy = mga_destroy,
+  .config_playback = mga_config_playback,
+  .playback_on = mga_playback_on,
+  .playback_off = mga_playback_off,
+  .frame_sel = mga_frame_select,
+  .get_eq = mga_get_eq,
+  .set_eq = mga_set_eq,
+  .get_gkey = mga_get_gkeys,
+  .set_gkey = mga_set_gkeys,
+};
--- a/vidix/nvidia_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/nvidia_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -19,6 +19,7 @@
 
 
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
@@ -52,7 +53,7 @@
 };
 
 
-unsigned int vixGetVersion(void){
+static unsigned int nv_get_version(void){
     return(VIDIX_VERSION);
 }
 
@@ -164,7 +165,7 @@
   return -1;
 }
 
-int vixProbe(int verbose, int force){
+static int nv_probe(int verbose, int force){
     pciinfo_t lst[MAX_PCI_DEVICES];
     unsigned i,num_pci;
     int err;
@@ -703,7 +704,7 @@
 
       
       
-int vixInit(void){
+static int nv_init(void){
 	int mtrr;
   info = calloc(1,sizeof(rivatv_info));
   info->control_base = map_phys_mem(pci_info.base0, 0x00C00000 + 0x00008000);
@@ -793,13 +794,13 @@
   return 0;
 }
 
-void vixDestroy(void){
+static void nv_destroy(void){
   unmap_phys_mem(info->control_base ,0x00C00000 + 0x00008000);
   unmap_phys_mem(info->video_base, info->chip.fbsize);
   free(info);
 }
 
-int vixGetCapability(vidix_capability_t *to){
+static int nv_get_caps(vidix_capability_t *to){
     memcpy(to, &nvidia_cap, sizeof(vidix_capability_t));
     return 0;
 }
@@ -812,7 +813,7 @@
 		return 0;
 }
 
-int vixQueryFourcc(vidix_fourcc_t *to){
+static int nv_query_fourcc(vidix_fourcc_t *to){
     if(is_supported_fourcc(to->fourcc)){
 	to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP |
 		    VID_DEPTH_4BPP | VID_DEPTH_8BPP |
@@ -826,7 +827,7 @@
     return ENOSYS;
 }
 
-int vixConfigPlayback(vidix_playback_t *vinfo){
+static int nv_config_playback(vidix_playback_t *vinfo){
     uint32_t i;
     printf("called %s\n", __FUNCTION__);
     if (! is_supported_fourcc(vinfo->fourcc))
@@ -872,17 +873,17 @@
     return 0;
 }
 
-int vixPlaybackOn(void){
+static int nv_playback_on(void){
     rivatv_overlay_start(info,info->cur_frame);
     return 0;
 }
 
-int vixPlaybackOff(void){
+static int nv_playback_off(void){
     rivatv_overlay_stop(info);
     return 0;
 }
 
-int vixSetGrKeys( const vidix_grkey_t * grkey){
+static int nv_set_gkeys( const vidix_grkey_t * grkey){
   if (grkey->ckey.op == CKEY_FALSE)
   {
     info->use_colorkey = 0;
@@ -897,7 +898,7 @@
   return 0;
 }
 
-int vixPlaybackFrameSelect(unsigned int frame){
+static int nv_frame_sel(unsigned int frame){
 //  printf("selecting buffer %d\n", frame);
   rivatv_overlay_start(info, frame);
   if (info->num_frames >= 1)
@@ -905,7 +906,7 @@
   return 0;
 }
 
-int vixPlaybackSetEq(const vidix_video_eq_t *eq_parm) {
+static int nv_set_eq(const vidix_video_eq_t *eq_parm) {
   double angle;
   int16_t chrom_cos, chrom_sin;
   if (eq_parm->cap & VEQ_CAP_BRIGHTNESS)
@@ -928,8 +929,25 @@
   return 0;
 }
 
-int vixPlaybackGetEq(vidix_video_eq_t *eq_parm) {
+static int nv_get_eq(vidix_video_eq_t *eq_parm) {
   memcpy(eq_parm, &eq.vals, sizeof(vidix_video_eq_t));
   return 0;
 }
 
+VDXDriver nvidia_drv = {
+  "nvidia",
+  NULL,
+  .probe = nv_probe,
+  .get_version = nv_get_version,
+  .get_caps = nv_get_caps,
+  .query_fourcc = nv_query_fourcc,
+  .init = nv_init,
+  .destroy = nv_destroy,
+  .config_playback = nv_config_playback,
+  .playback_on = nv_playback_on,
+  .playback_off = nv_playback_off,
+  .frame_sel = nv_frame_sel,
+  .get_eq = nv_get_eq,
+  .set_eq = nv_set_eq,
+  .set_gkey = nv_set_gkeys,
+};
--- a/vidix/pm3_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/pm3_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -26,6 +26,7 @@
 #include <unistd.h>
 
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
@@ -65,7 +66,7 @@
 };
 
 
-unsigned int vixGetVersion(void)
+static unsigned int pm3_get_version(void)
 {
     return(VIDIX_VERSION);
 }
@@ -85,7 +86,7 @@
   return -1;
 }
 
-int vixProbe(int verbose, int force)
+static int pm3_probe(int verbose, int force)
 {
     pciinfo_t lst[MAX_PCI_DEVICES];
     unsigned i,num_pci;
@@ -134,20 +135,20 @@
     printf("[pm3] " #reg " (%x) = %#lx (%li)\n", reg, _foo, _foo);	\
 }
 
-int vixInit(void)
+static int pm3_init(void)
 {
     pm3_reg_base = map_phys_mem(pci_info.base0, 0x20000);
     pm3_mem = map_phys_mem(pci_info.base2, 0x2000000);
     return 0;
 }
 
-void vixDestroy(void)
+static void pm3_destroy(void)
 {
     unmap_phys_mem(pm3_reg_base, 0x20000);
     unmap_phys_mem(pm3_mem, 0x2000000);
 }
 
-int vixGetCapability(vidix_capability_t *to)
+static int pm3_get_caps(vidix_capability_t *to)
 {
     memcpy(to, &pm3_cap, sizeof(vidix_capability_t));
     return 0;
@@ -164,7 +165,7 @@
     }
 }
 
-int vixQueryFourcc(vidix_fourcc_t *to)
+static int pm3_query_fourcc(vidix_fourcc_t *to)
 {
     if(is_supported_fourcc(to->fourcc))
     {
@@ -228,7 +229,7 @@
 
 static long overlay_mode, overlay_control;
 
-int vixConfigPlayback(vidix_playback_t *info)
+static int pm3_config_playback(vidix_playback_t *info)
 {
     int shrink, zoom;
     short src_w, drw_w;
@@ -339,7 +340,7 @@
     return 0;
 }
 
-int vixPlaybackOn(void)
+static int pm3_playback_on(void)
 {
     TRACE_ENTER();
 
@@ -354,7 +355,7 @@
     return 0;
 }
 
-int vixPlaybackOff(void)
+static int pm3_playback_off(void)
 {
     RAMDAC_SET_REG(PM3RD_VideoOverlayControl,
 		   PM3RD_VideoOverlayControl_DISABLE);
@@ -368,8 +369,23 @@
     return 0;
 }
 
-int vixPlaybackFrameSelect(unsigned int frame)
+static int pm3_frame_select(unsigned int frame)
 {
     WRITE_REG(PM3VideoOverlayBase0, frames[frame]);
     return 0;
 }
+
+VDXDriver pm3_drv = {
+  "pm3",
+  NULL,
+  .probe = pm3_probe,
+  .get_version = pm3_get_version,
+  .get_caps = pm3_get_caps,
+  .query_fourcc = pm3_query_fourcc,
+  .init = pm3_init,
+  .destroy = pm3_destroy,
+  .config_playback = pm3_config_playback,
+  .playback_on = pm3_playback_on,
+  .playback_off = pm3_playback_off,
+  .frame_sel = pm3_frame_select,
+};
--- a/vidix/radeon_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/radeon_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -22,6 +22,7 @@
 #include "../libdha/pci_ids.h"
 #include "../libdha/pci_names.h"
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "radeon.h"
@@ -794,7 +795,7 @@
 }
 
 
-unsigned vixGetVersion( void ) { return VIDIX_VERSION; }
+static unsigned int radeon_get_version( void ) { return VIDIX_VERSION; }
 
 static unsigned short ati_card_ids[] = 
 {
@@ -930,7 +931,7 @@
 static pciinfo_t pci_info;
 static int probed=0;
 
-vidix_capability_t def_cap = 
+static vidix_capability_t def_cap = 
 {
 #ifdef RAGE128
     "BES driver for Rage128 cards",
@@ -981,7 +982,7 @@
 }
 #endif
 
-int vixProbe( int verbose,int force )
+static int radeon_probe( int verbose,int force )
 {
   pciinfo_t lst[MAX_PCI_DEVICES];
   unsigned i,num_pci;
@@ -1139,7 +1140,7 @@
 
 static void radeon_vid_dump_regs( void ); /* forward declaration */
 
-int vixInit( void )
+static int radeon_init( void )
 {
   int err;
   if(!probed) 
@@ -1239,7 +1240,7 @@
   return 0;  
 }
 
-void vixDestroy( void )
+static void radeon_destroy( void )
 {
   /* remove colorkeying */
   radeon_fifo_wait(3);
@@ -1264,7 +1265,7 @@
   unmap_phys_mem(radeon_mmio_base,0xFFFF);
 }
 
-int vixGetCapability(vidix_capability_t *to)
+static int radeon_get_caps(vidix_capability_t *to)
 {
   memcpy(to,&def_cap,sizeof(vidix_capability_t));
   return 0; 
@@ -1275,7 +1276,7 @@
   YUY2, UYVY, DDES, OGLT, OGL2, OGLS, OGLB, OGNT, OGNZ, OGNS,
   IF09, YVU9, IMC4, M2IA, IYUV, VBID, DXT1, DXT2, DXT3, DXT4, DXT5
 */
-uint32_t supported_fourcc[] = 
+static uint32_t supported_fourcc[] = 
 {
   IMGFMT_Y800, IMGFMT_Y8, IMGFMT_YVU9, IMGFMT_IF09,
   IMGFMT_YV12, IMGFMT_I420, IMGFMT_IYUV, 
@@ -1295,7 +1296,7 @@
   return 0;
 }
 
-int vixQueryFourcc(vidix_fourcc_t *to)
+static int radeon_query_fourcc(vidix_fourcc_t *to)
 {
     if(is_supported_fourcc(to->fourcc))
     {
@@ -1803,7 +1804,7 @@
   }
 }
 
-int vixConfigPlayback(vidix_playback_t *info)
+static int radeon_config_playback(vidix_playback_t *info)
 {
   unsigned rgb_size,nfr;
   if(!is_supported_fourcc(info->fourcc)) return ENOSYS;
@@ -1844,19 +1845,19 @@
   return 0;
 }
 
-int vixPlaybackOn( void )
+static int radeon_playback_on( void )
 {
   radeon_vid_display_video();
   return 0;
 }
 
-int vixPlaybackOff( void )
+static int radeon_playback_off( void )
 {
   radeon_vid_stop_video();
   return 0;
 }
 
-int vixPlaybackFrameSelect(unsigned frame)
+static int radeon_frame_select(unsigned frame)
 {
     uint32_t off[6];
     int prev_frame= (frame-1+besr.vid_nbufs) % besr.vid_nbufs;
@@ -1889,7 +1890,7 @@
     return 0;
 }
 
-vidix_video_eq_t equal =
+static vidix_video_eq_t equal =
 {
  VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION
 #ifndef RAGE128
@@ -1898,7 +1899,7 @@
  ,
  0, 0, 0, 0, 0, 0, 0, 0 };
 
-int 	vixPlaybackGetEq( vidix_video_eq_t * eq)
+static int radeon_get_eq( vidix_video_eq_t * eq)
 {
   memcpy(eq,&equal,sizeof(vidix_video_eq_t));
   return 0;
@@ -1913,7 +1914,7 @@
 #define RTFCheckParam(a) {if((a)<-1000) (a)=-1000; if((a)>1000) (a)=1000;}
 #endif
 
-int 	vixPlaybackSetEq( const vidix_video_eq_t * eq)
+static int radeon_set_eq( const vidix_video_eq_t * eq)
 {
 #ifdef RAGE128
   int br,sat;
@@ -1958,7 +1959,7 @@
   return 0;
 }
 
-int 	vixPlaybackSetDeint( const vidix_deinterlace_t * info)
+static int radeon_playback_set_deint (const vidix_deinterlace_t * info)
 {
   unsigned sflg;
   switch(info->flags)
@@ -1996,7 +1997,7 @@
   return 0;  
 }
 
-int 	vixPlaybackGetDeint( vidix_deinterlace_t * info)
+static int radeon_playback_get_deint (vidix_deinterlace_t * info)
 {
   if(!besr.deinterlace_on) info->flags = CFG_NON_INTERLACED;
   else
@@ -2087,15 +2088,42 @@
     OUTREG(OV0_KEY_CNTL,besr.ckey_cntl);
 }
 
-int vixGetGrKeys(vidix_grkey_t *grkey)
+static int radeon_get_gkey(vidix_grkey_t *grkey)
 {
     memcpy(grkey, &radeon_grkey, sizeof(vidix_grkey_t));
     return(0);
 }
 
-int vixSetGrKeys(const vidix_grkey_t *grkey)
+static int radeon_set_gkey(const vidix_grkey_t *grkey)
 {
     memcpy(&radeon_grkey, grkey, sizeof(vidix_grkey_t));
     set_gr_key();
     return(0);
 }
+
+#ifdef RAGE128
+VDXDriver rage128_drv = {
+  "rage128",
+#else
+VDXDriver radeon_drv = {
+  "radeon",
+#endif
+  NULL,
+    
+  .probe = radeon_probe,
+  .get_version = radeon_get_version,
+  .get_caps = radeon_get_caps,
+  .query_fourcc = radeon_query_fourcc,
+  .init = radeon_init,
+  .destroy = radeon_destroy,
+  .config_playback = radeon_config_playback,
+  .playback_on = radeon_playback_on,
+  .playback_off = radeon_playback_off,
+  .frame_sel = radeon_frame_select,
+  .get_eq = radeon_get_eq,
+  .set_eq = radeon_set_eq,
+  .get_deint = radeon_playback_get_deint,
+  .set_deint = radeon_playback_set_deint,
+  .get_gkey = radeon_get_gkey,
+  .set_gkey = radeon_set_gkey,
+};
--- a/vidix/savage_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/savage_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -39,6 +39,7 @@
 #include <math.h>
 
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
@@ -768,8 +769,8 @@
  *
  * @return vidix version number.
  */
-unsigned int
-vixGetVersion (void)
+static unsigned int
+savage_get_version (void)
 {
   return (VIDIX_VERSION);
 }
@@ -803,7 +804,7 @@
  *          a negative error code otherwise.
  */
 
-int vixProbe(int verbose, int force){
+static int savage_probe(int verbose, int force){
     pciinfo_t lst[MAX_PCI_DEVICES];
     unsigned i,num_pci;
     int err;
@@ -849,8 +850,8 @@
  * @returns 0 if ok.
  *          a negative error code otherwise.
  */
-int
-vixInit (void)
+static int
+savage_init (void)
 {
 	int mtrr;
   unsigned char config1, m, n, n1, n2, sr8, cr3f, cr66 = 0, tmp;
@@ -1033,8 +1034,8 @@
 /**
  * @brief Destroys driver.
  */
-void
-vixDestroy (void)
+static void
+savage_destroy (void)
 {
 	unmap_phys_mem(info->video_base, info->chip.fbsize);
 	unmap_phys_mem(info->control_base, SAVAGE_NEWMMIO_REGSIZE);
@@ -1048,8 +1049,8 @@
  *
  * @returns 0.
  */
-int
-vixGetCapability (vidix_capability_t * to)
+static int
+savage_get_caps (vidix_capability_t * to)
 {
   memcpy (to, &savage_cap, sizeof (vidix_capability_t));
   return 0;
@@ -1091,8 +1092,8 @@
  * @returns 0 if ok.
  *          errno otherwise.
  */
-int
-vixQueryFourcc (vidix_fourcc_t * to)
+static int
+savage_query_fourcc (vidix_fourcc_t * to)
 {
   if (is_supported_fourcc (to->fourcc))
     {
@@ -1133,8 +1134,8 @@
  *
  * @return 0.
  */
-int
-vixSetGrKeys (const vidix_grkey_t * grkey)
+static int
+savage_set_gkeys (const vidix_grkey_t * grkey)
 {
   if (grkey->ckey.op == CKEY_FALSE)
   {
@@ -1156,7 +1157,7 @@
 /**
  * @brief Unichrome driver equalizer capabilities.
  */
-vidix_video_eq_t equal = {
+static vidix_video_eq_t equal = {
   VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION | VEQ_CAP_HUE,
   300, 100, 0, 0, 0, 0, 0, 0
 };
@@ -1169,8 +1170,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackGetEq (vidix_video_eq_t * eq)
+static int
+savage_get_eq (vidix_video_eq_t * eq)
 {
   memcpy (eq, &equal, sizeof (vidix_video_eq_t));
   return 0;
@@ -1183,8 +1184,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackSetEq (const vidix_video_eq_t * eq)
+static int
+savage_set_eq (const vidix_video_eq_t * eq)
 {
   return 0;
 }
@@ -1202,8 +1203,8 @@
  * @returns  0 in case of success.
  *          -1 otherwise.
  */
-int
-vixConfigPlayback (vidix_playback_t * vinfo)
+static int
+savage_config_playback (vidix_playback_t * vinfo)
 {
   int uv_size, swap_uv;
   unsigned int i;
@@ -1325,8 +1326,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackOn (void)
+static int
+savage_playback_on (void)
 {
  // FIXME: enable
   SavageDisplayVideoOld();
@@ -1339,8 +1340,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackOff (void)
+static int
+savage_playback_off (void)
 {
 	// otherwise we wont disable streams properly in new xorg
 	// FIXME: shouldnt this be enabled?
@@ -1365,8 +1366,8 @@
  *       and never used for single buffering playback.
  */
 #if 0
-int
-vixPlaybackFrameSelect (unsigned int frame)
+static int
+savage_frame_select (unsigned int frame)
 {
 ////FIXME ADD
 //    savage_overlay_start(info, frame);
@@ -1472,4 +1473,22 @@
     fprintf(stderr,":\t\t 0x%08X = %u\n",val,val);
 }
 
-
+VDXDriver savage_drv = {
+  "savage",
+  NULL,
+  .probe = savage_probe,
+  .get_version = savage_get_version,
+  .get_caps = savage_get_caps,
+  .query_fourcc = savage_query_fourcc,
+  .init = savage_init,
+  .destroy = savage_destroy,
+  .config_playback = savage_config_playback,
+  .playback_on = savage_playback_on,
+  .playback_off = savage_playback_off,
+#if 0
+  .frame_sel = savage_frame_select,
+#endif
+  .get_eq = savage_get_eq,
+  .set_eq = savage_set_eq,
+  .set_gkey = savage_set_gkeys,
+};
--- a/vidix/sis_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/sis_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -31,6 +31,7 @@
 #include <unistd.h>
 
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
@@ -148,7 +149,7 @@
     {0, 0, 0, 0}
 };
 
-vidix_video_eq_t sis_equal = {
+static vidix_video_eq_t sis_equal = {
     VEQ_CAP_BRIGHTNESS | VEQ_CAP_CONTRAST,
     200, 0, 0, 0, 0, 0, 0, 0
 };
@@ -237,7 +238,7 @@
 }
 
 
-unsigned int vixGetVersion(void)
+static unsigned int sis_get_version(void)
 {
     return (VIDIX_VERSION);
 }
@@ -252,7 +253,7 @@
     return -1;
 }
 
-int vixProbe(int verbose, int force)
+static int sis_probe(int verbose, int force)
 {
     pciinfo_t lst[MAX_PCI_DEVICES];
     unsigned i, num_pci;
@@ -343,7 +344,7 @@
     return err;
 }
 
-int vixInit(void)
+static int sis_init(void)
 {
     uint8_t sr_data, cr_data, cr_data2;
     char *env_overlay_crt;
@@ -406,14 +407,14 @@
     return 0;
 }
 
-void vixDestroy(void)
+static void sis_destroy(void)
 {
     /* unmap_phys_mem(sis_reg_base, 0x20000); */
     /* JCP: see above, hence also a hack. */
     unmap_phys_mem(sis_mem_base, 0x1000000);
 }
 
-int vixGetCapability(vidix_capability_t * to)
+static int sis_get_caps(vidix_capability_t * to)
 {
     memcpy(to, &sis_cap, sizeof(vidix_capability_t));
     return 0;
@@ -434,7 +435,7 @@
     }
 }
 
-int vixQueryFourcc(vidix_fourcc_t * to)
+static int sis_query_fourcc(vidix_fourcc_t * to)
 {
     if (is_supported_fourcc(to->fourcc)) {
 	to->depth = VID_DEPTH_8BPP | VID_DEPTH_16BPP | VID_DEPTH_32BPP;
@@ -595,7 +596,9 @@
     }
 }
 
-int vixConfigPlayback(vidix_playback_t * info)
+static int sis_set_eq(const vidix_video_eq_t * eq);
+
+static int sis_config_playback(vidix_playback_t * info)
 {
     SISOverlayRec overlay;
     int srcOffsetX = 0, srcOffsetY = 0;
@@ -822,7 +825,7 @@
 
     set_colorkey();
 
-    vixPlaybackSetEq(&sis_equal);
+    sis_set_eq(&sis_equal);
 
     /* set up video overlay registers */
     set_overlay(&overlay, index);
@@ -837,13 +840,13 @@
     return 0;
 }
 
-int vixPlaybackOn(void)
+static int sis_playback_on(void)
 {
     setvideoregmask(Index_VI_Control_Misc0, 0x02, 0x02);
     return 0;
 }
 
-int vixPlaybackOff(void)
+static int sis_playback_off(void)
 {
     unsigned char sridx, cridx;
     sridx = inSISREG(SISSR);
@@ -855,7 +858,7 @@
     return 0;
 }
 
-int vixPlaybackFrameSelect(unsigned int frame)
+static int sis_frame_select(unsigned int frame)
 {
     uint8_t data;
     int index = 0;
@@ -925,26 +928,26 @@
     return 0;
 }
 
-int vixGetGrKeys(vidix_grkey_t * grkey)
+static int sis_get_gkeys(vidix_grkey_t * grkey)
 {
     memcpy(grkey, &sis_grkey, sizeof(vidix_grkey_t));
     return 0;
 }
 
-int vixSetGrKeys(const vidix_grkey_t * grkey)
+static int sis_set_gkeys(const vidix_grkey_t * grkey)
 {
     memcpy(&sis_grkey, grkey, sizeof(vidix_grkey_t));
     set_colorkey();
     return 0;
 }
 
-int vixPlaybackGetEq(vidix_video_eq_t * eq)
+static int sis_get_eq(vidix_video_eq_t * eq)
 {
     memcpy(eq, &sis_equal, sizeof(vidix_video_eq_t));
     return 0;
 }
 
-int vixPlaybackSetEq(const vidix_video_eq_t * eq)
+static int sis_set_eq(const vidix_video_eq_t * eq)
 {
     int br, sat, cr, hue;
     if (eq->cap & VEQ_CAP_BRIGHTNESS)
@@ -1558,3 +1561,23 @@
     setvideoreg(Index_VI_Key_Overlay_OP, data | (alpha << 4));
 }
 #endif
+
+VDXDriver sis_drv = {
+  "sis",
+  NULL,
+    
+  .probe = sis_probe,
+  .get_version = sis_get_version,
+  .get_caps = sis_get_caps,
+  .query_fourcc = sis_query_fourcc,
+  .init = sis_init,
+  .destroy = sis_destroy,
+  .config_playback = sis_config_playback,
+  .playback_on = sis_playback_on,
+  .playback_off = sis_playback_off,
+  .frame_sel = sis_frame_select,
+  .get_eq = sis_get_eq,
+  .set_eq = sis_set_eq,
+  .get_gkey = sis_get_gkeys,
+  .set_gkey = sis_set_gkeys,
+};
--- a/vidix/unichrome_vid.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/unichrome_vid.c	Sun Apr 01 11:06:06 2007 +0000
@@ -40,6 +40,7 @@
 #include <unistd.h>
 
 #include "vidix.h"
+#include "vidixlib.h"
 #include "fourcc.h"
 #include "../libdha/libdha.h"
 #include "../libdha/pci_ids.h"
@@ -120,8 +121,8 @@
  *
  * @return vidix version number.
  */
-unsigned int
-vixGetVersion (void)
+static unsigned int
+unichrome_get_version (void)
 {
   return (VIDIX_VERSION);
 }
@@ -474,8 +475,8 @@
  * @returns 0 if it can handle something in PC.
  *          a negative error code otherwise.
  */
-int
-vixProbe (int verbose, int force)
+static int
+unichrome_probe (int verbose, int force)
 {
   pciinfo_t lst[MAX_PCI_DEVICES];
   unsigned i, num_pci;
@@ -526,8 +527,8 @@
  * @returns 0 if ok.
  *          a negative error code otherwise.
  */
-int
-vixInit (void)
+static int
+unichrome_init (void)
 {
   long tmp;
   uc_mem = map_phys_mem (pci_info.base0, VIDEOMEMORY_SIZE);
@@ -576,8 +577,8 @@
 /**
  * @brief Destroys driver.
  */
-void
-vixDestroy (void)
+static void
+unichrome_destroy (void)
 {
 #ifdef DEBUG_LOGFILE
   if (logfile)
@@ -602,8 +603,8 @@
  *
  * @returns 0.
  */
-int
-vixGetCapability (vidix_capability_t * to)
+static int
+unichrome_get_caps (vidix_capability_t * to)
 {
   memcpy (to, &uc_cap, sizeof (vidix_capability_t));
   return 0;
@@ -644,8 +645,8 @@
  * @returns 0 if ok.
  *          errno otherwise.
  */
-int
-vixQueryFourcc (vidix_fourcc_t * to)
+static int
+unichrome_query_fourcc (vidix_fourcc_t * to)
 {
   if (is_supported_fourcc (to->fourcc))
     {
@@ -668,8 +669,8 @@
  *
  * @return 0.
  */
-int
-vixGetGrKeys (vidix_grkey_t * grkey)
+static int
+unichrome_get_gkey (vidix_grkey_t * grkey)
 {
   memcpy (grkey, &uc_grkey, sizeof (vidix_grkey_t));
   return (0);
@@ -682,8 +683,8 @@
  *
  * @return 0.
  */
-int
-vixSetGrKeys (const vidix_grkey_t * grkey)
+static int
+unichrome_set_gkey (const vidix_grkey_t * grkey)
 {
   unsigned long dwCompose = VIDEO_IN (vio, V_COMPOSE_MODE) & ~0x0f;
   memcpy (&uc_grkey, grkey, sizeof (vidix_grkey_t));
@@ -714,7 +715,7 @@
 /**
  * @brief Unichrome driver equalizer capabilities.
  */
-vidix_video_eq_t equal = {
+static vidix_video_eq_t equal = {
   VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION | VEQ_CAP_HUE,
   300, 100, 0, 0, 0, 0, 0, 0
 };
@@ -727,8 +728,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackGetEq (vidix_video_eq_t * eq)
+static int
+unichrome_get_eq (vidix_video_eq_t * eq)
 {
   memcpy (eq, &equal, sizeof (vidix_video_eq_t));
   return 0;
@@ -741,8 +742,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackSetEq (const vidix_video_eq_t * eq)
+static int
+unichrome_set_eq (const vidix_video_eq_t * eq)
 {
   return 0;
 }
@@ -752,6 +753,8 @@
  */
 static int YOffs, UOffs, VOffs;
 
+static int unichrome_frame_select (unsigned int frame);
+
 /**
  * @brief Configure driver for playback. Driver should prepare BES.
  *
@@ -760,8 +763,8 @@
  * @returns  0 in case of success.
  *          -1 otherwise.
  */
-int
-vixConfigPlayback (vidix_playback_t * info)
+static int
+unichrome_config_playback (vidix_playback_t * info)
 {
   int src_w, drw_w;
   int src_h, drw_h;
@@ -896,7 +899,7 @@
   VIDEO_OUT (vio, V1_ZOOM_CONTROL, zoom);
 
   /* Configure buffer address and execute the changes now! */
-  vixPlaybackFrameSelect (0);
+  unichrome_frame_select (0);
 
   return 0;
 }
@@ -906,8 +909,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackOn (void)
+static int
+unichrome_playback_on (void)
 {
   LOGWRITE ("Enable overlay\n");
 
@@ -926,8 +929,8 @@
  *
  * @return 0.
  */
-int
-vixPlaybackOff (void)
+static int
+unichrome_playback_off (void)
 {
   LOGWRITE ("Disable overlay\n");
 
@@ -956,8 +959,8 @@
  * @note This function is used only for double and triple buffering
  *       and never used for single buffering playback.
  */
-int
-vixPlaybackFrameSelect (unsigned int frame)
+static int
+unichrome_frame_select (unsigned int frame)
 {
   LOGWRITE ("Frame select\n");
 
@@ -974,3 +977,22 @@
 
   return 0;
 }
+
+VDXDriver unichrome_drv = {
+  "unichrome",
+  NULL,
+  .probe = unichrome_probe,
+  .get_version = unichrome_get_version,
+  .get_caps = unichrome_get_caps,
+  .query_fourcc = unichrome_query_fourcc,
+  .init = unichrome_init,
+  .destroy = unichrome_destroy,
+  .config_playback = unichrome_config_playback,
+  .playback_on = unichrome_playback_on,
+  .playback_off = unichrome_playback_off,
+  .frame_sel = unichrome_frame_select,
+  .get_eq = unichrome_get_eq,
+  .set_eq = unichrome_set_eq,
+  .get_gkey = unichrome_get_gkey,
+  .set_gkey = unichrome_set_gkey,
+};
--- a/vidix/vidixlib.c	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/vidixlib.c	Sun Apr 01 11:06:06 2007 +0000
@@ -21,238 +21,81 @@
 #include <errno.h>
 #include <string.h>
 
-#ifndef WIN32
-#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */
-#else
-#include <windows.h>
-#define dlsym(h,s) GetProcAddress(h,s)
-#define dlopen(h,s) LoadLibrary(h)
-#define dlclose(h) FreeLibrary(h)
-static char* dlerror(){
- char errormsg[10];
- sprintf(errormsg,"%i\n",GetLastError());
- return errormsg;
-}
-#endif
-
-
-#include <dirent.h>
-
-#if defined(__OpenBSD__) && !defined(__ELF__)
-#define dlsym(h,s) dlsym(h, "_" s)
-#endif
-
 #include "vidixlib.h"
+#include "drivers.h"
 #include "../config.h"
 #include "../libavutil/common.h"
 #include "../mpbswap.h"
 
-static char drv_name[FILENAME_MAX];
-
-typedef struct vdl_stream_s
-{
-	void *  handle;
-	int	(*get_caps)(vidix_capability_t *);
-	int	(*query_fourcc)(vidix_fourcc_t *);
-	int	(*config_playback)(vidix_playback_t *);
-	int 	(*playback_on)( void );
-	int 	(*playback_off)( void );
-        /* Functions below can be missed in driver ;) */
-	int	(*init)(void);
-	void    (*destroy)(void);
-	int 	(*frame_sel)( unsigned frame_idx );
-	int 	(*get_eq)( vidix_video_eq_t * );
-	int 	(*set_eq)( const vidix_video_eq_t * );
-	int 	(*get_deint)( vidix_deinterlace_t * );
-	int 	(*set_deint)( const vidix_deinterlace_t * );
-	int 	(*copy_frame)( const vidix_dma_t * );
-	int 	(*get_gkey)( vidix_grkey_t * );
-	int 	(*set_gkey)( const vidix_grkey_t * );
-	int 	(*get_num_fx)( unsigned * );
-	int 	(*get_fx)( vidix_oem_fx_t * );
-	int 	(*set_fx)( const vidix_oem_fx_t * );
-}vdl_stream_t;
-
-#define t_vdl(p) (((vdl_stream_t *)p))
-
-extern unsigned   vdlGetVersion( void )
+extern unsigned int  vdlGetVersion( void )
 {
    return VIDIX_VERSION;
 }
 
-static int vdl_fill_driver(VDL_HANDLE stream)
-{
-  t_vdl(stream)->init		= dlsym(t_vdl(stream)->handle,"vixInit");
-  t_vdl(stream)->destroy	= dlsym(t_vdl(stream)->handle,"vixDestroy");
-  t_vdl(stream)->get_caps	= dlsym(t_vdl(stream)->handle,"vixGetCapability");
-  t_vdl(stream)->query_fourcc	= dlsym(t_vdl(stream)->handle,"vixQueryFourcc");
-  t_vdl(stream)->config_playback= dlsym(t_vdl(stream)->handle,"vixConfigPlayback");
-  t_vdl(stream)->playback_on	= dlsym(t_vdl(stream)->handle,"vixPlaybackOn");
-  t_vdl(stream)->playback_off	= dlsym(t_vdl(stream)->handle,"vixPlaybackOff");
-  t_vdl(stream)->frame_sel	= dlsym(t_vdl(stream)->handle,"vixPlaybackFrameSelect");
-  t_vdl(stream)->get_eq	= dlsym(t_vdl(stream)->handle,"vixPlaybackGetEq");
-  t_vdl(stream)->set_eq	= dlsym(t_vdl(stream)->handle,"vixPlaybackSetEq");
-  t_vdl(stream)->get_gkey	= dlsym(t_vdl(stream)->handle,"vixGetGrKeys");
-  t_vdl(stream)->set_gkey	= dlsym(t_vdl(stream)->handle,"vixSetGrKeys");
-  t_vdl(stream)->get_deint	= dlsym(t_vdl(stream)->handle,"vixPlaybackGetDeint");
-  t_vdl(stream)->set_deint	= dlsym(t_vdl(stream)->handle,"vixPlaybackSetDeint");
-  t_vdl(stream)->copy_frame	= dlsym(t_vdl(stream)->handle,"vixPlaybackCopyFrame");
-  t_vdl(stream)->get_num_fx	= dlsym(t_vdl(stream)->handle,"vixQueryNumOemEffects");
-  t_vdl(stream)->get_fx		= dlsym(t_vdl(stream)->handle,"vixGetOemEffect");
-  t_vdl(stream)->set_fx		= dlsym(t_vdl(stream)->handle,"vixSetOemEffect");
-  /* check driver viability */
-  if(!( t_vdl(stream)->get_caps && t_vdl(stream)->query_fourcc &&
-	t_vdl(stream)->config_playback && t_vdl(stream)->playback_on &&
-	t_vdl(stream)->playback_off))
-  {
-    printf("vidixlib: Incomplete driver: some of essential features are missed in it.\n");
-    return 0;
-  }
-  return 1;
-}
-
-#ifndef RTLD_GLOBAL
-#define RTLD_GLOBAL RTLD_LAZY
-#endif
-#ifndef RTLD_NOW
-#define RTLD_NOW RTLD_LAZY
-#endif
-
-static int vdl_probe_driver(VDL_HANDLE stream,const char *path,const char *name,unsigned cap,int verbose)
-{
-  vidix_capability_t vid_cap;
-  unsigned (*_ver)(void);
-  int      (*_probe)(int,int);
-  int      (*_cap)(vidix_capability_t*);
-  strlcpy(drv_name,path, sizeof( drv_name ));
-  strlcat(drv_name,name, sizeof( drv_name ));
-  if(verbose) printf("vidixlib: PROBING: %s\n",drv_name);
-  if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_LAZY|RTLD_GLOBAL)))
-  {
-    if(verbose) printf("vidixlib: %s not driver: %s\n",drv_name,dlerror());
-    return 0;
-  }
-  _ver = dlsym(t_vdl(stream)->handle,"vixGetVersion");
-  _probe = dlsym(t_vdl(stream)->handle,"vixProbe");
-  _cap = dlsym(t_vdl(stream)->handle,"vixGetCapability");
-  if(_ver) 
-  {
-    if((*_ver)() != VIDIX_VERSION) 
-    { 
-      if(verbose) printf("vidixlib: %s has wrong version\n",drv_name);
-      err:
-      dlclose(t_vdl(stream)->handle);
-      t_vdl(stream)->handle = 0;
-      return 0;
-     }
-  }
-  else
-  {
-    fatal_err:
-    if(verbose) printf("vidixlib: %s has no function definition\n",drv_name);
-    goto err;
-  }
-  if(_probe) { if((*_probe)(verbose,PROBE_NORMAL) != 0) goto err; }
-  else goto fatal_err;
-  if(_cap) { if((*_cap)(&vid_cap) != 0) goto err; }
-  else goto fatal_err;
-  if((vid_cap.type & cap) != cap)
-  {
-     if(verbose) printf("vidixlib: Found %s but has no required capability\n",drv_name);
-     goto err;
-  }
-  if(verbose) printf("vidixlib: %s probed o'k\n",drv_name);
-  return 1;
-}
-
-static int vdl_find_driver(VDL_HANDLE stream,const char *path,unsigned cap,int verbose)
-{
-  DIR *dstream;
-  struct dirent *name;
-  int done = 0;
-  if(!(dstream = opendir(path))) return 0;
-  while(!done)
-  {
-    name = readdir(dstream);
-    if(name) 
-    { 
-      if(name->d_name[0] != '.')
-	if(vdl_probe_driver(stream,path,name->d_name,cap,verbose)) break; 
-    }
-    else done = 1;
-  }
-  closedir(dstream);
-  return done?0:1;
-}
-
 VDL_HANDLE vdlOpen(const char *path,const char *name,unsigned cap,int verbose)
 {
-  vdl_stream_t *stream;
-  int errcode;
-  if(!(stream = malloc(sizeof(vdl_stream_t)))) return NULL;
-  memset(stream,0,sizeof(vdl_stream_t));
-  if(name)
+  VDXContext *ctx;
+
+  if (!(ctx = malloc (sizeof (VDXContext))))
+    return NULL;
+  memset (ctx, 0, sizeof (VDXContext));
+
+  /* register all drivers */
+  vidix_register_all_drivers ();
+  
+  if (!vidix_find_driver (ctx, name, cap, verbose))
+  {
+    free (ctx);
+    return NULL;
+  }
+
+  if (verbose)
+    printf ("vidixlib: will use %s driver\n", ctx->drv->name);
+
+  if (!ctx->drv || !ctx->drv->init)
   {
-    unsigned (*ver)(void);
-    int (*probe)(int,int);
-    unsigned version = 0;
-    strlcpy(drv_name,path, sizeof( drv_name ));
-    strlcat(drv_name,name, sizeof( drv_name ));
-    if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_NOW|RTLD_GLOBAL)))
-    {
-      if (verbose)
-	printf("vidixlib: dlopen error: %s\n", dlerror());
-      err:
-      free(stream);
-      return NULL;
-    }
-    ver = dlsym(t_vdl(stream)->handle,"vixGetVersion");
-    if(ver) version = (*ver)();
-    if(version != VIDIX_VERSION)
-    {
-      drv_err:
-      if(t_vdl(stream)->handle) dlclose(t_vdl(stream)->handle);
-      goto err;
-    }
-    probe = dlsym(t_vdl(stream)->handle,"vixProbe");
-    if(probe) { if((*probe)(verbose,PROBE_FORCE)!=0) goto drv_err; }
-    else goto drv_err;
-    fill:
-    if(!vdl_fill_driver(stream)) goto drv_err;
-    goto ok;
+    if (verbose)
+      printf ("vidixlib: Can't init driver\n");
+    free (ctx);
+    return NULL;
   }
-  else
-    if(vdl_find_driver(stream,path,cap,verbose))
-    {
-      if(verbose) printf("vidixlib: will use %s driver\n",drv_name);
-      goto fill;
-    }  
-    else goto err;
-  ok:
-  if(t_vdl(stream)->init)
+  
+  if (verbose)
+    printf ("vidixlib: Attempt to initialize driver at: %p\n",
+            ctx->drv->init);
+
+  if (ctx->drv->init () !=0)
   {
-   if(verbose) printf("vidixlib: Attempt to initialize driver at: %p\n",t_vdl(stream)->init);
-   if((errcode=t_vdl(stream)->init())!=0)
-   {
-    if(verbose) printf("vidixlib: Can't init driver: %s\n",strerror(errcode));
-    goto drv_err;
-   }
-  } 
-  if(verbose) printf("vidixlib: '%s'successfully loaded\n",drv_name);
-  return stream;
+    if (verbose)
+      printf ("vidixlib: Can't init driver\n");
+    free (ctx);
+    return NULL;
+  }
+  
+  if (verbose)
+    printf("vidixlib: '%s'successfully loaded\n", ctx->drv->name);
+  
+  return ctx;
 }
 
 void vdlClose(VDL_HANDLE stream)
 {
-  if(t_vdl(stream)->destroy) t_vdl(stream)->destroy();
-  dlclose(t_vdl(stream)->handle);
-  memset(stream,0,sizeof(vdl_stream_t)); /* <- it's not stupid */
-  free(stream);
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) stream;
+  if (ctx->drv->destroy)
+    ctx->drv->destroy ();
+  
+  memset (ctx, 0, sizeof (VDXContext)); /* <- it's not stupid */
+  free (ctx);
 }
 
 int  vdlGetCapability(VDL_HANDLE handle, vidix_capability_t *cap)
 {
-  return t_vdl(handle)->get_caps(cap);
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  return ctx->drv->get_caps (cap);
 }
 
 #define MPLAYER_IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))
@@ -269,77 +112,155 @@
 
 int  vdlQueryFourcc(VDL_HANDLE handle,vidix_fourcc_t *f)
 {
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
   f->fourcc = normalize_fourcc(f->fourcc);
-  return t_vdl(handle)->query_fourcc(f);
+  return ctx->drv->query_fourcc (f);
 }
 
 int  vdlConfigPlayback(VDL_HANDLE handle,vidix_playback_t *p)
 {
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
   p->fourcc = normalize_fourcc(p->fourcc);
-  return t_vdl(handle)->config_playback(p);
+  return ctx->drv->config_playback (p);
 }
 
 int  vdlPlaybackOn(VDL_HANDLE handle)
 {
-  return t_vdl(handle)->playback_on();
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  return ctx->drv->playback_on ();
 }
 
 int  vdlPlaybackOff(VDL_HANDLE handle)
 {
-  return t_vdl(handle)->playback_off();
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  return ctx->drv->playback_off ();
 }
 
 int  vdlPlaybackFrameSelect(VDL_HANDLE handle, unsigned frame_idx )
 {
-  return t_vdl(handle)->frame_sel ? t_vdl(handle)->frame_sel(frame_idx) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->frame_sel)
+    return ctx->drv->frame_sel (frame_idx);
+
+  return ENOSYS;
 }
 
 int  vdlPlaybackGetEq(VDL_HANDLE handle, vidix_video_eq_t * e)
 {
-  return t_vdl(handle)->get_eq ? t_vdl(handle)->get_eq(e) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->get_eq)
+    return ctx->drv->get_eq (e);
+
+  return ENOSYS;
 }
 
 int  vdlPlaybackSetEq(VDL_HANDLE handle, const vidix_video_eq_t * e)
 {
-  return t_vdl(handle)->set_eq ? t_vdl(handle)->set_eq(e) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->set_eq)
+    return ctx->drv->set_eq (e);
+
+  return ENOSYS;
 }
 
 int  vdlPlaybackCopyFrame(VDL_HANDLE handle, const vidix_dma_t * f)
 {
-  return t_vdl(handle)->copy_frame ? t_vdl(handle)->copy_frame(f) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->copy_frame)
+    return ctx->drv->copy_frame (f);
+
+  return ENOSYS;
 }
 
 int 	  vdlGetGrKeys(VDL_HANDLE handle, vidix_grkey_t * k)
 {
-  return t_vdl(handle)->get_gkey ? t_vdl(handle)->get_gkey(k) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->get_gkey)
+    return ctx->drv->get_gkey (k);
+
+  return ENOSYS;
 }
 
 int 	  vdlSetGrKeys(VDL_HANDLE handle, const vidix_grkey_t * k)
 {
-  return t_vdl(handle)->set_gkey ? t_vdl(handle)->set_gkey(k) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->set_gkey)
+    return ctx->drv->set_gkey (k);
+
+  return ENOSYS;
 }
 
 int	  vdlPlaybackGetDeint(VDL_HANDLE handle, vidix_deinterlace_t * d)
 {
-  return t_vdl(handle)->get_deint ? t_vdl(handle)->get_deint(d) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->get_deint)
+    return ctx->drv->get_deint (d);
+
+  return ENOSYS;
 }
 
 int 	  vdlPlaybackSetDeint(VDL_HANDLE handle, const vidix_deinterlace_t * d)
 {
-  return t_vdl(handle)->set_deint ? t_vdl(handle)->set_deint(d) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->set_deint)
+    return ctx->drv->set_deint (d);
+
+  return ENOSYS;
 }
 
 int	  vdlQueryNumOemEffects(VDL_HANDLE handle, unsigned * number )
 {
-  return t_vdl(handle)->get_num_fx ? t_vdl(handle)->get_num_fx(number) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->get_num_fx)
+    return ctx->drv->get_num_fx (number);
+
+  return ENOSYS;
 }
 
 int	  vdlGetOemEffect(VDL_HANDLE handle, vidix_oem_fx_t * f)
 {
-  return t_vdl(handle)->get_fx ? t_vdl(handle)->get_fx(f) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->get_fx)
+    return ctx->drv->get_fx (f);
+
+  return ENOSYS;
 }
 
 int	  vdlSetOemEffect(VDL_HANDLE handle, const vidix_oem_fx_t * f)
 {
-  return t_vdl(handle)->set_fx ? t_vdl(handle)->set_fx(f) : ENOSYS;
+  VDXContext *ctx;
+
+  ctx = (VDXContext *) handle;
+  if (ctx->drv->set_fx)
+    return ctx->drv->set_fx (f);
+
+  return ENOSYS;
 }
--- a/vidix/vidixlib.h	Sun Apr 01 09:45:26 2007 +0000
+++ b/vidix/vidixlib.h	Sun Apr 01 11:06:06 2007 +0000
@@ -25,6 +25,37 @@
 
 #include "vidix.h"
 
+typedef struct VDXDriver {
+  const char *name;
+  struct VDXDriver *next;
+  int (* probe) (int verbose, int force);
+  unsigned int (* get_version)(void);
+  int (* get_caps) (vidix_capability_t *cap);
+  int (*query_fourcc)(vidix_fourcc_t *);
+  int (*init)(void);
+  void (*destroy)(void);
+  int (*config_playback)(vidix_playback_t *);
+  int (*playback_on)( void );
+  int (*playback_off)( void );
+  /* Functions below can be missed in driver ;) */
+  int (*frame_sel)( unsigned frame_idx );
+  int (*get_eq)( vidix_video_eq_t * );
+  int (*set_eq)( const vidix_video_eq_t * );
+  int (*get_deint)( vidix_deinterlace_t * );
+  int (*set_deint)( const vidix_deinterlace_t * );
+  int (*copy_frame)( const vidix_dma_t * );
+  int (*get_gkey)( vidix_grkey_t * );
+  int (*set_gkey)( const vidix_grkey_t * );
+  int (*get_num_fx)( unsigned * );
+  int (*get_fx)( vidix_oem_fx_t * );
+  int (*set_fx)( const vidix_oem_fx_t * );
+} VDXDriver;
+
+typedef struct VDXContext {
+  VDXDriver *drv;
+  /* might be filled in by much more info later on */
+} VDXContext;
+
 typedef void * VDL_HANDLE;
 
 			/* returns library version */