Mercurial > mplayer.hg
comparison dec_audio.c @ 1528:a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
author | arpi |
---|---|
date | Wed, 15 Aug 2001 11:50:55 +0000 |
parents | 0e9c29538a86 |
children | 81aa2d701ae0 |
comparison
equal
deleted
inserted
replaced
1527:187aa4b576a7 | 1528:a444bd456fcc |
---|---|
26 #include "libac3/ac3.h" | 26 #include "libac3/ac3.h" |
27 | 27 |
28 #include "alaw.h" | 28 #include "alaw.h" |
29 | 29 |
30 #include "xa/xa_gsm.h" | 30 #include "xa/xa_gsm.h" |
31 | |
32 #include "ac3-iec958.h" | |
31 | 33 |
32 #ifdef USE_DIRECTSHOW | 34 #ifdef USE_DIRECTSHOW |
33 #include "loader/DirectShow/DS_AudioDec.h" | 35 #include "loader/DirectShow/DS_AudioDec.h" |
34 #endif | 36 #endif |
35 | 37 |
128 break; | 130 break; |
129 case AFM_AC3: | 131 case AFM_AC3: |
130 // Dolby AC3 audio: | 132 // Dolby AC3 audio: |
131 sh_audio->audio_out_minsize=4*256*6; | 133 sh_audio->audio_out_minsize=4*256*6; |
132 break; | 134 break; |
135 case AFM_HWAC3: | |
136 // Dolby AC3 audio: | |
137 sh_audio->audio_out_minsize=4*256*6; | |
138 sh_audio->sample_format = AFMT_AC3; | |
139 break; | |
133 case AFM_GSM: | 140 case AFM_GSM: |
134 // MS-GSM audio codec: | 141 // MS-GSM audio codec: |
135 sh_audio->audio_out_minsize=4*320; | 142 sh_audio->audio_out_minsize=4*320; |
136 break; | 143 break; |
137 case AFM_MPEG: | 144 case AFM_MPEG: |
217 } else { | 224 } else { |
218 driver=0; // bad frame -> disable audio | 225 driver=0; // bad frame -> disable audio |
219 } | 226 } |
220 break; | 227 break; |
221 } | 228 } |
229 case AFM_HWAC3: { | |
230 unsigned char *buffer; | |
231 struct hwac3info ai; | |
232 int len, skipped; | |
233 len = ds_get_packet(sh_audio->ds, &buffer); | |
234 if(ac3_iec958_parse_syncinfo(buffer, len, &ai, &skipped) < 0) { | |
235 fprintf(stderr, "AC3 stream not valid.\n"); | |
236 driver = 0; | |
237 break; | |
238 } | |
239 if(ai.samplerate != 48000) { | |
240 fprintf(stderr, "Only 48000 Hz streams supported.\n"); | |
241 driver = 0; | |
242 break; | |
243 } | |
244 sh_audio->samplerate=ai.samplerate; | |
245 // sh_audio->samplesize=ai.framesize; | |
246 sh_audio->channels=1; | |
247 sh_audio->i_bps=ai.bitrate*(1000/8); | |
248 sh_audio->ac3_frame=malloc(6144); | |
249 break; | |
250 } | |
222 case AFM_ALAW: { | 251 case AFM_ALAW: { |
223 // aLaw audio codec: | 252 // aLaw audio codec: |
224 sh_audio->channels=sh_audio->wf->nChannels; | 253 sh_audio->channels=sh_audio->wf->nChannels; |
225 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec; | 254 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec; |
226 sh_audio->i_bps=sh_audio->channels*sh_audio->samplerate; | 255 sh_audio->i_bps=sh_audio->channels*sh_audio->samplerate; |
330 memcpy(buf,((ac3_frame_t*)sh_audio->ac3_frame)->audio_data,len); | 359 memcpy(buf,((ac3_frame_t*)sh_audio->ac3_frame)->audio_data,len); |
331 sh_audio->ac3_frame=NULL; | 360 sh_audio->ac3_frame=NULL; |
332 } | 361 } |
333 //printf("{3:%d}",avi_header.idx_pos);fflush(stdout); | 362 //printf("{3:%d}",avi_header.idx_pos);fflush(stdout); |
334 break; | 363 break; |
364 case AFM_HWAC3: // AC3 through SPDIF | |
365 if(demux_read_data(sh_audio->ds,sh_audio->ac3_frame, 6144) != 6144) | |
366 break; //EOF | |
367 ac3_iec958_build_burst(1536, 0x1F, 1, buf, sh_audio->ac3_frame); | |
368 len = 6144; | |
369 break; | |
335 #ifdef USE_WIN32DLL | 370 #ifdef USE_WIN32DLL |
336 case AFM_ACM: | 371 case AFM_ACM: |
337 // len=sh_audio->audio_out_minsize; // optimal decoded fragment size | 372 // len=sh_audio->audio_out_minsize; // optimal decoded fragment size |
338 // if(len<minlen) len=minlen; else | 373 // if(len<minlen) len=minlen; else |
339 // if(len>maxlen) len=maxlen; | 374 // if(len>maxlen) len=maxlen; |
385 sh_audio->ac3_frame=ac3_decode_frame(); // resync | 420 sh_audio->ac3_frame=ac3_decode_frame(); // resync |
386 // if(verbose) printf(" OK!\n"); | 421 // if(verbose) printf(" OK!\n"); |
387 break; | 422 break; |
388 case AFM_ACM: | 423 case AFM_ACM: |
389 case AFM_DSHOW: | 424 case AFM_DSHOW: |
425 case AFM_HWAC3: | |
390 sh_audio->a_in_buffer_len=0; // reset ACM/DShow audio buffer | 426 sh_audio->a_in_buffer_len=0; // reset ACM/DShow audio buffer |
391 break; | 427 break; |
392 } | 428 } |
393 | 429 |
394 } | 430 } |