annotate vidix/vidixlib.c @ 8763:19e96e60a3d0

Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
author anders
date Sat, 04 Jan 2003 06:19:25 +0000
parents e9a309486f18
children 285e298968de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
1 /*
dcc632dd2097 preliminary version
nick
parents:
diff changeset
2 * vidixlib.c
dcc632dd2097 preliminary version
nick
parents:
diff changeset
3 * VIDIXLib - Library for VIDeo Interface for *niX
dcc632dd2097 preliminary version
nick
parents:
diff changeset
4 * This interface is introduced as universal one to MPEG decoder,
dcc632dd2097 preliminary version
nick
parents:
diff changeset
5 * BES == Back End Scaler and YUV2RGB hw accelerators.
dcc632dd2097 preliminary version
nick
parents:
diff changeset
6 * In the future it may be expanded up to capturing and audio things.
dcc632dd2097 preliminary version
nick
parents:
diff changeset
7 * Main goal of this this interface imlpementation is providing DGA
dcc632dd2097 preliminary version
nick
parents:
diff changeset
8 * everywhere where it's possible (unlike X11 and other).
dcc632dd2097 preliminary version
nick
parents:
diff changeset
9 * Copyright 2002 Nick Kurshev
dcc632dd2097 preliminary version
nick
parents:
diff changeset
10 * Licence: GPL
dcc632dd2097 preliminary version
nick
parents:
diff changeset
11 * This interface is based on v4l2, fbvid.h, mga_vid.h projects
dcc632dd2097 preliminary version
nick
parents:
diff changeset
12 * and personally my ideas.
dcc632dd2097 preliminary version
nick
parents:
diff changeset
13 * NOTE: This interface is introduces as APP interface.
dcc632dd2097 preliminary version
nick
parents:
diff changeset
14 * Don't use it for driver.
dcc632dd2097 preliminary version
nick
parents:
diff changeset
15 * It provides multistreaming. This mean that APP can handle
dcc632dd2097 preliminary version
nick
parents:
diff changeset
16 * several streams simultaneously. (Example: Video capturing and video
dcc632dd2097 preliminary version
nick
parents:
diff changeset
17 * playback or capturing, video playback, audio encoding and so on).
dcc632dd2097 preliminary version
nick
parents:
diff changeset
18 */
dcc632dd2097 preliminary version
nick
parents:
diff changeset
19 #include <stdlib.h>
dcc632dd2097 preliminary version
nick
parents:
diff changeset
20 #include <stdio.h>
dcc632dd2097 preliminary version
nick
parents:
diff changeset
21 #include <errno.h>
dcc632dd2097 preliminary version
nick
parents:
diff changeset
22 #include <string.h>
dcc632dd2097 preliminary version
nick
parents:
diff changeset
23
dcc632dd2097 preliminary version
nick
parents:
diff changeset
24 #include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */
dcc632dd2097 preliminary version
nick
parents:
diff changeset
25 #include <dirent.h>
dcc632dd2097 preliminary version
nick
parents:
diff changeset
26
6130
e9a309486f18 openbsd a.out needs underscore for dlsym - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents: 5872
diff changeset
27 #if defined(__OpenBSD__) && !defined(__ELF__)
e9a309486f18 openbsd a.out needs underscore for dlsym - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents: 5872
diff changeset
28 #define dlsym(h,s) dlsym(h, "_" s)
e9a309486f18 openbsd a.out needs underscore for dlsym - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents: 5872
diff changeset
29 #endif
e9a309486f18 openbsd a.out needs underscore for dlsym - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents: 5872
diff changeset
30
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
31 #include "vidixlib.h"
4539
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
32 #include "../bswap.h"
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
33
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
34 static char drv_name[FILENAME_MAX];
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
35
dcc632dd2097 preliminary version
nick
parents:
diff changeset
36 typedef struct vdl_stream_s
dcc632dd2097 preliminary version
nick
parents:
diff changeset
37 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
38 void * handle;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
39 int (*get_caps)(vidix_capability_t *);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
40 int (*query_fourcc)(vidix_fourcc_t *);
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
41 int (*config_playback)(vidix_playback_t *);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
42 int (*playback_on)( void );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
43 int (*playback_off)( void );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
44 /* Functions below can be missed in driver ;) */
dcc632dd2097 preliminary version
nick
parents:
diff changeset
45 int (*init)(void);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
46 void (*destroy)(void);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
47 int (*frame_sel)( unsigned frame_idx );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
48 int (*get_eq)( vidix_video_eq_t * );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
49 int (*set_eq)( const vidix_video_eq_t * );
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
50 int (*get_deint)( vidix_deinterlace_t * );
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
51 int (*set_deint)( const vidix_deinterlace_t * );
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
52 int (*copy_frame)( const vidix_dma_t * );
4070
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
53 int (*get_gkey)( vidix_grkey_t * );
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
54 int (*set_gkey)( const vidix_grkey_t * );
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
55 int (*get_num_fx)( unsigned * );
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
56 int (*get_fx)( vidix_oem_fx_t * );
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
57 int (*set_fx)( const vidix_oem_fx_t * );
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
58 }vdl_stream_t;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
59
dcc632dd2097 preliminary version
nick
parents:
diff changeset
60 #define t_vdl(p) (((vdl_stream_t *)p))
dcc632dd2097 preliminary version
nick
parents:
diff changeset
61
dcc632dd2097 preliminary version
nick
parents:
diff changeset
62 extern unsigned vdlGetVersion( void )
dcc632dd2097 preliminary version
nick
parents:
diff changeset
63 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
64 return VIDIX_VERSION;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
65 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
66
dcc632dd2097 preliminary version
nick
parents:
diff changeset
67 static int vdl_fill_driver(VDL_HANDLE stream)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
68 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
69 t_vdl(stream)->init = dlsym(t_vdl(stream)->handle,"vixInit");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
70 t_vdl(stream)->destroy = dlsym(t_vdl(stream)->handle,"vixDestroy");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
71 t_vdl(stream)->get_caps = dlsym(t_vdl(stream)->handle,"vixGetCapability");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
72 t_vdl(stream)->query_fourcc = dlsym(t_vdl(stream)->handle,"vixQueryFourcc");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
73 t_vdl(stream)->config_playback= dlsym(t_vdl(stream)->handle,"vixConfigPlayback");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
74 t_vdl(stream)->playback_on = dlsym(t_vdl(stream)->handle,"vixPlaybackOn");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
75 t_vdl(stream)->playback_off = dlsym(t_vdl(stream)->handle,"vixPlaybackOff");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
76 t_vdl(stream)->frame_sel = dlsym(t_vdl(stream)->handle,"vixPlaybackFrameSelect");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
77 t_vdl(stream)->get_eq = dlsym(t_vdl(stream)->handle,"vixPlaybackGetEq");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
78 t_vdl(stream)->set_eq = dlsym(t_vdl(stream)->handle,"vixPlaybackSetEq");
4070
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
79 t_vdl(stream)->get_gkey = dlsym(t_vdl(stream)->handle,"vixGetGrKeys");
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
80 t_vdl(stream)->set_gkey = dlsym(t_vdl(stream)->handle,"vixSetGrKeys");
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
81 t_vdl(stream)->get_deint = dlsym(t_vdl(stream)->handle,"vixPlaybackGetDeint");
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
82 t_vdl(stream)->set_deint = dlsym(t_vdl(stream)->handle,"vixPlaybackSetDeint");
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
83 t_vdl(stream)->copy_frame = dlsym(t_vdl(stream)->handle,"vixPlaybackCopyFrame");
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
84 t_vdl(stream)->get_num_fx = dlsym(t_vdl(stream)->handle,"vixQueryNumOemEffects");
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
85 t_vdl(stream)->get_fx = dlsym(t_vdl(stream)->handle,"vixGetOemEffect");
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
86 t_vdl(stream)->set_fx = dlsym(t_vdl(stream)->handle,"vixSetOemEffect");
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
87 /* check driver viability */
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
88 if(!( t_vdl(stream)->get_caps && t_vdl(stream)->query_fourcc &&
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
89 t_vdl(stream)->config_playback && t_vdl(stream)->playback_on &&
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
90 t_vdl(stream)->playback_off))
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
91 {
4509
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
92 printf("vidixlib: Incomplete driver: some of essential features are missed in it.\n");
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
93 return 0;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
94 }
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
95 return 1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
96 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
97
5872
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
98 #ifndef RTLD_GLOBAL
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
99 #define RTLD_GLOBAL RTLD_LAZY
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
100 #endif
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
101 #ifndef RTLD_NOW
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
102 #define RTLD_NOW RTLD_LAZY
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
103 #endif
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
104
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
105 static int vdl_probe_driver(VDL_HANDLE stream,const char *path,const char *name,unsigned cap,int verbose)
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
106 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
107 vidix_capability_t vid_cap;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
108 unsigned (*_ver)(void);
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
109 int (*_probe)(int,int);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
110 int (*_cap)(vidix_capability_t*);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
111 strcpy(drv_name,path);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
112 strcat(drv_name,name);
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
113 if(verbose) printf("vidixlib: PROBING: %s\n",drv_name);
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
114 if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_LAZY|RTLD_GLOBAL)))
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
115 {
4509
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
116 if(verbose) printf("vidixlib: %s not driver: %s\n",drv_name,dlerror());
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
117 return 0;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
118 }
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
119 _ver = dlsym(t_vdl(stream)->handle,"vixGetVersion");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
120 _probe = dlsym(t_vdl(stream)->handle,"vixProbe");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
121 _cap = dlsym(t_vdl(stream)->handle,"vixGetCapability");
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
122 if(_ver)
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
123 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
124 if((*_ver)() != VIDIX_VERSION)
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
125 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
126 if(verbose) printf("vidixlib: %s has wrong version\n",drv_name);
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
127 err:
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
128 dlclose(t_vdl(stream)->handle);
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
129 t_vdl(stream)->handle = 0;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
130 return 0;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
131 }
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
132 }
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
133 else
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
134 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
135 fatal_err:
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
136 if(verbose) printf("vidixlib: %s has no function definition\n",drv_name);
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
137 goto err;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
138 }
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
139 if(_probe) { if((*_probe)(verbose,PROBE_NORMAL) != 0) goto err; }
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
140 else goto fatal_err;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
141 if(_cap) { if((*_cap)(&vid_cap) != 0) goto err; }
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
142 else goto fatal_err;
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
143 if((vid_cap.type & cap) != cap)
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
144 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
145 if(verbose) printf("vidixlib: Found %s but has no required capability\n",drv_name);
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
146 goto err;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
147 }
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
148 if(verbose) printf("vidixlib: %s probed o'k\n",drv_name);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
149 return 1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
150 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
151
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
152 static int vdl_find_driver(VDL_HANDLE stream,const char *path,unsigned cap,int verbose)
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
153 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
154 DIR *dstream;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
155 struct dirent *name;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
156 int done = 0;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
157 if(!(dstream = opendir(path))) return 0;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
158 while(!done)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
159 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
160 name = readdir(dstream);
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
161 if(name)
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
162 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
163 if(name->d_name[0] != '.')
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
164 if(vdl_probe_driver(stream,path,name->d_name,cap,verbose)) break;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
165 }
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
166 else done = 1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
167 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
168 closedir(dstream);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
169 return done?0:1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
170 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
171
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
172 VDL_HANDLE vdlOpen(const char *path,const char *name,unsigned cap,int verbose)
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
173 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
174 vdl_stream_t *stream;
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
175 int errcode;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
176 if(!(stream = malloc(sizeof(vdl_stream_t)))) return NULL;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
177 memset(stream,0,sizeof(vdl_stream_t));
dcc632dd2097 preliminary version
nick
parents:
diff changeset
178 if(name)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
179 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
180 unsigned (*ver)(void);
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
181 int (*probe)(int,int);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
182 unsigned version = 0;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
183 strcpy(drv_name,path);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
184 strcat(drv_name,name);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
185 if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_NOW|RTLD_GLOBAL)))
dcc632dd2097 preliminary version
nick
parents:
diff changeset
186 {
4509
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
187 if (verbose)
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
188 printf("vidixlib: dlopen error: %s\n", dlerror());
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
189 err:
dcc632dd2097 preliminary version
nick
parents:
diff changeset
190 free(stream);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
191 return NULL;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
192 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
193 ver = dlsym(t_vdl(stream)->handle,"vixGetVersion");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
194 if(ver) version = (*ver)();
dcc632dd2097 preliminary version
nick
parents:
diff changeset
195 if(version != VIDIX_VERSION)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
196 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
197 drv_err:
dcc632dd2097 preliminary version
nick
parents:
diff changeset
198 if(t_vdl(stream)->handle) dlclose(t_vdl(stream)->handle);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
199 goto err;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
200 }
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
201 probe = dlsym(t_vdl(stream)->handle,"vixProbe");
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
202 if(probe) { if((*probe)(verbose,PROBE_FORCE)!=0) goto drv_err; }
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
203 else goto drv_err;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
204 fill:
dcc632dd2097 preliminary version
nick
parents:
diff changeset
205 if(!vdl_fill_driver(stream)) goto drv_err;
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
206 goto ok;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
207 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
208 else
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
209 if(vdl_find_driver(stream,path,cap,verbose))
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
210 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
211 if(verbose) printf("vidixlib: will use %s driver\n",drv_name);
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
212 goto fill;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
213 }
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
214 else goto err;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
215 ok:
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
216 if(t_vdl(stream)->init)
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
217 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
218 if(verbose) printf("vidixlib: Attempt to initialize driver at: %p\n",t_vdl(stream)->init);
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
219 if((errcode=t_vdl(stream)->init())!=0)
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
220 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
221 if(verbose) printf("vidixlib: Can't init driver: %s\n",strerror(errcode));
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
222 goto drv_err;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
223 }
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
224 }
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
225 if(verbose) printf("vidixlib: '%s'successfully loaded\n",drv_name);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
226 return stream;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
227 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
228
dcc632dd2097 preliminary version
nick
parents:
diff changeset
229 void vdlClose(VDL_HANDLE stream)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
230 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
231 if(t_vdl(stream)->destroy) t_vdl(stream)->destroy();
dcc632dd2097 preliminary version
nick
parents:
diff changeset
232 dlclose(t_vdl(stream)->handle);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
233 memset(stream,0,sizeof(vdl_stream_t)); /* <- it's not stupid */
dcc632dd2097 preliminary version
nick
parents:
diff changeset
234 free(stream);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
235 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
236
dcc632dd2097 preliminary version
nick
parents:
diff changeset
237 int vdlGetCapability(VDL_HANDLE handle, vidix_capability_t *cap)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
238 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
239 return t_vdl(handle)->get_caps(cap);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
240 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
241
4539
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
242 #define MPLAYER_IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
243 #define MPLAYER_IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8))
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
244 #define MPLAYER_IMGFMT_RGB_MASK 0xFFFFFF00
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
245
4547
nick
parents: 4539
diff changeset
246 static uint32_t normalize_fourcc(uint32_t fourcc)
4539
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
247 {
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
248 if((fourcc & MPLAYER_IMGFMT_RGB_MASK) == (MPLAYER_IMGFMT_RGB|0) ||
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
249 (fourcc & MPLAYER_IMGFMT_RGB_MASK) == (MPLAYER_IMGFMT_BGR|0))
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
250 return bswap_32(fourcc);
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
251 else return fourcc;
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
252 }
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
253
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
254 int vdlQueryFourcc(VDL_HANDLE handle,vidix_fourcc_t *f)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
255 {
4547
nick
parents: 4539
diff changeset
256 f->fourcc = normalize_fourcc(f->fourcc);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
257 return t_vdl(handle)->query_fourcc(f);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
258 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
259
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
260 int vdlConfigPlayback(VDL_HANDLE handle,vidix_playback_t *p)
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
261 {
4547
nick
parents: 4539
diff changeset
262 p->fourcc = normalize_fourcc(p->fourcc);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
263 return t_vdl(handle)->config_playback(p);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
264 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
265
dcc632dd2097 preliminary version
nick
parents:
diff changeset
266 int vdlPlaybackOn(VDL_HANDLE handle)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
267 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
268 return t_vdl(handle)->playback_on();
dcc632dd2097 preliminary version
nick
parents:
diff changeset
269 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
270
dcc632dd2097 preliminary version
nick
parents:
diff changeset
271 int vdlPlaybackOff(VDL_HANDLE handle)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
272 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
273 return t_vdl(handle)->playback_off();
dcc632dd2097 preliminary version
nick
parents:
diff changeset
274 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
275
dcc632dd2097 preliminary version
nick
parents:
diff changeset
276 int vdlPlaybackFrameSelect(VDL_HANDLE handle, unsigned frame_idx )
dcc632dd2097 preliminary version
nick
parents:
diff changeset
277 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
278 return t_vdl(handle)->frame_sel ? t_vdl(handle)->frame_sel(frame_idx) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
279 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
280
dcc632dd2097 preliminary version
nick
parents:
diff changeset
281 int vdlPlaybackGetEq(VDL_HANDLE handle, vidix_video_eq_t * e)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
282 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
283 return t_vdl(handle)->get_eq ? t_vdl(handle)->get_eq(e) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
284 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
285
dcc632dd2097 preliminary version
nick
parents:
diff changeset
286 int vdlPlaybackSetEq(VDL_HANDLE handle, const vidix_video_eq_t * e)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
287 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
288 return t_vdl(handle)->set_eq ? t_vdl(handle)->set_eq(e) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
289 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
290
dcc632dd2097 preliminary version
nick
parents:
diff changeset
291 int vdlPlaybackCopyFrame(VDL_HANDLE handle, const vidix_dma_t * f)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
292 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
293 return t_vdl(handle)->copy_frame ? t_vdl(handle)->copy_frame(f) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
294 }
4070
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
295
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
296 int vdlGetGrKeys(VDL_HANDLE handle, vidix_grkey_t * k)
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
297 {
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
298 return t_vdl(handle)->get_gkey ? t_vdl(handle)->get_gkey(k) : ENOSYS;
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
299 }
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
300
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
301 int vdlSetGrKeys(VDL_HANDLE handle, const vidix_grkey_t * k)
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
302 {
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
303 return t_vdl(handle)->set_gkey ? t_vdl(handle)->set_gkey(k) : ENOSYS;
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
304 }
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
305
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
306 int vdlPlaybackGetDeint(VDL_HANDLE handle, vidix_deinterlace_t * d)
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
307 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
308 return t_vdl(handle)->get_deint ? t_vdl(handle)->get_deint(d) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
309 }
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
310
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
311 int vdlPlaybackSetDeint(VDL_HANDLE handle, const vidix_deinterlace_t * d)
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
312 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
313 return t_vdl(handle)->set_deint ? t_vdl(handle)->set_deint(d) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
314 }
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
315
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
316 int vdlQueryNumOemEffects(VDL_HANDLE handle, unsigned * number )
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
317 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
318 return t_vdl(handle)->get_num_fx ? t_vdl(handle)->get_num_fx(number) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
319 }
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
320
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
321 int vdlGetOemEffect(VDL_HANDLE handle, vidix_oem_fx_t * f)
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
322 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
323 return t_vdl(handle)->get_fx ? t_vdl(handle)->get_fx(f) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
324 }
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
325
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
326 int vdlSetOemEffect(VDL_HANDLE handle, const vidix_oem_fx_t * f)
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
327 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
328 return t_vdl(handle)->set_fx ? t_vdl(handle)->set_fx(f) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
329 }