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 + -
显示快捷键?