Mercurial > mplayer.hg
comparison dec_audio.c @ 303:828ec81e0d64
codecs.conf support
author | arpi_esp |
---|---|
date | Sat, 07 Apr 2001 21:27:57 +0000 |
parents | c3d7a28a0d1a |
children | 1f7c824033fb |
comparison
equal
deleted
inserted
replaced
302:a1fe76547e8f | 303:828ec81e0d64 |
---|---|
1 | |
2 // FIXME: use codec.conf struct here!!! | |
3 int detect_audio_format(sh_audio_t *sh_audio){ | |
4 int has_audio=0; | |
5 // Decide audio format: | |
6 switch(sh_audio->wf.wFormatTag){ | |
7 case 0: | |
8 has_audio=0;break; // disable/no audio | |
9 case 6: | |
10 avi_header.audio_seekable=1; | |
11 has_audio=5;break; // aLaw | |
12 case 0x31: | |
13 case 0x32: | |
14 has_audio=6;break; // MS-GSM | |
15 case 0x50: | |
16 #ifdef DEFAULT_MPG123 | |
17 case 0x55: | |
18 #endif | |
19 avi_header.audio_seekable=1; | |
20 has_audio=1;break; // MPEG | |
21 case 0x01: | |
22 avi_header.audio_seekable=1; | |
23 has_audio=2;break; // PCM | |
24 case 0x2000: | |
25 avi_header.audio_seekable=1; | |
26 has_audio=3;break; // AC3 | |
27 default: | |
28 avi_header.audio_seekable=0; | |
29 has_audio=4; // Win32/ACM | |
30 } | |
31 if(has_audio==4){ | |
32 if(!avi_header.audio_codec) avi_header.audio_codec=get_auds_codec_name(sh_audio); | |
33 if(avi_header.auds_guid) has_audio=7; // force DShow | |
34 if(!avi_header.audio_codec) has_audio=0; // unknown win32 codec | |
35 if(verbose) printf("win32 audio codec: '%s'\n",avi_header.audio_codec); | |
36 } | |
37 if(verbose) printf("detected audio format: %d\n",has_audio); | |
38 return has_audio; | |
39 } | |
40 | 1 |
41 int init_audio(sh_audio_t *sh_audio){ | 2 int init_audio(sh_audio_t *sh_audio){ |
42 int has_audio=sh_audio->codec.driver; | 3 |
4 int driver=sh_audio->codec->driver; | |
43 | 5 |
44 sh_audio->samplesize=2; | 6 sh_audio->samplesize=2; |
7 sh_audio->samplerate=0; | |
45 sh_audio->pcm_bswap=0; | 8 sh_audio->pcm_bswap=0; |
9 | |
46 sh_audio->a_buffer_size=16384; // default size, maybe not enough for Win32/ACM | 10 sh_audio->a_buffer_size=16384; // default size, maybe not enough for Win32/ACM |
47 | 11 sh_audio->a_buffer=NULL; |
48 if(has_audio==4){ | 12 |
13 if(driver==4){ | |
49 // Win32 ACM audio codec: | 14 // Win32 ACM audio codec: |
50 if(init_acm_audio_codec(sh_audio)){ | 15 if(init_acm_audio_codec(sh_audio)){ |
51 sh_audio->channels=sh_audio->o_wf.nChannels; | 16 sh_audio->channels=sh_audio->o_wf.nChannels; |
52 sh_audio->samplerate=sh_audio->o_wf.nSamplesPerSec; | 17 sh_audio->samplerate=sh_audio->o_wf.nSamplesPerSec; |
53 if(sh_audio->a_buffer_size<sh_audio->audio_out_minsize+OUTBURST) | 18 if(sh_audio->a_buffer_size<sh_audio->audio_out_minsize+OUTBURST) |
54 sh_audio->a_buffer_size=sh_audio->audio_out_minsize+OUTBURST; | 19 sh_audio->a_buffer_size=sh_audio->audio_out_minsize+OUTBURST; |
55 } else { | 20 } else { |
56 printf("Could not load/initialize Win32/ACM AUDIO codec (missing DLL file?)\n"); | 21 printf("Could not load/initialize Win32/ACM AUDIO codec (missing DLL file?)\n"); |
57 if((sh_audio->wf.wFormatTag)==0x55){ | 22 driver=0; |
58 printf("Audio format is MP3 -> fallback to internal mp3lib/mpg123\n"); | 23 } |
59 has_audio=1; // fallback to mp3lib | 24 } |
60 } else | 25 |
61 has_audio=0; // nosound | 26 if(driver==7){ |
62 } | |
63 } | |
64 | |
65 if(has_audio==7){ | |
66 #ifndef USE_DIRECTSHOW | 27 #ifndef USE_DIRECTSHOW |
67 printf("Compiled without DirectShow support -> force nosound :(\n"); | 28 printf("Compiled without DirectShow support -> force nosound :(\n"); |
68 has_audio=0; | 29 driver=0; |
69 #else | 30 #else |
70 // Win32 DShow audio codec: | 31 // Win32 DShow audio codec: |
71 WAVEFORMATEX *in_fmt=&sh_audio->wf; | 32 printf("DShow_audio: channs=%d rate=%d\n",sh_audio->channels,sh_audio->samplerate); |
72 sh_audio->o_wf.nChannels=in_fmt->nChannels; | 33 |
73 sh_audio->o_wf.nSamplesPerSec=in_fmt->nSamplesPerSec; | 34 if(DS_AudioDecoder_Open(sh_audio->codec->dll,&sh_audio->codec->guid,&sh_audio->wf)){ |
74 sh_audio->o_wf.nAvgBytesPerSec=2*sh_audio->o_wf.nSamplesPerSec*sh_audio->o_wf.nChannels; | 35 printf("ERROR: Could not load/initialize Win32/DirctShow AUDIO codec: %s\n",sh_audio->codec->dll); |
75 sh_audio->o_wf.wFormatTag=WAVE_FORMAT_PCM; | 36 driver=0; |
76 sh_audio->o_wf.nBlockAlign=2*in_fmt->nChannels; | 37 } else { |
77 sh_audio->o_wf.wBitsPerSample=16; | 38 sh_audio->channels=sh_audio->wf.nChannels; |
78 sh_audio->o_wf.cbSize=0; | 39 sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; |
79 | 40 sh_audio->audio_in_minsize=2*sh_audio->wf.nBlockAlign; |
80 if(!DS_AudioDecoder_Open(avi_header.audio_codec,avi_header.auds_guid,in_fmt)){ | |
81 sh_audio->channels=sh_audio->o_wf.nChannels; | |
82 sh_audio->samplerate=sh_audio->o_wf.nSamplesPerSec; | |
83 | |
84 sh_audio->audio_in_minsize=2*sh_audio->o_wf.nBlockAlign; | |
85 if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192; | 41 if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192; |
86 sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; | 42 sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; |
87 sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size); | 43 sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size); |
88 sh_audio->a_in_buffer_len=0; | 44 sh_audio->a_in_buffer_len=0; |
89 | 45 } |
90 } else { | 46 #endif |
91 printf("ERROR: Could not load/initialize Win32/DirctShow AUDIO codec: %s\n",avi_header.audio_codec); | 47 } |
92 if((in_fmt->wFormatTag)==0x55){ | 48 |
93 printf("Audio format is MP3 -> fallback to internal mp3lib/mpg123\n"); | 49 if(!driver) return 0; |
94 has_audio=1; // fallback to mp3lib | |
95 } else | |
96 printf("Audio disabled! Try to upgrade your w32codec.zip package!!!\n"); | |
97 has_audio=0; // nosound | |
98 } | |
99 #endif | |
100 } | |
101 | |
102 | 50 |
103 // allocate audio out buffer: | 51 // allocate audio out buffer: |
104 sh_audio->a_buffer=malloc(sh_audio->a_buffer_size); | 52 sh_audio->a_buffer=malloc(sh_audio->a_buffer_size); |
105 memset(sh_audio->a_buffer,0,sh_audio->a_buffer_size); | 53 memset(sh_audio->a_buffer,0,sh_audio->a_buffer_size); |
106 sh_audio->a_buffer_len=0; | 54 sh_audio->a_buffer_len=0; |
107 | 55 |
108 if(has_audio==4){ | 56 switch(driver){ |
57 case 4: { | |
109 int ret=acm_decode_audio(sh_audio,sh_audio->a_buffer,sh_audio->a_buffer_size); | 58 int ret=acm_decode_audio(sh_audio,sh_audio->a_buffer,sh_audio->a_buffer_size); |
110 if(ret<0){ | 59 if(ret<0){ |
111 printf("ACM error %d -> switching to nosound...\n",ret); | 60 printf("ACM decoding error: %d\n",ret); |
112 has_audio=0; | 61 driver=0; |
113 } else { | |
114 sh_audio->a_buffer_len=ret; | |
115 printf("ACM decoding test: %d bytes\n",ret); | |
116 } | 62 } |
117 } | 63 break; |
118 | 64 } |
119 if(has_audio==2){ | 65 case 2: { |
120 // if(file_format==DEMUXER_TYPE_AVI){ // FIXME!!!!!!! | 66 // if(file_format==DEMUXER_TYPE_AVI){ // FIXME!!!!!!! |
121 // AVI PCM Audio: | 67 // AVI PCM Audio: |
122 WAVEFORMATEX *h=&sh_audio->wf; | 68 WAVEFORMATEX *h=&sh_audio->wf; |
123 sh_audio->channels=h->nChannels; | 69 sh_audio->channels=h->nChannels; |
124 sh_audio->samplerate=h->nSamplesPerSec; | 70 sh_audio->samplerate=h->nSamplesPerSec; |
127 // // DVD PCM audio: | 73 // // DVD PCM audio: |
128 // sh_audio->channels=2; | 74 // sh_audio->channels=2; |
129 // sh_audio->samplerate=48000; | 75 // sh_audio->samplerate=48000; |
130 // sh_audio->pcm_bswap=1; | 76 // sh_audio->pcm_bswap=1; |
131 // } | 77 // } |
132 } else | 78 break; |
133 if(has_audio==3){ | 79 } |
80 case 3: { | |
134 // Dolby AC3 audio: | 81 // Dolby AC3 audio: |
135 ac3_config.fill_buffer_callback = ac3_fill_buffer; | 82 ac3_config.fill_buffer_callback = ac3_fill_buffer; |
136 ac3_config.num_output_ch = 2; | 83 ac3_config.num_output_ch = 2; |
137 ac3_config.flags = 0; | 84 ac3_config.flags = 0; |
138 #ifdef HAVE_MMX | 85 #ifdef HAVE_MMX |
144 ac3_init(); | 91 ac3_init(); |
145 sh_audio->ac3_frame = ac3_decode_frame(); | 92 sh_audio->ac3_frame = ac3_decode_frame(); |
146 if(sh_audio->ac3_frame){ | 93 if(sh_audio->ac3_frame){ |
147 sh_audio->samplerate=sh_audio->ac3_frame->sampling_rate; | 94 sh_audio->samplerate=sh_audio->ac3_frame->sampling_rate; |
148 sh_audio->channels=2; | 95 sh_audio->channels=2; |
149 } else has_audio=0; // bad frame -> disable audio | 96 } else { |
150 } else | 97 driver=0; // bad frame -> disable audio |
151 if(has_audio==5){ | 98 } |
99 break; | |
100 } | |
101 case 5: { | |
152 // aLaw audio codec: | 102 // aLaw audio codec: |
153 Gen_aLaw_2_Signed(); // init table | 103 Gen_aLaw_2_Signed(); // init table |
154 sh_audio->channels=sh_audio->wf.nChannels; | 104 sh_audio->channels=sh_audio->wf.nChannels; |
155 sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; | 105 sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; |
156 } else | 106 break; |
157 if(has_audio==6){ | 107 } |
108 case 6: { | |
158 // MS-GSM audio codec: | 109 // MS-GSM audio codec: |
159 GSM_Init(); | 110 GSM_Init(); |
160 sh_audio->channels=sh_audio->wf.nChannels; | 111 sh_audio->channels=sh_audio->wf.nChannels; |
161 sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; | 112 sh_audio->samplerate=sh_audio->wf.nSamplesPerSec; |
162 } | 113 break; |
163 // must be here for Win32->mp3lib fallbacks | 114 } |
164 if(has_audio==1){ | 115 case 1: { |
165 // MPEG Audio: | 116 // MPEG Audio: |
166 MP3_Init(); | 117 MP3_Init(); |
167 MP3_samplerate=MP3_channels=0; | 118 MP3_samplerate=MP3_channels=0; |
168 // printf("[\n"); | 119 // printf("[\n"); |
169 sh_audio->a_buffer_len=MP3_DecodeFrame(sh_audio->a_buffer,-1); | 120 sh_audio->a_buffer_len=MP3_DecodeFrame(sh_audio->a_buffer,-1); |
170 // printf("]\n"); | 121 // printf("]\n"); |
171 sh_audio->channels=2; // hack | 122 sh_audio->channels=2; // hack |
172 sh_audio->samplerate=MP3_samplerate; | 123 sh_audio->samplerate=MP3_samplerate; |
124 break; | |
125 } | |
173 } | 126 } |
174 | 127 |
175 if(!sh_audio->channels || !sh_audio->samplerate){ | 128 if(!sh_audio->channels || !sh_audio->samplerate){ |
176 printf("Unknown/missing audio format, using nosound\n"); | 129 printf("Unknown/missing audio format, using nosound\n"); |
177 has_audio=0; | 130 driver=0; |
178 } | 131 } |
132 | |
133 if(!driver){ | |
134 if(sh_audio->a_buffer) free(sh_audio->a_buffer); | |
135 sh_audio->o_bps=0; | |
136 return 0; | |
137 } | |
179 | 138 |
180 sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize; | 139 sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize; |
181 | 140 return driver; |
182 return has_audio; | |
183 } | 141 } |
184 | 142 |
185 // Audio decoding | 143 // Audio decoding |
186 | 144 |
187 int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen){ | 145 int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen){ |
188 int len=-1; | 146 int len=-1; |
189 switch(sh_audio->codec.driver){ | 147 switch(sh_audio->codec->driver){ |
190 case 1: // MPEG layer 2 or 3 | 148 case 1: // MPEG layer 2 or 3 |
191 len=MP3_DecodeFrame(buf,-1); | 149 len=MP3_DecodeFrame(buf,-1); |
192 sh_audio->channels=2; // hack | 150 sh_audio->channels=2; // hack |
193 break; | 151 break; |
194 case 2: // PCM | 152 case 2: // PCM |