annotate vidix/vidixlib.c @ 15533:ddf15d233d58

Do not switch to audio tracks whose codec private data differs from the main audio track's as this will most likely result in messed up audio output. Patch by Michael Behrisch <list () behrisch ! de>
author mosu
date Sat, 21 May 2005 06:50:08 +0000
parents 628dd5d2326c
children 2ffcd779b875
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
10982
285e298968de Windows port
faust3
parents: 6130
diff changeset
24 #ifndef WIN32
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
25 #include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */
10982
285e298968de Windows port
faust3
parents: 6130
diff changeset
26 #else
285e298968de Windows port
faust3
parents: 6130
diff changeset
27 #include <windows.h>
285e298968de Windows port
faust3
parents: 6130
diff changeset
28 #define dlsym(h,s) GetProcAddress(h,s)
285e298968de Windows port
faust3
parents: 6130
diff changeset
29 #define dlopen(h,s) LoadLibrary(h)
285e298968de Windows port
faust3
parents: 6130
diff changeset
30 #define dlclose(h) FreeLibrary(h)
285e298968de Windows port
faust3
parents: 6130
diff changeset
31 static char* dlerror(){
285e298968de Windows port
faust3
parents: 6130
diff changeset
32 char errormsg[10];
285e298968de Windows port
faust3
parents: 6130
diff changeset
33 sprintf(errormsg,"%i\n",GetLastError());
285e298968de Windows port
faust3
parents: 6130
diff changeset
34 return errormsg;
285e298968de Windows port
faust3
parents: 6130
diff changeset
35 }
285e298968de Windows port
faust3
parents: 6130
diff changeset
36 #endif
285e298968de Windows port
faust3
parents: 6130
diff changeset
37
285e298968de Windows port
faust3
parents: 6130
diff changeset
38
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
39 #include <dirent.h>
dcc632dd2097 preliminary version
nick
parents:
diff changeset
40
6130
e9a309486f18 openbsd a.out needs underscore for dlsym - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents: 5872
diff changeset
41 #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
42 #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
43 #endif
e9a309486f18 openbsd a.out needs underscore for dlsym - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents: 5872
diff changeset
44
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
45 #include "vidixlib.h"
4539
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
46 #include "../bswap.h"
13185
628dd5d2326c fix missing includes
rathann
parents: 12646
diff changeset
47 #include "../config.h"
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
48
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
49 static char drv_name[FILENAME_MAX];
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
50
dcc632dd2097 preliminary version
nick
parents:
diff changeset
51 typedef struct vdl_stream_s
dcc632dd2097 preliminary version
nick
parents:
diff changeset
52 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
53 void * handle;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
54 int (*get_caps)(vidix_capability_t *);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
55 int (*query_fourcc)(vidix_fourcc_t *);
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
56 int (*config_playback)(vidix_playback_t *);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
57 int (*playback_on)( void );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
58 int (*playback_off)( void );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
59 /* Functions below can be missed in driver ;) */
dcc632dd2097 preliminary version
nick
parents:
diff changeset
60 int (*init)(void);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
61 void (*destroy)(void);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
62 int (*frame_sel)( unsigned frame_idx );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
63 int (*get_eq)( vidix_video_eq_t * );
dcc632dd2097 preliminary version
nick
parents:
diff changeset
64 int (*set_eq)( const vidix_video_eq_t * );
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
65 int (*get_deint)( vidix_deinterlace_t * );
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
66 int (*set_deint)( const vidix_deinterlace_t * );
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
67 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
68 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
69 int (*set_gkey)( const vidix_grkey_t * );
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
70 int (*get_num_fx)( unsigned * );
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
71 int (*get_fx)( vidix_oem_fx_t * );
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
72 int (*set_fx)( const vidix_oem_fx_t * );
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
73 }vdl_stream_t;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
74
dcc632dd2097 preliminary version
nick
parents:
diff changeset
75 #define t_vdl(p) (((vdl_stream_t *)p))
dcc632dd2097 preliminary version
nick
parents:
diff changeset
76
dcc632dd2097 preliminary version
nick
parents:
diff changeset
77 extern unsigned vdlGetVersion( void )
dcc632dd2097 preliminary version
nick
parents:
diff changeset
78 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
79 return VIDIX_VERSION;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
80 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
81
dcc632dd2097 preliminary version
nick
parents:
diff changeset
82 static int vdl_fill_driver(VDL_HANDLE stream)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
83 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
84 t_vdl(stream)->init = dlsym(t_vdl(stream)->handle,"vixInit");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
85 t_vdl(stream)->destroy = dlsym(t_vdl(stream)->handle,"vixDestroy");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
86 t_vdl(stream)->get_caps = dlsym(t_vdl(stream)->handle,"vixGetCapability");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
87 t_vdl(stream)->query_fourcc = dlsym(t_vdl(stream)->handle,"vixQueryFourcc");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
88 t_vdl(stream)->config_playback= dlsym(t_vdl(stream)->handle,"vixConfigPlayback");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
89 t_vdl(stream)->playback_on = dlsym(t_vdl(stream)->handle,"vixPlaybackOn");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
90 t_vdl(stream)->playback_off = dlsym(t_vdl(stream)->handle,"vixPlaybackOff");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
91 t_vdl(stream)->frame_sel = dlsym(t_vdl(stream)->handle,"vixPlaybackFrameSelect");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
92 t_vdl(stream)->get_eq = dlsym(t_vdl(stream)->handle,"vixPlaybackGetEq");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
93 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
94 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
95 t_vdl(stream)->set_gkey = dlsym(t_vdl(stream)->handle,"vixSetGrKeys");
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
96 t_vdl(stream)->get_deint = dlsym(t_vdl(stream)->handle,"vixPlaybackGetDeint");
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
97 t_vdl(stream)->set_deint = dlsym(t_vdl(stream)->handle,"vixPlaybackSetDeint");
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
98 t_vdl(stream)->copy_frame = dlsym(t_vdl(stream)->handle,"vixPlaybackCopyFrame");
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
99 t_vdl(stream)->get_num_fx = dlsym(t_vdl(stream)->handle,"vixQueryNumOemEffects");
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
100 t_vdl(stream)->get_fx = dlsym(t_vdl(stream)->handle,"vixGetOemEffect");
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
101 t_vdl(stream)->set_fx = dlsym(t_vdl(stream)->handle,"vixSetOemEffect");
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
102 /* check driver viability */
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
103 if(!( t_vdl(stream)->get_caps && t_vdl(stream)->query_fourcc &&
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
104 t_vdl(stream)->config_playback && t_vdl(stream)->playback_on &&
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
105 t_vdl(stream)->playback_off))
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
106 {
4509
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
107 printf("vidixlib: Incomplete driver: some of essential features are missed in it.\n");
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
108 return 0;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
109 }
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
110 return 1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
111 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
112
5872
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
113 #ifndef RTLD_GLOBAL
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
114 #define RTLD_GLOBAL RTLD_LAZY
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
115 #endif
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
116 #ifndef RTLD_NOW
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
117 #define RTLD_NOW RTLD_LAZY
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
118 #endif
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 4547
diff changeset
119
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
120 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
121 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
122 vidix_capability_t vid_cap;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
123 unsigned (*_ver)(void);
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
124 int (*_probe)(int,int);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
125 int (*_cap)(vidix_capability_t*);
12646
9a495bdc3a1e string handling security fixes
diego
parents: 10982
diff changeset
126 strlcpy(drv_name,path, sizeof( drv_name ));
9a495bdc3a1e string handling security fixes
diego
parents: 10982
diff changeset
127 strlcat(drv_name,name, sizeof( drv_name ));
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
128 if(verbose) printf("vidixlib: PROBING: %s\n",drv_name);
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
129 if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_LAZY|RTLD_GLOBAL)))
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
130 {
4509
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
131 if(verbose) printf("vidixlib: %s not driver: %s\n",drv_name,dlerror());
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
132 return 0;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
133 }
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
134 _ver = dlsym(t_vdl(stream)->handle,"vixGetVersion");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
135 _probe = dlsym(t_vdl(stream)->handle,"vixProbe");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
136 _cap = dlsym(t_vdl(stream)->handle,"vixGetCapability");
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
137 if(_ver)
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
138 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
139 if((*_ver)() != VIDIX_VERSION)
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
140 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
141 if(verbose) printf("vidixlib: %s has wrong version\n",drv_name);
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
142 err:
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
143 dlclose(t_vdl(stream)->handle);
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
144 t_vdl(stream)->handle = 0;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
145 return 0;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
146 }
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
147 }
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
148 else
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
149 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
150 fatal_err:
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
151 if(verbose) printf("vidixlib: %s has no function definition\n",drv_name);
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
152 goto err;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
153 }
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
154 if(_probe) { if((*_probe)(verbose,PROBE_NORMAL) != 0) goto err; }
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
155 else goto fatal_err;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
156 if(_cap) { if((*_cap)(&vid_cap) != 0) goto err; }
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
157 else goto fatal_err;
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
158 if((vid_cap.type & cap) != cap)
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
159 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
160 if(verbose) printf("vidixlib: Found %s but has no required capability\n",drv_name);
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
161 goto err;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
162 }
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
163 if(verbose) printf("vidixlib: %s probed o'k\n",drv_name);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
164 return 1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
165 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
166
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
167 static int vdl_find_driver(VDL_HANDLE stream,const char *path,unsigned cap,int verbose)
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
168 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
169 DIR *dstream;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
170 struct dirent *name;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
171 int done = 0;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
172 if(!(dstream = opendir(path))) return 0;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
173 while(!done)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
174 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
175 name = readdir(dstream);
4008
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
176 if(name)
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
177 {
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
178 if(name->d_name[0] != '.')
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
179 if(vdl_probe_driver(stream,path,name->d_name,cap,verbose)) break;
a37207881d10 minor interface changing and verbosing
nick
parents: 3995
diff changeset
180 }
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
181 else done = 1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
182 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
183 closedir(dstream);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
184 return done?0:1;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
185 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
186
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
187 VDL_HANDLE vdlOpen(const char *path,const char *name,unsigned cap,int verbose)
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
188 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
189 vdl_stream_t *stream;
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
190 int errcode;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
191 if(!(stream = malloc(sizeof(vdl_stream_t)))) return NULL;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
192 memset(stream,0,sizeof(vdl_stream_t));
dcc632dd2097 preliminary version
nick
parents:
diff changeset
193 if(name)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
194 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
195 unsigned (*ver)(void);
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
196 int (*probe)(int,int);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
197 unsigned version = 0;
12646
9a495bdc3a1e string handling security fixes
diego
parents: 10982
diff changeset
198 strlcpy(drv_name,path, sizeof( drv_name ));
9a495bdc3a1e string handling security fixes
diego
parents: 10982
diff changeset
199 strlcat(drv_name,name, sizeof( drv_name ));
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
200 if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_NOW|RTLD_GLOBAL)))
dcc632dd2097 preliminary version
nick
parents:
diff changeset
201 {
4509
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
202 if (verbose)
90386125ec1f using dlerror() instead strerror(), displays unresolved symbol messages
alex
parents: 4191
diff changeset
203 printf("vidixlib: dlopen error: %s\n", dlerror());
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
204 err:
dcc632dd2097 preliminary version
nick
parents:
diff changeset
205 free(stream);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
206 return NULL;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
207 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
208 ver = dlsym(t_vdl(stream)->handle,"vixGetVersion");
dcc632dd2097 preliminary version
nick
parents:
diff changeset
209 if(ver) version = (*ver)();
dcc632dd2097 preliminary version
nick
parents:
diff changeset
210 if(version != VIDIX_VERSION)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
211 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
212 drv_err:
dcc632dd2097 preliminary version
nick
parents:
diff changeset
213 if(t_vdl(stream)->handle) dlclose(t_vdl(stream)->handle);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
214 goto err;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
215 }
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
216 probe = dlsym(t_vdl(stream)->handle,"vixProbe");
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
217 if(probe) { if((*probe)(verbose,PROBE_FORCE)!=0) goto drv_err; }
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
218 else goto drv_err;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
219 fill:
dcc632dd2097 preliminary version
nick
parents:
diff changeset
220 if(!vdl_fill_driver(stream)) goto drv_err;
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
221 goto ok;
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
222 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
223 else
4011
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
224 if(vdl_find_driver(stream,path,cap,verbose))
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
225 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
226 if(verbose) printf("vidixlib: will use %s driver\n",drv_name);
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
227 goto fill;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
228 }
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
229 else goto err;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
230 ok:
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
231 if(t_vdl(stream)->init)
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
232 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
233 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
234 if((errcode=t_vdl(stream)->init())!=0)
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
235 {
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
236 if(verbose) printf("vidixlib: Can't init driver: %s\n",strerror(errcode));
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
237 goto drv_err;
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
238 }
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
239 }
ca163699151f lazy loader works better ;)
nick
parents: 4008
diff changeset
240 if(verbose) printf("vidixlib: '%s'successfully loaded\n",drv_name);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
241 return stream;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
242 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
243
dcc632dd2097 preliminary version
nick
parents:
diff changeset
244 void vdlClose(VDL_HANDLE stream)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
245 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
246 if(t_vdl(stream)->destroy) t_vdl(stream)->destroy();
dcc632dd2097 preliminary version
nick
parents:
diff changeset
247 dlclose(t_vdl(stream)->handle);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
248 memset(stream,0,sizeof(vdl_stream_t)); /* <- it's not stupid */
dcc632dd2097 preliminary version
nick
parents:
diff changeset
249 free(stream);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
250 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
251
dcc632dd2097 preliminary version
nick
parents:
diff changeset
252 int vdlGetCapability(VDL_HANDLE handle, vidix_capability_t *cap)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
253 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
254 return t_vdl(handle)->get_caps(cap);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
255 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
256
4539
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
257 #define MPLAYER_IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
258 #define MPLAYER_IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8))
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
259 #define MPLAYER_IMGFMT_RGB_MASK 0xFFFFFF00
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
260
4547
nick
parents: 4539
diff changeset
261 static uint32_t normalize_fourcc(uint32_t fourcc)
4539
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
262 {
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
263 if((fourcc & MPLAYER_IMGFMT_RGB_MASK) == (MPLAYER_IMGFMT_RGB|0) ||
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
264 (fourcc & MPLAYER_IMGFMT_RGB_MASK) == (MPLAYER_IMGFMT_BGR|0))
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
265 return bswap_32(fourcc);
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
266 else return fourcc;
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
267 }
fcd6e49cb3cc mplayer has swapped RGB's fourcc :(
nick
parents: 4509
diff changeset
268
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
269 int vdlQueryFourcc(VDL_HANDLE handle,vidix_fourcc_t *f)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
270 {
4547
nick
parents: 4539
diff changeset
271 f->fourcc = normalize_fourcc(f->fourcc);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
272 return t_vdl(handle)->query_fourcc(f);
dcc632dd2097 preliminary version
nick
parents:
diff changeset
273 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
274
3995
0d9de811e312 minor interface changing
nick
parents: 3991
diff changeset
275 int vdlConfigPlayback(VDL_HANDLE handle,vidix_playback_t *p)
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
276 {
4547
nick
parents: 4539
diff changeset
277 p->fourcc = normalize_fourcc(p->fourcc);
3991
dcc632dd2097 preliminary version
nick
parents:
diff changeset
278 return t_vdl(handle)->config_playback(p);
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 vdlPlaybackOn(VDL_HANDLE handle)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
282 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
283 return t_vdl(handle)->playback_on();
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 vdlPlaybackOff(VDL_HANDLE handle)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
287 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
288 return t_vdl(handle)->playback_off();
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 vdlPlaybackFrameSelect(VDL_HANDLE handle, unsigned frame_idx )
dcc632dd2097 preliminary version
nick
parents:
diff changeset
292 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
293 return t_vdl(handle)->frame_sel ? t_vdl(handle)->frame_sel(frame_idx) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
294 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
295
dcc632dd2097 preliminary version
nick
parents:
diff changeset
296 int vdlPlaybackGetEq(VDL_HANDLE handle, vidix_video_eq_t * e)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
297 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
298 return t_vdl(handle)->get_eq ? t_vdl(handle)->get_eq(e) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
299 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
300
dcc632dd2097 preliminary version
nick
parents:
diff changeset
301 int vdlPlaybackSetEq(VDL_HANDLE handle, const vidix_video_eq_t * e)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
302 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
303 return t_vdl(handle)->set_eq ? t_vdl(handle)->set_eq(e) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
304 }
dcc632dd2097 preliminary version
nick
parents:
diff changeset
305
dcc632dd2097 preliminary version
nick
parents:
diff changeset
306 int vdlPlaybackCopyFrame(VDL_HANDLE handle, const vidix_dma_t * f)
dcc632dd2097 preliminary version
nick
parents:
diff changeset
307 {
dcc632dd2097 preliminary version
nick
parents:
diff changeset
308 return t_vdl(handle)->copy_frame ? t_vdl(handle)->copy_frame(f) : ENOSYS;
dcc632dd2097 preliminary version
nick
parents:
diff changeset
309 }
4070
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
310
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
311 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
312 {
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
313 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
314 }
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
315
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
316 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
317 {
b61ba6c256dd Minor interface changes: color and video keys are moved out from playback configuring
nick
parents: 4011
diff changeset
318 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
319 }
4191
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
320
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
321 int vdlPlaybackGetDeint(VDL_HANDLE handle, vidix_deinterlace_t * d)
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_deint ? t_vdl(handle)->get_deint(d) : 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 vdlPlaybackSetDeint(VDL_HANDLE handle, const vidix_deinterlace_t * d)
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_deint ? t_vdl(handle)->set_deint(d) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
329 }
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
330
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
331 int vdlQueryNumOemEffects(VDL_HANDLE handle, unsigned * number )
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
332 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
333 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
334 }
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
335
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
336 int vdlGetOemEffect(VDL_HANDLE handle, vidix_oem_fx_t * f)
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
337 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
338 return t_vdl(handle)->get_fx ? t_vdl(handle)->get_fx(f) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
339 }
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
340
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
341 int vdlSetOemEffect(VDL_HANDLE handle, const vidix_oem_fx_t * f)
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
342 {
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
343 return t_vdl(handle)->set_fx ? t_vdl(handle)->set_fx(f) : ENOSYS;
62a6135d090e + new features and possibility
nick
parents: 4070
diff changeset
344 }