⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dec_audio.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include "config.h"#include "mp_msg.h"#include "help_mp.h"#include "stream.h"#include "demuxer.h"#include "codec-cfg.h"#include "stheader.h"#include "dec_audio.h"#include "ad.h"#include "../libaf/af_format.h"#include "../libaf/af.h"#ifdef DYNAMIC_PLUGINS#include <dlfcn.h>#endif#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; // Configuration for audio filtersvoid afm_help(){    int i;    mp_msg(MSGT_DECAUDIO,MSGL_INFO,MSGTR_AvailableAudioFm);    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=malloc(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=malloc(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);  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;    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_codec(sh_audio->format,          sh_audio->wf?(&i):NULL, sh_audio->codec,1) )) 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	if(afm && strcmp(sh_audio->codec->drv,afm)) continue; // afm doesn't match	if(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++)	    if(!strcmp(mpcodecs_ad_drivers[i]->info->short_name,sh_audio->codec->drv)) break;	mpadec=mpcodecs_ad_drivers[i];#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;    }    return 0;}extern char *get_path(char *filename);int init_best_audio_codec(sh_audio_t *sh_audio,char** audio_codec_list,char** audio_fm_list){char* ac_l_default[2]={"",(char*)NULL};// hack:if(!audio_codec_list) audio_codec_list=ac_l_default;// Go through the codec.conf and find the best codec...sh_audio->inited=0;codecs_reset_selection(1);while(!sh_audio->inited && *audio_codec_list){  char* audio_codec=*(audio_codec_list++);  if(audio_codec[0]){    if(audio_codec[0]=='-'){      // disable this codec:      select_codec(audio_codec+1,1);    } else {      // forced codec by name:      mp_msg(MSGT_DECAUDIO,MSGL_INFO,MSGTR_ForcedAudioCodec,audio_codec);      init_audio(sh_audio,audio_codec,NULL,-1);    }  } else {    int status;    // try in stability order: UNTESTED, WORKING, BUGGY. never try CRASHING.    if(audio_fm_list){      char** fmlist=audio_fm_list;      // try first the preferred codec families:      while(!sh_audio->inited && *fmlist){        char* audio_fm=*(fmlist++);	mp_msg(MSGT_DECAUDIO,MSGL_INFO,MSGTR_TryForceAudioFmtStr,audio_fm);	for(status=CODECS_STATUS__MAX;status>=CODECS_STATUS__MIN;--status)	    if(init_audio(sh_audio,NULL,audio_fm,status)) break;      }    }    if(!sh_audio->inited)	for(status=CODECS_STATUS__MAX;status>=CODECS_STATUS__MIN;--status)	    if(init_audio(sh_audio,NULL,NULL,status)) break;  }}if(!sh_audio->inited){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -