Mercurial > mplayer.hg
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 |