# HG changeset patch # User ben # Date 1175425566 0 # Node ID 77def5093daf697eb3de0cb99b8887a94347d06b # Parent 27db9ffe00a56aff0e2eb6ca873b006ab6ff992a switch to new internal vidix API, no more dlopen/dlsym, libvidix is now a fully static library with all drivers built-in diff -r 27db9ffe00a5 -r 77def5093daf Makefile --- 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 diff -r 27db9ffe00a5 -r 77def5093daf vidix/cyberblade_vid.c --- 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 #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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/drivers.c --- /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 +#include +#include +#include + +#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; +} diff -r 27db9ffe00a5 -r 77def5093daf vidix/drivers.h --- /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 */ diff -r 27db9ffe00a5 -r 77def5093daf vidix/mach64_vid.c --- 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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/mga_vid.c --- 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 #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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/nvidia_vid.c --- 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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/pm3_vid.c --- 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 #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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/radeon_vid.c --- 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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/savage_vid.c --- 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 #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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/sis_vid.c --- 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 #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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/unichrome_vid.c --- 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 #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, +}; diff -r 27db9ffe00a5 -r 77def5093daf vidix/vidixlib.c --- 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 #include -#ifndef WIN32 -#include /* GLIBC specific. Exists under cygwin too! */ -#else -#include -#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 - -#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; } diff -r 27db9ffe00a5 -r 77def5093daf vidix/vidixlib.h --- 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 */