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