dec_audio.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 496 行 · 第 1/2 页
C
496 行
#include <uclib.h>#include <uclib.h>#include <uclib.h>#include "config.h"#include "mp_msg.h"#include "help_mp.h"#include "stream/stream.h"#include "libmpdemux/demuxer.h"#include "codec-cfg.h"#include "libmpdemux/stheader.h"#include "dec_audio.h"#include "ad.h"#include "libaf/af_format.h"#include "libaf/af.h"#ifdef HAVE_MALLOC_H#include <uclib.h>#endif#ifdef DYNAMIC_PLUGINS#include <dlfcn.h>#endif#undef memcpy#define memcpy uc_memcpy#ifdef USE_FAKE_MONOint fakemono=0;#endif/* used for ac3surround decoder - set using -channels option */int audio_output_channels = 2;af_cfg_t af_cfg = {1, NULL}; // Configuration for audio filtersvoid afm_help(void){ int i; mp_msg(MSGT_DECAUDIO,MSGL_INFO,MSGTR_AvailableAudioFm); mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_DRIVERS\n"); mp_msg(MSGT_DECAUDIO,MSGL_INFO," afm: info: (comment)\n"); for (i=0; mpcodecs_ad_drivers[i] != NULL; i++) if(mpcodecs_ad_drivers[i]->info->comment && mpcodecs_ad_drivers[i]->info->comment[0]) mp_msg(MSGT_DECAUDIO,MSGL_INFO,"%9s %s (%s)\n", mpcodecs_ad_drivers[i]->info->short_name, mpcodecs_ad_drivers[i]->info->name, mpcodecs_ad_drivers[i]->info->comment); else mp_msg(MSGT_DECAUDIO,MSGL_INFO,"%9s %s\n", mpcodecs_ad_drivers[i]->info->short_name, mpcodecs_ad_drivers[i]->info->name);}int init_audio_codec(sh_audio_t *sh_audio){ if ((af_cfg.force & AF_INIT_FORMAT_MASK) == AF_INIT_FLOAT) { int fmt = AF_FORMAT_FLOAT_NE; if (sh_audio->ad_driver->control(sh_audio, ADCTRL_QUERY_FORMAT, &fmt) == CONTROL_TRUE) { sh_audio->sample_format = fmt; sh_audio->samplesize = 4; } } if(!sh_audio->ad_driver->preinit(sh_audio)) { mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_ADecoderPreinitFailed); return 0; }/* allocate audio in buffer: */ if(sh_audio->audio_in_minsize>0){ sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize; mp_msg(MSGT_DECAUDIO,MSGL_V,MSGTR_AllocatingBytesForInputBuffer, sh_audio->a_in_buffer_size); sh_audio->a_in_buffer=memalign(32,sh_audio->a_in_buffer_size); memset(sh_audio->a_in_buffer,0,sh_audio->a_in_buffer_size); sh_audio->a_in_buffer_len=0; }/* allocate audio out buffer: */ sh_audio->a_buffer_size=sh_audio->audio_out_minsize+MAX_OUTBURST; /* worst case calc.*/ mp_msg(MSGT_DECAUDIO,MSGL_V,MSGTR_AllocatingBytesForOutputBuffer, sh_audio->audio_out_minsize,MAX_OUTBURST,sh_audio->a_buffer_size); sh_audio->a_buffer=memalign(32,sh_audio->a_buffer_size); if(!sh_audio->a_buffer){ mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_CantAllocAudioBuf); return 0; } memset(sh_audio->a_buffer,0,sh_audio->a_buffer_size); sh_audio->a_buffer_len=0; if(!sh_audio->ad_driver->init(sh_audio)){ mp_msg(MSGT_DECAUDIO,MSGL_WARN,MSGTR_ADecoderInitFailed); uninit_audio(sh_audio); // free buffers return 0; } sh_audio->inited=1; if(!sh_audio->channels || !sh_audio->samplerate){ mp_msg(MSGT_DECAUDIO,MSGL_WARN,MSGTR_UnknownAudio); uninit_audio(sh_audio); // free buffers return 0; } if(!sh_audio->o_bps) sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize; mp_msg(MSGT_DECAUDIO,MSGL_INFO,"AUDIO: %d Hz, %d ch, %s, %3.1f kbit/%3.2f%% (ratio: %d->%d)\n", sh_audio->samplerate,sh_audio->channels, af_fmt2str_short(sh_audio->sample_format), sh_audio->i_bps*8*0.001,((float)sh_audio->i_bps/sh_audio->o_bps)*100.0, sh_audio->i_bps,sh_audio->o_bps); mp_msg(MSGT_IDENTIFY,MSGL_INFO,"ID_AUDIO_BITRATE=%d\nID_AUDIO_RATE=%d\n" "ID_AUDIO_NCH=%d\n", sh_audio->i_bps*8, sh_audio->samplerate, sh_audio->channels ); sh_audio->a_out_buffer_size=sh_audio->a_buffer_size; sh_audio->a_out_buffer=sh_audio->a_buffer; sh_audio->a_out_buffer_len=sh_audio->a_buffer_len; return 1;}int init_audio(sh_audio_t *sh_audio,char* codecname,char* afm,int status){ unsigned int orig_fourcc=sh_audio->wf?sh_audio->wf->wFormatTag:0; int force = 0; if (codecname && codecname[0] == '+') { codecname = &codecname[1]; force = 1; } sh_audio->codec=NULL; while(1){ ad_functions_t* mpadec; int i; sh_audio->ad_driver = 0; // restore original fourcc: if(sh_audio->wf) sh_audio->wf->wFormatTag=i=orig_fourcc; if(!(sh_audio->codec=find_audio_codec(sh_audio->format, sh_audio->wf?(&i):NULL, sh_audio->codec, force) )) break; if(sh_audio->wf) sh_audio->wf->wFormatTag=i; // ok we found one codec if(sh_audio->codec->flags&CODECS_FLAG_SELECTED) continue; // already tried & failed if(codecname && strcmp(sh_audio->codec->name,codecname)) continue; // -ac#ifdef JZ47_OPT if (sh_audio->samplerate > 0 && sh_audio->samplerate < 32000 && !strcmp(sh_audio->codec->drv,"libmad")) continue; // madlib > 32K#endif if(afm && strcmp(sh_audio->codec->drv,afm)) continue; // afm doesn't match if(!force && sh_audio->codec->status<status) continue; // too unstable sh_audio->codec->flags|=CODECS_FLAG_SELECTED; // tagging it // ok, it matches all rules, let's find the driver! for (i=0; mpcodecs_ad_drivers[i] != NULL; i++)#ifdef USE_16M_SDRAM{ printf ("mpcodecs_ad_drivers[i]->info->short_name = %s, sh_audio->codec->drv = %s \n", mpcodecs_ad_drivers[i]->info->short_name,sh_audio->codec->drv); if(!strcmp(mpcodecs_ad_drivers[i]->info->short_name,sh_audio->codec->drv)) break;}#else if(!strcmp(mpcodecs_ad_drivers[i]->info->short_name,sh_audio->codec->drv)) break;#endif mpadec=mpcodecs_ad_drivers[i];#ifdef USE_16M_SDRAM { codecs_t *p; p = copy_codecs_script (sh_audio->codec); if (!p) { mpadec=NULL; break; } sh_audio->codec = p; } if (mpadec) { if (!strcmp("ffmpeg", sh_audio->codec->drv)) load_plugin (sh_audio->codec->drv, sh_audio->codec->dll, 0, 0); } else { ad_functions_t *funcs_sym; ad_info_t *info_sym; funcs_sym = load_plugin (sh_audio->codec->drv, "", 0, 0); if (!funcs_sym || !funcs_sym->info || !funcs_sym->preinit || !funcs_sym->init || !funcs_sym->uninit || !funcs_sym->control || !funcs_sym->decode_audio) break; info_sym = funcs_sym->info; if (strcmp(info_sym->short_name, sh_audio->codec->drv)) break; mpadec = funcs_sym; }#endif#ifdef DYNAMIC_PLUGINS if (!mpadec) { /* try to open shared decoder plugin */ int buf_len; char *buf; ad_functions_t *funcs_sym; ad_info_t *info_sym; buf_len = strlen(MPLAYER_LIBDIR)+strlen(sh_audio->codec->drv)+16; buf = malloc(buf_len); if (!buf) break; snprintf(buf, buf_len, "%s/mplayer/ad_%s.so", MPLAYER_LIBDIR, sh_audio->codec->drv); mp_msg(MSGT_DECAUDIO, MSGL_DBG2, "Trying to open external plugin: %s\n", buf); sh_audio->dec_handle = dlopen(buf, RTLD_LAZY); if (!sh_audio->dec_handle) break; snprintf(buf, buf_len, "mpcodecs_ad_%s", sh_audio->codec->drv); funcs_sym = dlsym(sh_audio->dec_handle, buf); if (!funcs_sym || !funcs_sym->info || !funcs_sym->preinit || !funcs_sym->init || !funcs_sym->uninit || !funcs_sym->control || !funcs_sym->decode_audio) break; info_sym = funcs_sym->info; if (strcmp(info_sym->short_name, sh_audio->codec->drv)) break; free(buf); mpadec = funcs_sym; mp_msg(MSGT_DECAUDIO, MSGL_V, "Using external decoder plugin (%s/mplayer/ad_%s.so)!\n", MPLAYER_LIBDIR, sh_audio->codec->drv); }#endif if(!mpadec){ // driver not available (==compiled in) mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_AudioCodecFamilyNotAvailableStr, sh_audio->codec->name, sh_audio->codec->drv); continue; } // it's available, let's try to init! // init() mp_msg(MSGT_DECAUDIO,MSGL_INFO,MSGTR_OpeningAudioDecoder,mpadec->info->short_name,mpadec->info->name); sh_audio->ad_driver = mpadec; if(!init_audio_codec(sh_audio)){ mp_msg(MSGT_DECAUDIO,MSGL_INFO,MSGTR_ADecoderInitFailed); continue; // try next... } // Yeah! We got it! return 1;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?