comparison dec_audio.c @ 1927:296208b47fd4

FFmpeg audio codecs support
author arpi
date Fri, 21 Sep 2001 21:34:56 +0000
parents 5f246fcc2971
children 5216f108cb4f
comparison
equal deleted inserted replaced
1926:0b14f254ae9b 1927:296208b47fd4
41 /* XXX is math.h really needed? - atmos */ 41 /* XXX is math.h really needed? - atmos */
42 #include <math.h> 42 #include <math.h>
43 #include <vorbis/codec.h> 43 #include <vorbis/codec.h>
44 #endif 44 #endif
45 45
46 #ifdef USE_LIBAVCODEC
47 #include "libavcodec/avcodec.h"
48 static AVCodec *lavc_codec=NULL;
49 static AVCodecContext lavc_context;
50 extern int avcodec_inited;
51 #endif
52
46 extern int init_acm_audio_codec(sh_audio_t *sh_audio); 53 extern int init_acm_audio_codec(sh_audio_t *sh_audio);
47 extern int acm_decode_audio(sh_audio_t *sh_audio, void* a_buffer,int minlen,int maxlen); 54 extern int acm_decode_audio(sh_audio_t *sh_audio, void* a_buffer,int minlen,int maxlen);
55 int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen);
48 56
49 57
50 static sh_audio_t* dec_audio_sh=NULL; 58 static sh_audio_t* dec_audio_sh=NULL;
51 59
52 // AC3 decoder buffer callback: 60 // AC3 decoder buffer callback:
161 break; 169 break;
162 case AFM_MPEG: 170 case AFM_MPEG:
163 // MPEG Audio: 171 // MPEG Audio:
164 sh_audio->audio_out_minsize=4608; 172 sh_audio->audio_out_minsize=4608;
165 break; 173 break;
174 case AFM_FFMPEG:
175 #ifndef USE_LIBAVCODEC
176 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"MPlayer was compiled WITHOUT libavcodec support!\n");
177 return 0;
178 #else
179 // FFmpeg Audio:
180 sh_audio->audio_out_minsize=AVCODEC_MAX_AUDIO_FRAME_SIZE;
181 break;
182 #endif
166 } 183 }
167 184
168 if(!driver) return 0; 185 if(!driver) return 0;
169 186
170 // allocate audio out buffer: 187 // allocate audio out buffer:
273 sh_audio->channels=sh_audio->wf->nChannels; 290 sh_audio->channels=sh_audio->wf->nChannels;
274 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec; 291 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
275 sh_audio->i_bps=sh_audio->channels*sh_audio->samplerate; 292 sh_audio->i_bps=sh_audio->channels*sh_audio->samplerate;
276 break; 293 break;
277 } 294 }
295 #ifdef USE_LIBAVCODEC
296 case AFM_FFMPEG: {
297 int x;
298 mp_msg(MSGT_DECAUDIO,MSGL_V,"FFmpeg's libavcodec audio codec\n");
299 if(!avcodec_inited){
300 avcodec_init();
301 avcodec_register_all();
302 avcodec_inited=1;
303 }
304 lavc_codec = (AVCodec *)avcodec_find_decoder_by_name(sh_audio->codec->dll);
305 if(!lavc_codec){
306 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"Can't find codec '%s' in libavcodec...\n",sh_audio->codec->dll);
307 return 0;
308 }
309 memset(&lavc_context, 0, sizeof(lavc_context));
310 /* open it */
311 if (avcodec_open(&lavc_context, lavc_codec) < 0) {
312 mp_msg(MSGT_DECAUDIO,MSGL_ERR, "could not open codec\n");
313 return 0;
314 }
315 mp_msg(MSGT_DECAUDIO,MSGL_V,"INFO: libavcodec init OK!\n");
316
317 // Decode at least 1 byte: (to get header filled)
318 x=decode_audio(sh_audio,sh_audio->a_buffer,1,sh_audio->a_buffer_size);
319 if(x>0) sh_audio->a_buffer_len=x;
320
321 #if 1
322 sh_audio->channels=lavc_context.channels;
323 sh_audio->samplerate=lavc_context.sample_rate;
324 sh_audio->i_bps=lavc_context.bit_rate/8;
325 #else
326 sh_audio->channels=sh_audio->wf->nChannels;
327 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
328 sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec;
329 #endif
330 break;
331 }
332 #endif
278 case AFM_GSM: { 333 case AFM_GSM: {
279 // MS-GSM audio codec: 334 // MS-GSM audio codec:
280 GSM_Init(); 335 GSM_Init();
281 sh_audio->channels=sh_audio->wf->nChannels; 336 sh_audio->channels=sh_audio->wf->nChannels;
282 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec; 337 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
446 // buffer length is 'maxlen' bytes, it shouldn't be exceeded... 501 // buffer length is 'maxlen' bytes, it shouldn't be exceeded...
447 502
448 int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen){ 503 int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen){
449 int len=-1; 504 int len=-1;
450 switch(sh_audio->codec->driver){ 505 switch(sh_audio->codec->driver){
506 #ifdef USE_LIBAVCODEC
507 case AFM_FFMPEG: {
508 unsigned char *start=NULL;
509 int y;
510 while(len<minlen){
511 int len2=0;
512 int x=ds_get_packet(sh_audio->ds,&start);
513 if(x<=0) break; // error
514 y=avcodec_decode_audio(&lavc_context,buf,&len2,start,x);
515 if(y<0){ printf("lavc_audio: error\n");break; }
516 if(y<x) sh_audio->ds->buffer_pos+=y-x; // put back data (HACK!)
517 if(len2>0){
518 //len=len2;break;
519 if(len<0) len=len2; else len+=len2;
520 buf+=len2;
521 }
522 mp_dbg(MSGT_DECAUDIO,MSGL_DBG2,"Decoded %d -> %d \n",y,len2);
523 }
524 }
525 break;
526 #endif
451 case AFM_MPEG: // MPEG layer 2 or 3 527 case AFM_MPEG: // MPEG layer 2 or 3
452 len=MP3_DecodeFrame(buf,-1); 528 len=MP3_DecodeFrame(buf,-1);
453 // len=MP3_DecodeFrame(buf,3); 529 // len=MP3_DecodeFrame(buf,3);
454 break; 530 break;
455 #ifdef HAVE_OGGVORBIS 531 #ifdef HAVE_OGGVORBIS