Mercurial > mplayer.hg
annotate libmpcodecs/ad_realaud.c @ 9278:caea8ed36b48
The reason why mplayer crashes (in some cases) when using x11
output and -wid (>0) parameter is this:
Mplayer by default creates a colormap using DirectColor visual. If the
window given to mplayer uses TrueColor visual there will be an error
when mplayer sets the colormap for the window. This patch
modifies mplayer to use TrueColor visual if the window given to mplayer
uses TrueColor. Another solution is to make sure that the window given to
mplayer is created using DirectColor visual if it is supported by the
display.
Jouni Tulkki <jitulkki@cc.hut.fi>
author | arpi |
---|---|
date | Tue, 04 Feb 2003 18:31:44 +0000 |
parents | b8a90a2af611 |
children | 2d651a218031 |
rev | line source |
---|---|
6367 | 1 |
2 #include <stdio.h> | |
3 #include <stdlib.h> | |
4 #include <unistd.h> | |
5 | |
6 #include "config.h" | |
7 | |
8 #ifdef USE_REALCODECS | |
9 | |
10 #include <stddef.h> | |
11 #include <dlfcn.h> | |
12 | |
13 #include "ad_internal.h" | |
14 | |
15 static ad_info_t info = { | |
6380 | 16 "RealAudio decoder", |
7174 | 17 "realaud", |
6380 | 18 "A'rpi", |
19 "Florian Schneider", | |
20 "binary real audio codecs" | |
6367 | 21 }; |
22 | |
7174 | 23 LIBAD_EXTERN(realaud) |
6367 | 24 |
25 static void *handle=NULL; | |
26 | |
27 void *__builtin_new(unsigned long size) { | |
28 return malloc(size); | |
29 } | |
30 | |
6404
83b3315c679b
Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents:
6380
diff
changeset
|
31 #if defined(__FreeBSD__) || defined(__NetBSD__) |
83b3315c679b
Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents:
6380
diff
changeset
|
32 void *__ctype_b=NULL; |
6377 | 33 #endif |
6367 | 34 |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7180
diff
changeset
|
35 static unsigned long (*raCloseCodec)(void*); |
7557 | 36 static unsigned long (*raDecode)(void*, char*,unsigned long,char*,unsigned int*,long); |
6745
9734bfbb200a
Avoid ulong typedef clash and replace if by unsigned long, patch by Joey Parrish.
atmos4
parents:
6428
diff
changeset
|
37 static unsigned long (*raFlush)(unsigned long,unsigned long,unsigned long); |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7180
diff
changeset
|
38 static unsigned long (*raFreeDecoder)(void*); |
7557 | 39 static void* (*raGetFlavorProperty)(void*,unsigned long,unsigned long,int*); |
6745
9734bfbb200a
Avoid ulong typedef clash and replace if by unsigned long, patch by Joey Parrish.
atmos4
parents:
6428
diff
changeset
|
40 //static unsigned long (*raGetNumberOfFlavors2)(void); |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7180
diff
changeset
|
41 static unsigned long (*raInitDecoder)(void*, void*); |
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7180
diff
changeset
|
42 static unsigned long (*raOpenCodec2)(void*); |
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7180
diff
changeset
|
43 static unsigned long (*raSetFlavor)(void*,unsigned long); |
7752
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
44 static void (*raSetDLLAccessPath)(char*); |
7086
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
45 static void (*raSetPwd)(char*,char*); |
6367 | 46 |
47 typedef struct { | |
48 int samplerate; | |
49 short bits; | |
50 short channels; | |
51 int unk1; | |
52 int unk2; | |
53 int packetsize; | |
54 int unk3; | |
55 void* unk4; | |
56 } ra_init_t; | |
57 | |
58 static int preinit(sh_audio_t *sh){ | |
59 // let's check if the driver is available, return 0 if not. | |
60 // (you should do that if you use external lib(s) which is optional) | |
61 unsigned int result; | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7180
diff
changeset
|
62 int len=0; |
6380 | 63 void* prop; |
6376 | 64 char path[4096]; |
6404
83b3315c679b
Implement Nilmoni's and Bernd Ernesti's patches for:
atmos4
parents:
6380
diff
changeset
|
65 sprintf(path, REALCODEC_PATH "/%s", sh->codec->dll); |
6376 | 66 handle = dlopen (path, RTLD_LAZY); |
6367 | 67 if(!handle){ |
68 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Cannot open dll: %s\n",dlerror()); | |
69 return 0; | |
70 } | |
71 | |
72 raCloseCodec = dlsym(handle, "RACloseCodec"); | |
73 raDecode = dlsym(handle, "RADecode"); | |
74 raFlush = dlsym(handle, "RAFlush"); | |
75 raFreeDecoder = dlsym(handle, "RAFreeDecoder"); | |
76 raGetFlavorProperty = dlsym(handle, "RAGetFlavorProperty"); | |
77 raOpenCodec2 = dlsym(handle, "RAOpenCodec2"); | |
78 raInitDecoder = dlsym(handle, "RAInitDecoder"); | |
79 raSetFlavor = dlsym(handle, "RASetFlavor"); | |
7752
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
80 raSetDLLAccessPath = dlsym(handle, "SetDLLAccessPath"); |
7086
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
81 raSetPwd = dlsym(handle, "RASetPwd"); // optional, used by SIPR |
6367 | 82 |
83 if(!raCloseCodec || !raDecode || !raFlush || !raFreeDecoder || | |
84 !raGetFlavorProperty || !raOpenCodec2 || !raSetFlavor || | |
7097
5c87f14ad947
SetDLLAccessPath isn't used. Patch by Andres Hess <jaska@gmx.net>
alex
parents:
7086
diff
changeset
|
85 /*!raSetDLLAccessPath ||*/ !raInitDecoder){ |
7752
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
86 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Cannot resolve symbols - incompatible dll: %s\n",path); |
6367 | 87 return 0; |
88 } | |
89 | |
7752
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
90 if(raSetDLLAccessPath){ |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
91 sprintf(path, "DT_Codecs=" REALCODEC_PATH); |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
92 if(path[strlen(path)-1]!='/'){ |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
93 path[strlen(path)+1]=0; |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
94 path[strlen(path)]='/'; |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
95 } |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
96 path[strlen(path)+1]=0; |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
97 raSetDLLAccessPath(path); |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
98 } |
18f8233094da
tell the codec wrapper the codec path (fixes realaudio Sipr)
arpi
parents:
7557
diff
changeset
|
99 |
6367 | 100 result=raOpenCodec2(&sh->context); |
101 if(result){ | |
102 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder open failed, error code: 0x%X\n",result); | |
103 return 0; | |
104 } | |
105 | |
106 sh->samplerate=sh->wf->nSamplesPerSec; | |
107 sh->samplesize=sh->wf->wBitsPerSample/8; | |
108 sh->channels=sh->wf->nChannels; | |
109 | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7180
diff
changeset
|
110 { |
6367 | 111 ra_init_t init_data={ |
112 sh->wf->nSamplesPerSec,sh->wf->wBitsPerSample,sh->wf->nChannels, | |
6373 | 113 100, // ??? |
114 ((short*)(sh->wf+1))[0], // subpacket size | |
8094 | 115 ((short*)(sh->wf+1))[3], // coded frame size |
116 ((short*)(sh->wf+1))[4], // codec data length | |
117 ((char*)(sh->wf+1))+10 // extras | |
6367 | 118 }; |
119 result=raInitDecoder(sh->context,&init_data); | |
120 if(result){ | |
121 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder init failed, error code: 0x%X\n",result); | |
122 return 0; | |
123 } | |
124 } | |
7086
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
125 |
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
126 if(raSetPwd){ |
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
127 // used by 'SIPR' |
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
128 raSetPwd(sh->context,"Ardubancel Quazanga"); // set password... lol. |
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
129 } |
6367 | 130 |
6373 | 131 result=raSetFlavor(sh->context,((short*)(sh->wf+1))[2]); |
6367 | 132 if(result){ |
133 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder flavor setup failed, error code: 0x%X\n",result); | |
134 return 0; | |
135 } | |
136 | |
6380 | 137 prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0,&len); |
138 mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio codec: [%d] %s\n",((short*)(sh->wf+1))[2],prop); | |
139 | |
140 prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],1,&len); | |
141 sh->i_bps=((*((int*)prop))+4)/8; | |
142 mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio bitrate: %5.3f kbit/s (%d bps) \n",(*((int*)prop))*0.001f,sh->i_bps); | |
143 | |
144 // prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0x13,&len); | |
145 // mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Samples/block?: %d \n",(*((int*)prop))); | |
146 | |
147 sh->audio_out_minsize=128000; // no idea how to get... :( | |
6373 | 148 sh->audio_in_minsize=((short*)(sh->wf+1))[1]*sh->wf->nBlockAlign; |
6367 | 149 |
150 return 1; // return values: 1=OK 0=ERROR | |
151 } | |
152 | |
153 static int init(sh_audio_t *sh_audio){ | |
154 // initialize the decoder, set tables etc... | |
155 | |
156 // you can store HANDLE or private struct pointer at sh->context | |
157 // you can access WAVEFORMATEX header at sh->wf | |
158 | |
159 // set sample format/rate parameters if you didn't do it in preinit() yet. | |
160 | |
161 return 1; // return values: 1=OK 0=ERROR | |
162 } | |
163 | |
164 static void uninit(sh_audio_t *sh){ | |
165 // uninit the decoder etc... | |
166 // again: you don't have to free() a_in_buffer here! it's done by the core. | |
167 } | |
168 | |
7104
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
169 static unsigned char sipr_swaps[38][2]={ |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
170 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
171 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
172 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56}, |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
173 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83}, |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
174 {77,80} }; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
175 |
6367 | 176 static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen){ |
177 int result; | |
178 int len=-1; | |
6373 | 179 int sps=((short*)(sh->wf+1))[0]; |
7086
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
180 int w=sh->wf->nBlockAlign; // 5 |
6373 | 181 int h=((short*)(sh->wf+1))[1]; |
7104
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
182 |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
183 // printf("bs=%d sps=%d w=%d h=%d \n",sh->wf->nBlockAlign,sps,w,h); |
7086
f0886fe4be89
support for 'sipr' codec - descrambling/reorder not yet fixed.
arpi
parents:
6745
diff
changeset
|
184 |
6373 | 185 #if 1 |
6368
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
186 if(sh->a_in_buffer_len<=0){ |
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
187 // fill the buffer! |
7104
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
188 if(!sps){ |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
189 // 'sipr' way |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
190 int j,n; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
191 int bs=h*w*2/96; // nibbles per subpacket |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
192 unsigned char *p=sh->a_in_buffer; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
193 demux_read_data(sh->ds, p, h*w); |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
194 for(n=0;n<38;n++){ |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
195 int i=bs*sipr_swaps[n][0]; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
196 int o=bs*sipr_swaps[n][1]; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
197 // swap nibbles of block 'i' with 'o' TODO: optimize |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
198 for(j=0;j<bs;j++){ |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
199 int x=(i&1) ? (p[(i>>1)]>>4) : (p[(i>>1)]&15); |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
200 int y=(o&1) ? (p[(o>>1)]>>4) : (p[(o>>1)]&15); |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
201 if(o&1) p[(o>>1)]=(p[(o>>1)]&0x0F)|(x<<4); |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
202 else p[(o>>1)]=(p[(o>>1)]&0xF0)|x; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
203 if(i&1) p[(i>>1)]=(p[(i>>1)]&0x0F)|(y<<4); |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
204 else p[(i>>1)]=(p[(i>>1)]&0xF0)|y; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
205 ++i;++o; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
206 } |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
207 } |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
208 sh->a_in_buffer_size= |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
209 sh->a_in_buffer_len=w*h; |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
210 } else { |
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
211 // 'cook' way |
6368
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
212 int x,y; |
7104
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
213 w/=sps; |
6373 | 214 for(y=0;y<h;y++) |
215 for(x=0;x<w;x++){ | |
6428
88a06ebb3287
audio subpacket reordering fixed for odd matrix height
arpi
parents:
6404
diff
changeset
|
216 demux_read_data(sh->ds, sh->a_in_buffer+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), sps); |
6368
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
217 } |
6373 | 218 sh->a_in_buffer_size= |
219 sh->a_in_buffer_len=w*h*sps; | |
7104
6d784b2812b9
'sipr' descrambling implemented, at least for 16*6 matrix
arpi
parents:
7097
diff
changeset
|
220 } |
6368
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
221 } |
6373 | 222 |
223 #else | |
224 if(sh->a_in_buffer_len<=0){ | |
225 // fill the buffer! | |
226 demux_read_data(sh->ds, sh->a_in_buffer, sh->wf->nBlockAlign); | |
227 sh->a_in_buffer_size= | |
228 sh->a_in_buffer_len=sh->wf->nBlockAlign; | |
229 } | |
230 #endif | |
6367 | 231 |
6373 | 232 result=raDecode(sh->context, sh->a_in_buffer+sh->a_in_buffer_size-sh->a_in_buffer_len, sh->wf->nBlockAlign, |
6367 | 233 buf, &len, -1); |
6368
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
234 sh->a_in_buffer_len-=sh->wf->nBlockAlign; |
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
235 |
6376 | 236 // printf("radecode: %d bytes, res=0x%X \n",len,result); |
6367 | 237 |
6368
9511fffdb8c6
yeah, it worx! but needs a big cleanup and removal of hardcoded stuff
arpi
parents:
6367
diff
changeset
|
238 return len; // return value: number of _bytes_ written to output buffer, |
6367 | 239 // or -1 for EOF (or uncorrectable error) |
240 } | |
241 | |
242 static int control(sh_audio_t *sh,int cmd,void* arg, ...){ | |
243 // various optional functions you MAY implement: | |
244 switch(cmd){ | |
245 case ADCTRL_RESYNC_STREAM: | |
246 // it is called once after seeking, to resync. | |
247 // Note: sh_audio->a_in_buffer_len=0; is done _before_ this call! | |
248 return CONTROL_TRUE; | |
249 case ADCTRL_SKIP_FRAME: | |
250 // it is called to skip (jump over) small amount (1/10 sec or 1 frame) | |
251 // of audio data - used to sync audio to video after seeking | |
252 // if you don't return CONTROL_TRUE, it will defaults to: | |
253 // ds_fill_buffer(sh_audio->ds); // skip 1 demux packet | |
254 return CONTROL_TRUE; | |
255 } | |
256 return CONTROL_UNKNOWN; | |
257 } | |
258 | |
259 #endif |