[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[280] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-11-02 10:55:07
|
Revision: 280 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=280&view=rev Author: nickols_k Date: 2012-11-02 10:54:56 +0000 (Fri, 02 Nov 2012) Log Message: ----------- use ffmpeg's audio decoders as last hope Modified Paths: -------------- mplayerxp/libmpcodecs/ad_ffmp3.c mplayerxp/libmpcodecs/dec_audio.c mplayerxp/libmpcodecs/dec_audio.h mplayerxp/libmpcodecs/vd_ffmpeg.c mplayerxp/mplayer.c Modified: mplayerxp/libmpcodecs/ad_ffmp3.c =================================================================== --- mplayerxp/libmpcodecs/ad_ffmp3.c 2012-11-02 09:08:44 UTC (rev 279) +++ mplayerxp/libmpcodecs/ad_ffmp3.c 2012-11-02 10:54:56 UTC (rev 280) @@ -12,17 +12,51 @@ #include "help_mp.h" #include "osdep/bswap.h" #include "osdep/mplib.h" +#include "libmpconf/codec-cfg.h" #define FF_API_OLD_DECODE_AUDIO 1 #include "libavcodec/avcodec.h" +#include "libavformat/riff.h" #include "codecs_ld.h" +static int acodec_inited; + +struct codecs_st* __FASTCALL__ find_ffmpeg_audio(sh_audio_t* sh) { + unsigned i; + struct codecs_st* acodec = NULL; + const char *what="AVCodecID"; + enum AVCodecID id = ff_codec_get_id(ff_codec_wav_tags,sh->wtag); + if (id <= 0) { + prn_err: + MSG_ERR("Cannot find %s for for '0x%X' tag! Try force -ac option\n" + ,what + ,sh->wtag); + return 0; + } + if(!acodec_inited){ +// avcodec_init(); + avcodec_register_all(); + acodec_inited=1; + } + AVCodec *codec=avcodec_find_decoder(id); + if(!codec) { what="AVCodec"; goto prn_err; } + + acodec=mp_mallocz(sizeof(struct codecs_st)); + strcpy(acodec->dll_name,avcodec_get_name(id)); + strcpy(acodec->driver_name,"ffmpeg"); + strcpy(acodec->codec_name,acodec->dll_name); + if(codec->sample_fmts) + for(i=0;i<CODECS_MAX_OUTFMT;i++) { + if(codec->sample_fmts[i]==-1) break; + acodec->outfmt[i]=ff_codec_get_tag(ff_codec_wav_tags,codec->sample_fmts[i]); + } + return acodec; +} + #ifndef FF_INPUT_BUFFER_PADDING_SIZE #define FF_INPUT_BUFFER_PADDING_SIZE 8 #endif -static int acodec_inited; - static const ad_info_t info = { "FFmpeg/libavcodec audio decoders", Modified: mplayerxp/libmpcodecs/dec_audio.c =================================================================== --- mplayerxp/libmpcodecs/dec_audio.c 2012-11-02 09:08:44 UTC (rev 279) +++ mplayerxp/libmpcodecs/dec_audio.c 2012-11-02 10:54:56 UTC (rev 280) @@ -14,7 +14,6 @@ #include "libmpconf/codec-cfg.h" #include "dec_audio.h" -#include "ad.h" #include "libao2/afmt.h" #include "libao2/audio_out.h" #include "mplayer.h" @@ -29,6 +28,16 @@ static const ad_functions_t* mpadec; +const ad_functions_t* mpca_find_driver(const char *name) { + unsigned i; + for (i=0; mpcodecs_ad_drivers[i] != NULL; i++) { + if(strcmp(mpcodecs_ad_drivers[i]->info->driver_name,name)==0){ + return mpcodecs_ad_drivers[i]; + } + } + return NULL; +} + int mpca_init(sh_audio_t *sh_audio) { unsigned i; Modified: mplayerxp/libmpcodecs/dec_audio.h =================================================================== --- mplayerxp/libmpcodecs/dec_audio.h 2012-11-02 09:08:44 UTC (rev 279) +++ mplayerxp/libmpcodecs/dec_audio.h 2012-11-02 10:54:56 UTC (rev 280) @@ -1,11 +1,16 @@ #ifndef DEC_AUDIO_H_INCLUDED #define DEC_AUDIO_H_INCLUDED 1 +#include "ad.h" + // dec_audio.c: +extern const ad_functions_t* __FASTCALL__ mpca_find_driver(const char *name); extern int __FASTCALL__ mpca_init(sh_audio_t *sh_audio); extern void __FASTCALL__ mpca_uninit(sh_audio_t *sh_audio); extern unsigned __FASTCALL__ mpca_decode(sh_audio_t *sh_audio,unsigned char *buf,unsigned minlen,unsigned maxlen,unsigned buflen,float *pts); extern void __FASTCALL__ mpca_resync_stream(sh_audio_t *sh_audio); extern void __FASTCALL__ mpca_skip_frame(sh_audio_t *sh_audio); +struct codecs_st; +extern struct codecs_st* __FASTCALL__ find_ffmpeg_audio(sh_audio_t*); extern int mpca_init_filters(sh_audio_t *sh_audio, int in_samplerate, int in_channels, int in_format, int in_bps, Modified: mplayerxp/libmpcodecs/vd_ffmpeg.c =================================================================== --- mplayerxp/libmpcodecs/vd_ffmpeg.c 2012-11-02 09:08:44 UTC (rev 279) +++ mplayerxp/libmpcodecs/vd_ffmpeg.c 2012-11-02 10:54:56 UTC (rev 280) @@ -233,6 +233,7 @@ strcpy(sh->codec->dll_name,"ffmpeg"); strcpy(sh->codec->driver_name,"ffmpeg"); strcpy(sh->codec->codec_name,avcodec_get_name(id)); + if(codec->pix_fmts) for(i=0;i<CODECS_MAX_OUTFMT;i++) { if(codec->pix_fmts[i]==-1) break; sh->codec->outfmt[i]=avcodec_pix_fmt_to_codec_tag(codec->pix_fmts[i]); Modified: mplayerxp/mplayer.c =================================================================== --- mplayerxp/mplayer.c 2012-11-02 09:08:44 UTC (rev 279) +++ mplayerxp/mplayer.c 2012-11-02 10:54:56 UTC (rev 280) @@ -1864,6 +1864,7 @@ } static void mpxp_find_acodec(void) { + int found=0; priv_t*priv=mp_data->priv; sh_audio_t* sh_audio=priv->demuxer->audio->sh; demux_stream_t *d_audio=priv->demuxer->audio; @@ -1871,7 +1872,6 @@ sh_audio->codec=NULL; if(mp_conf.audio_family) MSG_INFO(MSGTR_TryForceAudioFmt,mp_conf.audio_family); while(1) { - const char *fmt; sh_audio->codec=find_codec(sh_audio->wtag,NULL,sh_audio->codec,1); if(!sh_audio->codec) { if(mp_conf.audio_family) { @@ -1880,21 +1880,31 @@ mp_conf.audio_family=NULL; continue; } - MSG_ERR(MSGTR_CantFindAudioCodec); - fmt = (const char *)&sh_audio->wtag; - if(isprint(fmt[0]) && isprint(fmt[1]) && isprint(fmt[2]) && isprint(fmt[3])) - MSG_ERR(" '%c%c%c%c'!\n",fmt[0],fmt[1],fmt[2],fmt[3]); - else - MSG_ERR(" 0x%08X!\n",sh_audio->wtag); - MSG_HINT( MSGTR_TryUpgradeCodecsConfOrRTFM,get_path("codecs.conf")); - sh_audio=d_audio->sh=NULL; break; } if(mp_conf.audio_codec && strcmp(sh_audio->codec->codec_name,mp_conf.audio_codec)) continue; else if(mp_conf.audio_family && strcmp(sh_audio->codec->driver_name,mp_conf.audio_family)) continue; - MSG_V("%s audio codec: [%s] drv:%s (%s)\n",mp_conf.audio_codec?"Forcing":"Detected",sh_audio->codec->codec_name,sh_audio->codec->driver_name,sh_audio->codec->s_info); - break; + if(mpca_find_driver(sh_audio->codec->driver_name)) { + MSG_V("%s audio codec: [%s] drv:%s (%s)\n",mp_conf.audio_codec?"Forcing":"Detected",sh_audio->codec->codec_name,sh_audio->codec->driver_name,sh_audio->codec->s_info); + found=1; + break; + } } + if(!found) { + sh_audio->codec=find_ffmpeg_audio(sh_audio); + if(sh_audio->codec) found=1; + } + if(!found) { + const char *fmt; + MSG_ERR(MSGTR_CantFindAudioCodec); + fmt = (const char *)&sh_audio->wtag; + if(isprint(fmt[0]) && isprint(fmt[1]) && isprint(fmt[2]) && isprint(fmt[3])) + MSG_ERR(" '%c%c%c%c'!\n",fmt[0],fmt[1],fmt[2],fmt[3]); + else + MSG_ERR(" 0x%08X!\n",sh_audio->wtag); + MSG_HINT( MSGTR_TryUpgradeCodecsConfOrRTFM,get_path("codecs.conf")); + sh_audio=d_audio->sh=NULL; + } } static int mpxp_find_vcodec(void) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |