[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[403] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-11-18 12:13:22
|
Revision: 403 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=403&view=rev Author: nickols_k Date: 2012-11-18 12:13:12 +0000 (Sun, 18 Nov 2012) Log Message: ----------- more c++ sources + constantization Modified Paths: -------------- mplayerxp/Makefile mplayerxp/configure mplayerxp/input2/input.h mplayerxp/libmpcodecs/Makefile mplayerxp/libmpcodecs/ad.cpp mplayerxp/libmpcodecs/codecs_ld.h mplayerxp/libmpcodecs/libdca/Makefile mplayerxp/libmpcodecs/libdca/dca.h mplayerxp/libmpcodecs/vd.cpp mplayerxp/libmpcodecs/vd_internal.h mplayerxp/libmpconf/Makefile mplayerxp/libmpconf/cfgparser.h mplayerxp/libmpconf/codec-cfg.h mplayerxp/libmpconf/m_option.h mplayerxp/libmpconf/m_property.h mplayerxp/libmpconf/m_struct.h mplayerxp/libmpconf/subopt-helper.h mplayerxp/libmpdemux/Makefile mplayerxp/libmpdemux/cdd.h mplayerxp/libplaytree/Makefile mplayerxp/libplaytree/asxparser.cpp mplayerxp/libplaytree/asxparser.h mplayerxp/libplaytree/playtree.h mplayerxp/libplaytree/playtreeparser.h mplayerxp/mplayerxp.cpp mplayerxp/osdep/timer.h mplayerxp/postproc/Makefile mplayerxp/postproc/af.h mplayerxp/postproc/af_export.cpp mplayerxp/postproc/aflib.cpp mplayerxp/postproc/aflib.h mplayerxp/postproc/libmenu/Makefile mplayerxp/postproc/libmenu/menu.cpp mplayerxp/postproc/libmenu/menu.h mplayerxp/postproc/libmenu/menu_list.h mplayerxp/postproc/postprocess.h mplayerxp/postproc/swscale.h mplayerxp/postproc/vf.h mplayerxp/postproc/vf_scale.h mplayerxp/xmpcore/mp_aframe.cpp mplayerxp/xmpcore/mp_aframe.h Added Paths: ----------- mplayerxp/libmpcodecs/ad_dca.cpp mplayerxp/libmpcodecs/ad_faad.cpp mplayerxp/libmpcodecs/ad_ffmpeg.cpp mplayerxp/libmpcodecs/libdca/bitstream.cpp mplayerxp/libmpcodecs/libdca/downmix.cpp mplayerxp/libmpcodecs/libdca/parse.cpp mplayerxp/libmpcodecs/libdca/resample.cpp mplayerxp/libmpcodecs/libdca/resample_c.h mplayerxp/libmpcodecs/libdca/resample_mmx.h mplayerxp/libmpcodecs/vd_ffmpeg.cpp mplayerxp/libmpconf/codec-cfg.cpp mplayerxp/libmpconf/m_option.cpp mplayerxp/libmpconf/m_property.cpp mplayerxp/libmpconf/m_struct.cpp mplayerxp/libmpconf/subopt-helper.cpp mplayerxp/libmpdemux/cdda.cpp mplayerxp/libmpdemux/cddb.cpp mplayerxp/libmpdemux/mpdemux.cpp mplayerxp/libplaytree/playtree.cpp mplayerxp/libplaytree/playtreeparser.cpp mplayerxp/postproc/af_ao2.cpp mplayerxp/postproc/af_channels.cpp mplayerxp/postproc/af_crystality.cpp mplayerxp/postproc/af_delay.cpp mplayerxp/postproc/af_dyn.cpp mplayerxp/postproc/af_echo3d.cpp mplayerxp/postproc/af_equalizer.cpp mplayerxp/postproc/af_extrastereo.cpp mplayerxp/postproc/af_ffenc.cpp mplayerxp/postproc/af_format.cpp mplayerxp/postproc/af_hrtf.cpp mplayerxp/postproc/af_karaoke.cpp mplayerxp/postproc/af_lp.cpp mplayerxp/postproc/af_null.cpp mplayerxp/postproc/af_pan.cpp mplayerxp/postproc/af_raw.cpp mplayerxp/postproc/af_resample.cpp mplayerxp/postproc/af_scaletempo.cpp mplayerxp/postproc/af_sinesuppress.cpp mplayerxp/postproc/af_sub.cpp mplayerxp/postproc/af_surround.cpp mplayerxp/postproc/af_tools.cpp mplayerxp/postproc/af_volnorm.cpp mplayerxp/postproc/af_volume.cpp mplayerxp/postproc/libmenu/menu_cmdlist.cpp mplayerxp/postproc/libmenu/menu_console.cpp mplayerxp/postproc/libmenu/menu_filesel.cpp mplayerxp/postproc/libmenu/menu_list.cpp mplayerxp/postproc/libmenu/menu_param.cpp mplayerxp/postproc/libmenu/menu_pt.cpp mplayerxp/postproc/libmenu/menu_txt.cpp mplayerxp/postproc/postprocess.cpp mplayerxp/postproc/swscale.cpp mplayerxp/postproc/vf_1bpp.cpp mplayerxp/postproc/vf_2xsai.cpp mplayerxp/postproc/vf_aspect.cpp mplayerxp/postproc/vf_delogo.cpp mplayerxp/postproc/vf_denoise3d.cpp mplayerxp/postproc/vf_dint.cpp mplayerxp/postproc/vf_down3dright.cpp mplayerxp/postproc/vf_eq.cpp mplayerxp/postproc/vf_expand.cpp mplayerxp/postproc/vf_flip.cpp mplayerxp/postproc/vf_format.cpp mplayerxp/postproc/vf_framestep.cpp mplayerxp/postproc/vf_il.cpp mplayerxp/postproc/vf_menu.cpp mplayerxp/postproc/vf_mirror.cpp mplayerxp/postproc/vf_noise.cpp mplayerxp/postproc/vf_null.cpp mplayerxp/postproc/vf_ow.cpp mplayerxp/postproc/vf_palette.cpp mplayerxp/postproc/vf_panscan.cpp mplayerxp/postproc/vf_perspective.cpp mplayerxp/postproc/vf_pp.cpp mplayerxp/postproc/vf_raw.cpp mplayerxp/postproc/vf_rectangle.cpp mplayerxp/postproc/vf_rgb2bgr.cpp mplayerxp/postproc/vf_rotate.cpp mplayerxp/postproc/vf_scale.cpp mplayerxp/postproc/vf_smartblur.cpp mplayerxp/postproc/vf_softpulldown.cpp mplayerxp/postproc/vf_swapuv.cpp mplayerxp/postproc/vf_test.cpp mplayerxp/postproc/vf_unsharp.cpp mplayerxp/postproc/vf_vo.cpp mplayerxp/postproc/vf_yuvcsp.cpp mplayerxp/postproc/vf_yuy2.cpp mplayerxp/postproc/vf_yvu9.cpp Removed Paths: ------------- mplayerxp/libmpcodecs/ad_dca.c mplayerxp/libmpcodecs/ad_faad.c mplayerxp/libmpcodecs/ad_ffmpeg.c mplayerxp/libmpcodecs/libdca/bitstream.c mplayerxp/libmpcodecs/libdca/downmix.c mplayerxp/libmpcodecs/libdca/parse.c mplayerxp/libmpcodecs/libdca/resample.c mplayerxp/libmpcodecs/libdca/resample_c.c mplayerxp/libmpcodecs/libdca/resample_mmx.c mplayerxp/libmpcodecs/vd_ffmpeg.c mplayerxp/libmpconf/codec-cfg.c mplayerxp/libmpconf/m_option.c mplayerxp/libmpconf/m_property.c mplayerxp/libmpconf/m_struct.c mplayerxp/libmpconf/subopt-helper.c mplayerxp/libmpdemux/cdda.c mplayerxp/libmpdemux/cddb.c mplayerxp/libmpdemux/mpdemux.c mplayerxp/libplaytree/playtree.c mplayerxp/libplaytree/playtreeparser.c mplayerxp/postproc/af_ao2.c mplayerxp/postproc/af_channels.c mplayerxp/postproc/af_crystality.c mplayerxp/postproc/af_delay.c mplayerxp/postproc/af_dyn.c mplayerxp/postproc/af_echo3d.c mplayerxp/postproc/af_equalizer.c mplayerxp/postproc/af_extrastereo.c mplayerxp/postproc/af_ffenc.c mplayerxp/postproc/af_format.c mplayerxp/postproc/af_hrtf.c mplayerxp/postproc/af_karaoke.c mplayerxp/postproc/af_lp.c mplayerxp/postproc/af_null.c mplayerxp/postproc/af_pan.c mplayerxp/postproc/af_raw.c mplayerxp/postproc/af_resample.c mplayerxp/postproc/af_scaletempo.c mplayerxp/postproc/af_sinesuppress.c mplayerxp/postproc/af_sub.c mplayerxp/postproc/af_surround.c mplayerxp/postproc/af_tools.c mplayerxp/postproc/af_volnorm.c mplayerxp/postproc/af_volume.c mplayerxp/postproc/libmenu/menu_cmdlist.c mplayerxp/postproc/libmenu/menu_console.c mplayerxp/postproc/libmenu/menu_filesel.c mplayerxp/postproc/libmenu/menu_list.c mplayerxp/postproc/libmenu/menu_param.c mplayerxp/postproc/libmenu/menu_pt.c mplayerxp/postproc/libmenu/menu_txt.c mplayerxp/postproc/postprocess.c mplayerxp/postproc/swscale.c mplayerxp/postproc/vf_1bpp.c mplayerxp/postproc/vf_2xsai.c mplayerxp/postproc/vf_aspect.c mplayerxp/postproc/vf_delogo.c mplayerxp/postproc/vf_denoise3d.c mplayerxp/postproc/vf_dint.c mplayerxp/postproc/vf_down3dright.c mplayerxp/postproc/vf_eq.c mplayerxp/postproc/vf_expand.c mplayerxp/postproc/vf_flip.c mplayerxp/postproc/vf_format.c mplayerxp/postproc/vf_framestep.c mplayerxp/postproc/vf_il.c mplayerxp/postproc/vf_menu.c mplayerxp/postproc/vf_mirror.c mplayerxp/postproc/vf_noise.c mplayerxp/postproc/vf_null.c mplayerxp/postproc/vf_ow.c mplayerxp/postproc/vf_palette.c mplayerxp/postproc/vf_panscan.c mplayerxp/postproc/vf_perspective.c mplayerxp/postproc/vf_pp.c mplayerxp/postproc/vf_raw.c mplayerxp/postproc/vf_rectangle.c mplayerxp/postproc/vf_rgb2bgr.c mplayerxp/postproc/vf_rotate.c mplayerxp/postproc/vf_scale.c mplayerxp/postproc/vf_smartblur.c mplayerxp/postproc/vf_softpulldown.c mplayerxp/postproc/vf_swapuv.c mplayerxp/postproc/vf_test.c mplayerxp/postproc/vf_unsharp.c mplayerxp/postproc/vf_vo.c mplayerxp/postproc/vf_yuvcsp.c mplayerxp/postproc/vf_yuy2.c mplayerxp/postproc/vf_yvu9.c Modified: mplayerxp/Makefile =================================================================== --- mplayerxp/Makefile 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/Makefile 2012-11-18 12:13:12 UTC (rev 403) @@ -99,7 +99,7 @@ $(DO_MAKE) -rm -f *~ $(TARGET_EXE) $(OBJS) -rm -f *.o *.a .depend configure.log - -rm -f mp_config.h mp_config.mak version.h + -rm -f mp_config.h mp_config.mak mp_conf_lavc.h version.h -rm -f cpuinfo help_mp.h version.h: Modified: mplayerxp/configure =================================================================== --- mplayerxp/configure 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/configure 2012-11-18 12:13:12 UTC (rev 403) @@ -288,9 +288,12 @@ fi srcdir=`pwd` +cd .. +topdir=`pwd` +cd $srcdir + #checking for pkg-config test $($pkg_config --version 2>/dev/null) || die "no pkg-config found" - ############################################################################# enabled profile && disable fastcall print_config __USE mp_config.h mp_config.mak fastcall @@ -1117,6 +1120,31 @@ #include "nls/help_mp-en.h" EOF +echo "Creating mp_conf_lavc.h" +cat > mp_conf_lavc.h << EOF +#ifndef __MP_CONF_LAVC_H_INCLUDED__ +#define __MP_CONF_LAVC_H_INCLUDED__ 1 +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define UINT64_C __UINT64_C +#define FF_API_OLD_DECODE_AUDIO 1 +#include "$srcdir/../ffmpeg/libavcodec/avcodec.h" +#include "$srcdir/../ffmpeg/libpostproc/postprocess.h" +#include "$srcdir/../ffmpeg/libswscale/swscale.h" +#include "$srcdir/../ffmpeg/libswscale/rgb2rgb.h" +#include "$srcdir/../ffmpeg/libavutil/audioconvert.h" +#include "$srcdir/../ffmpeg/libswresample/swresample.h" +#include "$srcdir/../ffmpeg/libavformat/riff.h" + +#ifdef __cplusplus +} +#endif +#endif +EOF ############################################################################# #FIXME: add something like "Optimizing for: i686 mmx mmx2 sse" Modified: mplayerxp/input2/input.h =================================================================== --- mplayerxp/input2/input.h 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/input2/input.h 2012-11-18 12:13:12 UTC (rev 403) @@ -3,9 +3,6 @@ #include "mp_config.h" #include "xmpcore/xmp_enums.h" -#ifdef __cplusplus -extern "C" { -#endif // All commands id enum { MP_CMD_SEEK =0, @@ -155,14 +152,16 @@ extern any_t* RND_RENAME0(mp_input_open)(void); extern void mp_input_close(any_t* handle); -// Interruptible usleep: (used by libmpdemux) -extern MPXP_Rc mp_input_check_interrupt(any_t* handle,int time); - extern void mp_input_print_keys(any_t*handle); extern void mp_input_print_cmds(any_t*handle); extern void mp_input_print_binds(any_t*handle); #ifdef __cplusplus +extern "C" { +#endif +// Interruptible usleep: (used by libmpdemux) +extern MPXP_Rc mp_input_check_interrupt(any_t* handle,int time); +#ifdef __cplusplus } #endif #endif Modified: mplayerxp/libmpcodecs/Makefile =================================================================== --- mplayerxp/libmpcodecs/Makefile 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/libmpcodecs/Makefile 2012-11-18 12:13:12 UTC (rev 403) @@ -8,8 +8,9 @@ CXXSRCS=dec_video.cpp vd.cpp ad.cpp dec_audio.cpp CXXSRCS+=ad_a52.cpp ad_hwac3.cpp +CXXSRCS+=vd_ffmpeg.cpp ad_dca.cpp ad_faad.cpp ad_ffmpeg.cpp + SRCS=vd_null.c \ - vd_ffmpeg.c \ vd_raw.c \ vd_nuv.c \ vd_libmpeg2.c \ @@ -17,12 +18,9 @@ vd_mpegpes.c \ vd_huffyuv.c \ ad_null.c \ - ad_ffmpeg.c \ ad_mp3.c \ ad_pcm.c \ ad_dvdpcm.c \ - ad_faad.c \ - ad_dca.c \ codecs_ld.c ifeq ($(ENABLE_GPL_ONLY),no) Modified: mplayerxp/libmpcodecs/ad.cpp =================================================================== --- mplayerxp/libmpcodecs/ad.cpp 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/libmpcodecs/ad.cpp 2012-11-18 12:13:12 UTC (rev 403) @@ -90,6 +90,7 @@ unsigned i; const audio_probe_t* rv; for (i=0; mpcodecs_ad_drivers[i] != &mpcodecs_ad_null; i++) { + MSG_V("Probing: %s\n",mpcodecs_ad_drivers[i]->info->driver_name); if((rv=mpcodecs_ad_drivers[i]->probe(sh,sh->wtag))!=NULL) return rv; } return NULL; Deleted: mplayerxp/libmpcodecs/ad_dca.c =================================================================== --- mplayerxp/libmpcodecs/ad_dca.c 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/libmpcodecs/ad_dca.c 2012-11-18 12:13:12 UTC (rev 403) @@ -1,258 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#define __USE_XOPEN 1 -#include <unistd.h> -#include <assert.h> -#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ -#include "ad_internal.h" -#include "codecs_ld.h" - -#include "mp_config.h" -#include "mplayerxp.h" -#include "help_mp.h" -#include "osdep/cpudetect.h" - -#include "libdca/dca.h" -#include "osdep/mm_accel.h" -#include "mplayerxp.h" -#include "osdep/bswap.h" -#include "libao2/afmt.h" -#include "libao2/audio_out.h" -#include "postproc/af.h" -#include "osdep/mplib.h" - -#define MAX_AC5_FRAME 4096 - -dca_state_t* mpxp_dca_state; -uint32_t mpxp_dca_accel=0; -uint32_t mpxp_dca_flags=0; - -typedef struct priv_s { - float last_pts; -}priv_t; - - -static const ad_info_t info = { - "DTS Coherent Acoustics", - "libdca", - "Nickols_K", - "build-in" -}; - -static const config_t options[] = { - { NULL, NULL, 0, 0, 0, 0, NULL} -}; - -LIBAD_EXTERN(dca) - -static const audio_probe_t probes[] = { - { "libdca", "libdca", 0x86, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "libdca", "libdca", 0x2001, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "libdca", "libdca", FOURCC_TAG('D','T','S',' '), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "libdca", "libdca", FOURCC_TAG('D','T','S','B'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "libdca", "libdca", FOURCC_TAG('D','T','S','C'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "libdca", "libdca", FOURCC_TAG('D','T','S','E'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "libdca", "libdca", FOURCC_TAG('D','T','S','H'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "libdca", "libdca", FOURCC_TAG('D','T','S','L'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { NULL, NULL, 0x0, ACodecStatus_NotWorking, {AFMT_S8}} -}; - -static const audio_probe_t* __FASTCALL__ probe(sh_audio_t* sh,uint32_t wtag) { - unsigned i; - for(i=0;probes[i].driver;i++) - if(wtag==probes[i].wtag) - return &probes[i]; - return NULL; -} - -int dca_fillbuff(sh_audio_t *sh_audio,float *pts){ - int length=0,flen=0; - int flags=0; - int sample_rate=0; - int bit_rate=0; - float apts=0.,null_pts; - priv_t *priv=sh_audio->context; - - sh_audio->a_in_buffer_len=0; - /* sync frame:*/ - while(1){ - while(sh_audio->a_in_buffer_len<16){ - int c=demux_getc_r(sh_audio->ds,apts?&null_pts:&apts); - if(c<0) { priv->last_pts=*pts=apts; return -1; } /* EOF*/ - sh_audio->a_in_buffer[sh_audio->a_in_buffer_len++]=c; - } - length = dca_syncinfo (mpxp_dca_state,sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate, &flen); - if(length>=16 && length<=MAX_AC5_FRAME) break; /* we're done.*/ - /* bad file => resync*/ - memmove(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,15); - --sh_audio->a_in_buffer_len; - apts=0; - } - MSG_DBG2("dca[%08X]: len=%d flags=0x%X %d Hz %d bit/s frame=%u\n",*((long *)sh_audio->a_in_buffer),length,flags,sample_rate,bit_rate,flen); - sh_audio->rate=sample_rate; - sh_audio->i_bps=bit_rate/8; - demux_read_data_r(sh_audio->ds,sh_audio->a_in_buffer+16,length-16,apts?&null_pts:&apts); - priv->last_pts=*pts=apts; - - return length; -} - -/* returns: number of available channels*/ -static int dca_printinfo(sh_audio_t *sh_audio){ - int flags, sample_rate, bit_rate,flen,length; - char* mode="unknown"; - int channels=0; - length=dca_syncinfo (mpxp_dca_state,sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate,&flen); - switch(flags&DCA_CHANNEL_MASK){ - case DCA_CHANNEL: mode="channel"; channels=2; break; - case DCA_MONO: mode="mono"; channels=1; break; - case DCA_STEREO: mode="stereo"; channels=2; break; - case DCA_3F: mode="3f"; channels=3;break; - case DCA_2F1R: mode="2f+1r"; channels=3;break; - case DCA_3F1R: mode="3f+1r"; channels=4;break; - case DCA_2F2R: mode="2f+2r"; channels=4;break; - case DCA_3F2R: mode="3f+2r"; channels=5;break; - case DCA_4F2R: mode="4f+2r"; channels=6;break; - case DCA_DOLBY: mode="dolby"; channels=2; break; - default: channels=0; break; - } - MSG_INFO("DCA: %d.%d (%s%s) %d Hz %3.1f kbit/s Out: %u-bit\n", - channels, (flags&DCA_LFE)?1:0, - mode, (flags&DCA_LFE)?"+lfe":"", - sample_rate, bit_rate*0.001f, - afmt2bps(sh_audio->afmt)*8); - return (flags&DCA_LFE) ? (channels+1) : channels; -} - - -MPXP_Rc preinit(sh_audio_t *sh) -{ - /* DTS audio: - however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ -#ifdef WORDS_BIGENDIAN -#define DCA_FMT32 AFMT_S32_BE -#define DCA_FMT24 AFMT_S24_BE -#else -#define DCA_FMT32 AFMT_S32_LE -#define DCA_FMT24 AFMT_S24_LE -#endif - sh->afmt=bps2afmt(2); - if( af_query_fmt(sh->afilter,AFMT_FLOAT32) == MPXP_Ok|| - af_query_fmt(sh->afilter,DCA_FMT32) == MPXP_Ok || - af_query_fmt(sh->afilter,DCA_FMT24) == MPXP_Ok) - { - sh->afmt=AFMT_FLOAT32; - } - sh->audio_out_minsize=mp_conf.ao_channels*afmt2bps(sh->afmt)*256*8; - sh->audio_in_minsize=MAX_AC5_FRAME; - sh->context=mp_malloc(sizeof(priv_t)); - return MPXP_Ok; -} - -MPXP_Rc init(sh_audio_t *sh_audio) -{ - sample_t level=1, bias=384; - float pts; - int flags=0; - /* Dolby AC3 audio:*/ - mpxp_dca_accel = MPXPCtx->mplayer_accel; - mpxp_dca_state = dca_init(mpxp_dca_accel); - if (mpxp_dca_state == NULL) { - MSG_ERR("dca init failed\n"); - return MPXP_False; - } - if(dca_fillbuff(sh_audio,&pts)<0){ - MSG_ERR("dca sync failed\n"); - return MPXP_False; - } - /* 'dca cannot upmix' hotfix:*/ - dca_printinfo(sh_audio); - sh_audio->nch=mp_conf.ao_channels; - while(sh_audio->nch>0){ - switch(sh_audio->nch){ - case 1: mpxp_dca_flags=DCA_MONO; break; - case 2: mpxp_dca_flags=DCA_STEREO; break; -/* case 2: mpxp_dca_flags=DCA_DOLBY; break; */ -/* case 3: mpxp_dca_flags=DCA_3F; break; */ - case 3: mpxp_dca_flags=DCA_2F1R; break; - case 4: mpxp_dca_flags=DCA_2F2R; break; /* 2+2*/ - case 5: mpxp_dca_flags=DCA_3F2R; break; - case 6: mpxp_dca_flags=DCA_3F2R|DCA_LFE; break; /* 5.1*/ - } - /* test:*/ - flags=mpxp_dca_flags|DCA_ADJUST_LEVEL; - MSG_V("dca flags before dca_frame: 0x%X\n",flags); - if (dca_frame (mpxp_dca_state, sh_audio->a_in_buffer, &flags, &level, bias)){ - MSG_ERR("dca: error decoding frame -> nosound\n"); - return MPXP_False; - } - MSG_V("dca flags after dca_frame: 0x%X\n",flags); - if(afmt2bps(sh_audio->afmt)==4) { - if(dca_resample_init_float(mpxp_dca_state,mpxp_dca_accel,flags,sh_audio->nch)) break; - } else { - if(dca_resample_init(mpxp_dca_state,mpxp_dca_accel,flags,sh_audio->nch)) break; - } - --sh_audio->nch; /* try to decrease no. of channels*/ - } - if(sh_audio->nch<=0){ - MSG_ERR("dca: no resampler. try different channel setup!\n"); - return MPXP_False; - } - return MPXP_Ok; -} - -void uninit(sh_audio_t *sh) -{ - mp_free(sh->context); -} - -MPXP_Rc control(sh_audio_t *sh,int cmd,any_t* arg, ...) -{ - UNUSED(arg); - switch(cmd) { - case ADCTRL_RESYNC_STREAM: - sh->a_in_buffer_len=0; // reset ACM/DShow audio buffer - return MPXP_True; - case ADCTRL_SKIP_FRAME: { - float pts; - dca_fillbuff(sh,&pts); // skip AC3 frame - return MPXP_True; - } - default: - return MPXP_Unknown; - } - return MPXP_Unknown; -} - -unsigned decode(sh_audio_t *sh_audio,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) -{ - sample_t level=1, bias=384; - unsigned i,nblocks,flags=mpxp_dca_flags|DCA_ADJUST_LEVEL; - unsigned len=0; - priv_t *priv=sh_audio->context; - UNUSED(minlen); - UNUSED(maxlen); - if(!sh_audio->a_in_buffer_len) { - if(dca_fillbuff(sh_audio,pts)<0) return len; /* EOF */ - } - else *pts=priv->last_pts; - sh_audio->a_in_buffer_len=0; - if (dca_frame (mpxp_dca_state, sh_audio->a_in_buffer, &flags, &level, bias)!=0){ - MSG_WARN("dca: error decoding frame\n"); - return len; - } -// dca_dynrng(&mpxp_dca_state, NULL, NULL); - len=0; - nblocks=dca_blocks_num(mpxp_dca_state); - for (i = 0; i < nblocks; i++) { - if (dca_block (mpxp_dca_state)){ - MSG_WARN("dca: error at deblock\n"); - break; - } - if(afmt2bps(sh_audio->afmt)==4) - len+=4*dca_resample32(dca_samples(mpxp_dca_state),(float *)&buf[len]); - else - len+=2*dca_resample(dca_samples(mpxp_dca_state),(int16_t *)&buf[len]); - } - return len; -} Copied: mplayerxp/libmpcodecs/ad_dca.cpp (from rev 374, mplayerxp/libmpcodecs/ad_dca.c) =================================================================== --- mplayerxp/libmpcodecs/ad_dca.cpp (rev 0) +++ mplayerxp/libmpcodecs/ad_dca.cpp 2012-11-18 12:13:12 UTC (rev 403) @@ -0,0 +1,258 @@ +#include <stdio.h> +#include <stdlib.h> +#define __USE_XOPEN 1 +#include <unistd.h> +#include <assert.h> +#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ +#include "ad_internal.h" +#include "codecs_ld.h" + +#include "mp_config.h" +#include "mplayerxp.h" +#include "help_mp.h" +#include "osdep/cpudetect.h" + +#include "libdca/dca.h" +#include "osdep/mm_accel.h" +#include "mplayerxp.h" +#include "osdep/bswap.h" +#include "libao2/afmt.h" +#include "libao2/audio_out.h" +#include "postproc/af.h" +#include "osdep/mplib.h" + +#define MAX_AC5_FRAME 4096 + +dca_state_t* mpxp_dca_state; +uint32_t mpxp_dca_accel=0; +uint32_t mpxp_dca_flags=0; + +typedef struct priv_s { + float last_pts; +}priv_t; + + +static const ad_info_t info = { + "DTS Coherent Acoustics", + "libdca", + "Nickols_K", + "build-in" +}; + +static const config_t options[] = { + { NULL, NULL, 0, 0, 0, 0, NULL} +}; + +LIBAD_EXTERN(dca) + +static const audio_probe_t probes[] = { + { "libdca", "libdca", 0x86, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "libdca", "libdca", 0x2001, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "libdca", "libdca", FOURCC_TAG('D','T','S',' '), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "libdca", "libdca", FOURCC_TAG('D','T','S','B'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "libdca", "libdca", FOURCC_TAG('D','T','S','C'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "libdca", "libdca", FOURCC_TAG('D','T','S','E'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "libdca", "libdca", FOURCC_TAG('D','T','S','H'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "libdca", "libdca", FOURCC_TAG('D','T','S','L'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { NULL, NULL, 0x0, ACodecStatus_NotWorking, {AFMT_S8}} +}; + +static const audio_probe_t* __FASTCALL__ probe(sh_audio_t* sh,uint32_t wtag) { + unsigned i; + for(i=0;probes[i].driver;i++) + if(wtag==probes[i].wtag) + return &probes[i]; + return NULL; +} + +int dca_fillbuff(sh_audio_t *sh_audio,float *pts){ + int length=0,flen=0; + int flags=0; + int sample_rate=0; + int bit_rate=0; + float apts=0.,null_pts; + priv_t *priv=reinterpret_cast<priv_t*>(sh_audio->context); + + sh_audio->a_in_buffer_len=0; + /* sync frame:*/ + while(1){ + while(sh_audio->a_in_buffer_len<16){ + int c=demux_getc_r(sh_audio->ds,apts?&null_pts:&apts); + if(c<0) { priv->last_pts=*pts=apts; return -1; } /* EOF*/ + sh_audio->a_in_buffer[sh_audio->a_in_buffer_len++]=c; + } + length = dca_syncinfo (mpxp_dca_state,reinterpret_cast<uint8_t*>(sh_audio->a_in_buffer), reinterpret_cast<int *>(&flags), &sample_rate, &bit_rate, &flen); + if(length>=16 && length<=MAX_AC5_FRAME) break; /* we're done.*/ + /* bad file => resync*/ + memmove(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,15); + --sh_audio->a_in_buffer_len; + apts=0; + } + MSG_DBG2("dca[%08X]: len=%d flags=0x%X %d Hz %d bit/s frame=%u\n",*((long *)sh_audio->a_in_buffer),length,flags,sample_rate,bit_rate,flen); + sh_audio->rate=sample_rate; + sh_audio->i_bps=bit_rate/8; + demux_read_data_r(sh_audio->ds,reinterpret_cast<unsigned char*>(sh_audio->a_in_buffer+16),length-16,apts?&null_pts:&apts); + priv->last_pts=*pts=apts; + + return length; +} + +/* returns: number of available channels*/ +static int dca_printinfo(sh_audio_t *sh_audio){ + int flags, sample_rate, bit_rate,flen,length; + const char* mode="unknown"; + int channels=0; + length=dca_syncinfo (mpxp_dca_state,reinterpret_cast<uint8_t*>(sh_audio->a_in_buffer), reinterpret_cast<int*>(&flags), &sample_rate, &bit_rate,&flen); + switch(flags&DCA_CHANNEL_MASK){ + case DCA_CHANNEL: mode="channel"; channels=2; break; + case DCA_MONO: mode="mono"; channels=1; break; + case DCA_STEREO: mode="stereo"; channels=2; break; + case DCA_3F: mode="3f"; channels=3;break; + case DCA_2F1R: mode="2f+1r"; channels=3;break; + case DCA_3F1R: mode="3f+1r"; channels=4;break; + case DCA_2F2R: mode="2f+2r"; channels=4;break; + case DCA_3F2R: mode="3f+2r"; channels=5;break; + case DCA_4F2R: mode="4f+2r"; channels=6;break; + case DCA_DOLBY: mode="dolby"; channels=2; break; + default: channels=0; break; + } + MSG_INFO("DCA: %d.%d (%s%s) %d Hz %3.1f kbit/s Out: %u-bit\n", + channels, (flags&DCA_LFE)?1:0, + mode, (flags&DCA_LFE)?"+lfe":"", + sample_rate, bit_rate*0.001f, + afmt2bps(sh_audio->afmt)*8); + return (flags&DCA_LFE) ? (channels+1) : channels; +} + + +MPXP_Rc preinit(sh_audio_t *sh) +{ + /* DTS audio: + however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ +#ifdef WORDS_BIGENDIAN +#define DCA_FMT32 AFMT_S32_BE +#define DCA_FMT24 AFMT_S24_BE +#else +#define DCA_FMT32 AFMT_S32_LE +#define DCA_FMT24 AFMT_S24_LE +#endif + sh->afmt=bps2afmt(2); + if( af_query_fmt(sh->afilter,mpaf_format_decode(AFMT_FLOAT32)) == MPXP_Ok|| + af_query_fmt(sh->afilter,mpaf_format_decode(DCA_FMT32)) == MPXP_Ok || + af_query_fmt(sh->afilter,mpaf_format_decode(DCA_FMT24)) == MPXP_Ok) + { + sh->afmt=AFMT_FLOAT32; + } + sh->audio_out_minsize=mp_conf.ao_channels*afmt2bps(sh->afmt)*256*8; + sh->audio_in_minsize=MAX_AC5_FRAME; + sh->context=mp_malloc(sizeof(priv_t)); + return MPXP_Ok; +} + +MPXP_Rc init(sh_audio_t *sh_audio) +{ + sample_t level=1, bias=384; + float pts; + int flags=0; + /* Dolby AC3 audio:*/ + mpxp_dca_accel = MPXPCtx->mplayer_accel; + mpxp_dca_state = dca_init(mpxp_dca_accel); + if (mpxp_dca_state == NULL) { + MSG_ERR("dca init failed\n"); + return MPXP_False; + } + if(dca_fillbuff(sh_audio,&pts)<0){ + MSG_ERR("dca sync failed\n"); + return MPXP_False; + } + /* 'dca cannot upmix' hotfix:*/ + dca_printinfo(sh_audio); + sh_audio->nch=mp_conf.ao_channels; + while(sh_audio->nch>0){ + switch(sh_audio->nch){ + case 1: mpxp_dca_flags=DCA_MONO; break; + case 2: mpxp_dca_flags=DCA_STEREO; break; +/* case 2: mpxp_dca_flags=DCA_DOLBY; break; */ +/* case 3: mpxp_dca_flags=DCA_3F; break; */ + case 3: mpxp_dca_flags=DCA_2F1R; break; + case 4: mpxp_dca_flags=DCA_2F2R; break; /* 2+2*/ + case 5: mpxp_dca_flags=DCA_3F2R; break; + case 6: mpxp_dca_flags=DCA_3F2R|DCA_LFE; break; /* 5.1*/ + } + /* test:*/ + flags=mpxp_dca_flags|DCA_ADJUST_LEVEL; + MSG_V("dca flags before dca_frame: 0x%X\n",flags); + if (dca_frame (mpxp_dca_state, reinterpret_cast<uint8_t*>(sh_audio->a_in_buffer), reinterpret_cast<int*>(&flags), &level, bias)){ + MSG_ERR("dca: error decoding frame -> nosound\n"); + return MPXP_False; + } + MSG_V("dca flags after dca_frame: 0x%X\n",flags); + if(afmt2bps(sh_audio->afmt)==4) { + if(dca_resample_init_float(mpxp_dca_state,mpxp_dca_accel,flags,sh_audio->nch)) break; + } else { + if(dca_resample_init(mpxp_dca_state,mpxp_dca_accel,flags,sh_audio->nch)) break; + } + --sh_audio->nch; /* try to decrease no. of channels*/ + } + if(sh_audio->nch<=0){ + MSG_ERR("dca: no resampler. try different channel setup!\n"); + return MPXP_False; + } + return MPXP_Ok; +} + +void uninit(sh_audio_t *sh) +{ + mp_free(sh->context); +} + +MPXP_Rc control(sh_audio_t *sh,int cmd,any_t* arg, ...) +{ + UNUSED(arg); + switch(cmd) { + case ADCTRL_RESYNC_STREAM: + sh->a_in_buffer_len=0; // reset ACM/DShow audio buffer + return MPXP_True; + case ADCTRL_SKIP_FRAME: { + float pts; + dca_fillbuff(sh,&pts); // skip AC3 frame + return MPXP_True; + } + default: + return MPXP_Unknown; + } + return MPXP_Unknown; +} + +unsigned decode(sh_audio_t *sh_audio,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +{ + sample_t level=1, bias=384; + unsigned i,nblocks,flags=mpxp_dca_flags|DCA_ADJUST_LEVEL; + unsigned len=0; + priv_t *priv=reinterpret_cast<priv_t *>(sh_audio->context); + UNUSED(minlen); + UNUSED(maxlen); + if(!sh_audio->a_in_buffer_len) { + if(dca_fillbuff(sh_audio,pts)<0) return len; /* EOF */ + } + else *pts=priv->last_pts; + sh_audio->a_in_buffer_len=0; + if (dca_frame (mpxp_dca_state, reinterpret_cast<uint8_t *>(sh_audio->a_in_buffer), reinterpret_cast<int *>(&flags), &level, bias)!=0){ + MSG_WARN("dca: error decoding frame\n"); + return len; + } +// dca_dynrng(&mpxp_dca_state, NULL, NULL); + len=0; + nblocks=dca_blocks_num(mpxp_dca_state); + for (i = 0; i < nblocks; i++) { + if (dca_block (mpxp_dca_state)){ + MSG_WARN("dca: error at deblock\n"); + break; + } + if(afmt2bps(sh_audio->afmt)==4) + len+=4*dca_resample32(dca_samples(mpxp_dca_state),(float *)&buf[len]); + else + len+=2*dca_resample(dca_samples(mpxp_dca_state),(int16_t *)&buf[len]); + } + return len; +} Deleted: mplayerxp/libmpcodecs/ad_faad.c =================================================================== --- mplayerxp/libmpcodecs/ad_faad.c 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/libmpcodecs/ad_faad.c 2012-11-18 12:13:12 UTC (rev 403) @@ -1,359 +0,0 @@ -/* ad_faad.c - MPlayer AAC decoder using libfaad2 - * This file is part of MPlayer, see http://mplayerhq.hu/ for info. - * (c)2002 by Felix Buenemann <atmosfear at users.sourceforge.net> - * File licensed under the GPL, see http://www.fsf.org/ for more info. - */ -#include "mp_config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ -#include "help_mp.h" -#include "osdep/bswap.h" -#include "codecs_ld.h" -#include "mp_config.h" -#include "ad_internal.h" -#include "mplayerxp.h" -#include "osdep/cpudetect.h" -#include "osdep/mm_accel.h" -#include "osdep/mplib.h" -#include "libao2/afmt.h" -#include "libao2/audio_out.h" -#include "postproc/af.h" - -static const ad_info_t info = { - "AAC (MPEG2/4 Advanced Audio Coding)", - "faad", - "Felix Buenemann", - "http://www.audiocoding.com/faad2.html" -}; - -static const config_t options[] = { - { NULL, NULL, 0, 0, 0, 0, NULL} -}; - -LIBAD_EXTERN(faad) - -typedef struct faad_priv_s { - float pts; -}priv_t; - -static const audio_probe_t probes[] = { - { "faad", "libfaad", 0xFF, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", 0x4143, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", 0x706D, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", 0xA106, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", 0xAAC0, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('A','A','C',' '), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('A','A','C','P'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('M','P','4','A'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('M','P','4','L'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('M','P','4','A'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('R','A','A','C'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('R','A','A','P'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { "faad", "libfaad", FOURCC_TAG('V','L','B',' '), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, - { NULL, NULL, 0x0, ACodecStatus_NotWorking, {AFMT_S8}} -}; - -static const audio_probe_t* __FASTCALL__ probe(sh_audio_t* sh,uint32_t wtag) { - unsigned i; - for(i=0;probes[i].driver;i++) - if(wtag==probes[i].wtag) - return &probes[i]; - return NULL; -} - -typedef any_t*NeAACDecHandle; -typedef struct NeAACDecConfiguration { - unsigned char defObjectType; - unsigned long defSampleRate; - unsigned char outputFormat; - unsigned char downMatrix; - unsigned char useOldADTSFormat; - unsigned char dontUpSampleImplicitSBR; -} NeAACDecConfiguration, *NeAACDecConfigurationPtr; -struct NeAACDecFrameInfo; - -typedef struct NeAACDecFrameInfo { - unsigned long bytesconsumed; - unsigned long samples; - unsigned char channels; - unsigned char error; - unsigned long samplerate; - - /* SBR: 0: off, 1: on; upsample, 2: on; downsampled, 3: off; upsampled */ - unsigned char sbr; - - /* MPEG-4 ObjectType */ - unsigned char object_type; - - /* AAC header type; MP4 will be signalled as RAW also */ - unsigned char header_type; - - /* multichannel configuration */ - unsigned char num_front_channels; - unsigned char num_side_channels; - unsigned char num_back_channels; - unsigned char num_lfe_channels; - unsigned char channel_position[64]; - - /* PS: 0: off, 1: on */ - unsigned char ps; -} NeAACDecFrameInfo; -#define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */ -/* configure maximum supported channels, * - * this is theoretically max. 64 chans */ -#define FAAD_MAX_CHANNELS 6 -#define FAAD_BUFFLEN (FAAD_MIN_STREAMSIZE*FAAD_MAX_CHANNELS) -#ifdef _WIN32 - #pragma pack(push, 8) - #ifndef NEAACDECAPI - #define NEAACDECAPI __cdecl - #endif -#else - #ifndef NEAACDECAPI - #define NEAACDECAPI - #endif -#endif -/* library output formats */ -#define FAAD_FMT_16BIT 1 -#define FAAD_FMT_24BIT 2 -#define FAAD_FMT_32BIT 3 -#define FAAD_FMT_FLOAT 4 -#define FAAD_FMT_FIXED FAAD_FMT_FLOAT -#define FAAD_FMT_DOUBLE 5 - - -static NeAACDecHandle (*NEAACDECAPI NeAACDecOpen_ptr)(unsigned); -#define NeAACDecOpen(a) (*NeAACDecOpen_ptr)(a) -static NeAACDecConfigurationPtr (*NEAACDECAPI NeAACDecGetCurrentConfiguration_ptr)(NeAACDecHandle hDecoder); -#define NeAACDecGetCurrentConfiguration(a) (*NeAACDecGetCurrentConfiguration_ptr)(a) -static unsigned char NEAACDECAPI (*NeAACDecSetConfiguration_ptr)(NeAACDecHandle hDecoder, - NeAACDecConfigurationPtr config); -#define NeAACDecSetConfiguration(a,b) (*NeAACDecSetConfiguration_ptr)(a,b) -static long (*NEAACDECAPI NeAACDecInit_ptr)(NeAACDecHandle hDecoder, - unsigned char *buffer, - unsigned long buffer_size, - unsigned long *samplerate, - unsigned char *channels); -#define NeAACDecInit(a,b,c,d,e) (*NeAACDecInit_ptr)(a,b,c,d,e) -static char (*NEAACDECAPI NeAACDecInit2_ptr)(NeAACDecHandle hDecoder, unsigned char *pBuffer, - unsigned long SizeOfDecoderSpecificInfo, - unsigned long *samplerate, unsigned char *channels); -#define NeAACDecInit2(a,b,c,d,e) (*NeAACDecInit2_ptr)(a,b,c,d,e) - -static void (*NEAACDECAPI NeAACDecClose_ptr)(NeAACDecHandle hDecoder); -#define NeAACDecClose(a) (*NeAACDecClose_ptr)(a) -static any_t* (*NEAACDECAPI NeAACDecDecode_ptr)(NeAACDecHandle hDecoder, - NeAACDecFrameInfo *hInfo, - unsigned char *buffer, - unsigned long buffer_size); -#define NeAACDecDecode(a,b,c,d) (*NeAACDecDecode_ptr)(a,b,c,d) -static char* (*NEAACDECAPI NeAACDecGetErrorMessage_ptr)(unsigned char errcode); -#define NeAACDecGetErrorMessage(a) (*NeAACDecGetErrorMessage_ptr)(a) - -//#define AAC_DUMP_COMPRESSED - -static NeAACDecHandle NeAAC_hdec; -static NeAACDecFrameInfo NeAAC_finfo; - -static any_t*dll_handle; -static MPXP_Rc load_dll(const char *libname) -{ - if(!(dll_handle=ld_codec(libname,mpcodecs_ad_faad.info->url))) return 0; - NeAACDecOpen_ptr = ld_sym(dll_handle,"NeAACDecOpen"); - NeAACDecGetCurrentConfiguration_ptr = ld_sym(dll_handle,"NeAACDecGetCurrentConfiguration"); - NeAACDecSetConfiguration_ptr = ld_sym(dll_handle,"NeAACDecSetConfiguration"); - NeAACDecInit_ptr = ld_sym(dll_handle,"NeAACDecInit"); - NeAACDecInit2_ptr = ld_sym(dll_handle,"NeAACDecInit2"); - NeAACDecClose_ptr = ld_sym(dll_handle,"NeAACDecClose"); - NeAACDecDecode_ptr = ld_sym(dll_handle,"NeAACDecDecode"); - NeAACDecGetErrorMessage_ptr = ld_sym(dll_handle,"NeAACDecGetErrorMessage"); - return (NeAACDecOpen_ptr && NeAACDecGetCurrentConfiguration_ptr && - NeAACDecInit_ptr && NeAACDecInit2_ptr && NeAACDecGetCurrentConfiguration_ptr && - NeAACDecClose_ptr && NeAACDecDecode_ptr && NeAACDecGetErrorMessage_ptr)? - MPXP_Ok:MPXP_False; - -} - -static MPXP_Rc preinit(sh_audio_t *sh) -{ - sh->audio_out_minsize=8192*FAAD_MAX_CHANNELS; - sh->audio_in_minsize=FAAD_BUFFLEN; - if(!(sh->context=mp_malloc(sizeof(priv_t)))) return MPXP_False; - return load_dll("libfaad"SLIBSUFFIX); -} - -static MPXP_Rc init(sh_audio_t *sh) -{ - unsigned long NeAAC_samplerate; - unsigned char NeAAC_channels; - float pts; - int NeAAC_init; - NeAACDecConfigurationPtr NeAAC_conf; - if(!(NeAAC_hdec = NeAACDecOpen(MPXPCtx->mplayer_accel))) { - MSG_WARN("FAAD: Failed to open the decoder!\n"); // XXX: deal with cleanup! - return MPXP_False; - } - // If we don't get the ES descriptor, try manual config - if(!sh->codecdata_len && sh->wf) { - sh->codecdata_len = sh->wf->cbSize; - sh->codecdata = (char*)(sh->wf+1); - MSG_DBG2("FAAD: codecdata extracted from WAVEFORMATEX\n"); - } - NeAAC_conf = NeAACDecGetCurrentConfiguration(NeAAC_hdec); - if(sh->rate) NeAAC_conf->defSampleRate = sh->rate; -#ifdef WORDS_BIGENDIAN -#define NeAAC_FMT32 AFMT_S32_BE -#define NeAAC_FMT24 AFMT_S24_BE -#define NeAAC_FMT16 AFMT_S16_BE -#else -#define NeAAC_FMT32 AFMT_S32_LE -#define NeAAC_FMT24 AFMT_S24_LE -#define NeAAC_FMT16 AFMT_S16_LE -#endif - /* Set the maximal quality */ - /* This is useful for expesive audio cards */ - if(af_query_fmt(sh->afilter,AFMT_FLOAT32) == MPXP_Ok || - af_query_fmt(sh->afilter,NeAAC_FMT32) == MPXP_Ok || - af_query_fmt(sh->afilter,NeAAC_FMT24) == MPXP_Ok) { - sh->afmt=AFMT_FLOAT32; - NeAAC_conf->outputFormat=FAAD_FMT_FLOAT; - } else { - sh->afmt=NeAAC_FMT16; - NeAAC_conf->outputFormat=FAAD_FMT_16BIT; - } - /* Set the default object type and samplerate */ - NeAACDecSetConfiguration(NeAAC_hdec, NeAAC_conf); - if(!sh->codecdata_len) { - sh->a_in_buffer_len = demux_read_data_r(sh->ds, sh->a_in_buffer, sh->a_in_buffer_size,&pts); - /* init the codec */ - NeAAC_init = NeAACDecInit(NeAAC_hdec, sh->a_in_buffer, - sh->a_in_buffer_len, &NeAAC_samplerate, - &NeAAC_channels); - sh->a_in_buffer_len -= (NeAAC_init > 0)?NeAAC_init:0; // how many bytes init consumed - // XXX FIXME: shouldn't we memcpy() here in a_in_buffer ?? --A'rpi - } else { // We have ES DS in codecdata - NeAAC_init = NeAACDecInit2(NeAAC_hdec, sh->codecdata, - sh->codecdata_len, - &NeAAC_samplerate, - &NeAAC_channels); - } - if(NeAAC_init < 0) { - MSG_WARN("FAAD: Failed to initialize the decoder!\n"); // XXX: deal with cleanup! - NeAACDecClose(NeAAC_hdec); - // XXX: mp_free a_in_buffer here or in uninit? - return MPXP_False; - } else { - NeAAC_conf = NeAACDecGetCurrentConfiguration(NeAAC_hdec); - sh->nch = NeAAC_channels; - sh->rate = NeAAC_samplerate; - switch(NeAAC_conf->outputFormat){ - default: - case FAAD_FMT_16BIT: sh->afmt=bps2afmt(2); break; - case FAAD_FMT_24BIT: sh->afmt=bps2afmt(3); break; - case FAAD_FMT_FLOAT: - case FAAD_FMT_32BIT: sh->afmt=bps2afmt(4); break; - } - MSG_V("FAAD: Decoder init done (%dBytes)!\n", sh->a_in_buffer_len); // XXX: remove or move to debug! - MSG_V("FAAD: Negotiated samplerate: %dHz channels: %d bps: %d\n", NeAAC_samplerate, NeAAC_channels,afmt2bps(sh->afmt)); - //sh->o_bps = sh->samplesize*NeAAC_channels*NeAAC_samplerate; - if(!sh->i_bps) { - MSG_WARN("FAAD: compressed input bitrate missing, assuming 128kbit/s!\n"); - sh->i_bps = 128*1000/8; // XXX: HACK!!! ::atmos - } else MSG_V("FAAD: got %dkbit/s bitrate from MP4 header!\n",sh->i_bps*8/1000); - } - return MPXP_Ok; -} - -static void uninit(sh_audio_t *sh) -{ - MSG_V("FAAD: Closing decoder!\n"); - NeAACDecClose(NeAAC_hdec); - mp_free(sh->context); -} - -static MPXP_Rc control(sh_audio_t *sh,int cmd,any_t* arg, ...) -{ - UNUSED(sh); - UNUSED(cmd); - UNUSED(arg); - return MPXP_Unknown; -} - -static unsigned decode(sh_audio_t *sh,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) -{ - priv_t *priv=sh->context; - int j = 0; - unsigned len = 0; - any_t*NeAAC_sample_buffer; - UNUSED(maxlen); - while(len < minlen) { - - /* update buffer for raw aac streams: */ - if(!sh->codecdata_len) - { - if(sh->a_in_buffer_len < sh->a_in_buffer_size){ - sh->a_in_buffer_len += - demux_read_data_r(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len], - sh->a_in_buffer_size - sh->a_in_buffer_len,pts); - *pts=FIX_APTS(sh,*pts,-sh->a_in_buffer_len); - priv->pts=*pts; - } - else *pts=priv->pts; -#ifdef DUMP_AAC_COMPRESSED - {unsigned i; - for (i = 0; i < 16; i++) - printf ("%02X ", sh->a_in_buffer[i]); - printf ("\n");} -#endif - } - if(!sh->codecdata_len){ - // raw aac stream: - do { - NeAAC_sample_buffer = NeAACDecDecode(NeAAC_hdec, &NeAAC_finfo, sh->a_in_buffer+j, sh->a_in_buffer_len); - - /* update buffer index after NeAACDecDecode */ - if(NeAAC_finfo.bytesconsumed >= (unsigned)sh->a_in_buffer_len) { - sh->a_in_buffer_len=0; - } else { - sh->a_in_buffer_len-=NeAAC_finfo.bytesconsumed; - memcpy(sh->a_in_buffer,&sh->a_in_buffer[NeAAC_finfo.bytesconsumed],sh->a_in_buffer_len); - priv->pts=FIX_APTS(sh,priv->pts,NeAAC_finfo.bytesconsumed); - } - - if(NeAAC_finfo.error > 0) { - MSG_WARN("FAAD: error: %s, trying to resync!\n", - NeAACDecGetErrorMessage(NeAAC_finfo.error)); - j++; - } else - break; - } while(j < FAAD_BUFFLEN); - } else { - // packetized (.mp4) aac stream: - unsigned char* bufptr=NULL; - int buflen=ds_get_packet_r(sh->ds, &bufptr,pts); - if(buflen<=0) break; - NeAAC_sample_buffer = NeAACDecDecode(NeAAC_hdec, &NeAAC_finfo, bufptr, buflen); -// printf("NeAAC decoded %d of %d (err: %d) \n",NeAAC_finfo.bytesconsumed,buflen,NeAAC_finfo.error); - } - - if(NeAAC_finfo.error > 0) { - MSG_WARN("FAAD: Failed to decode frame: %s \n", - NeAACDecGetErrorMessage(NeAAC_finfo.error)); - } else if (NeAAC_finfo.samples == 0) { - MSG_DBG2("FAAD: Decoded zero samples!\n"); - } else { - /* XXX: samples already multiplied by channels! */ - MSG_DBG2("FAAD: Successfully decoded frame (%d Bytes)!\n", - afmt2bps(sh->afmt)*NeAAC_finfo.samples); - memcpy(buf+len,NeAAC_sample_buffer, afmt2bps(sh->afmt)*NeAAC_finfo.samples); - len += afmt2bps(sh->afmt)*NeAAC_finfo.samples; - //printf("FAAD: buffer: %d bytes consumed: %d \n", k, NeAAC_finfo.bytesconsumed); - } - } - return len; -} - Copied: mplayerxp/libmpcodecs/ad_faad.cpp (from rev 374, mplayerxp/libmpcodecs/ad_faad.c) =================================================================== --- mplayerxp/libmpcodecs/ad_faad.cpp (rev 0) +++ mplayerxp/libmpcodecs/ad_faad.cpp 2012-11-18 12:13:12 UTC (rev 403) @@ -0,0 +1,360 @@ +/* ad_faad.c - MPlayer AAC decoder using libfaad2 + * This file is part of MPlayer, see http://mplayerhq.hu/ for info. + * (c)2002 by Felix Buenemann <atmosfear at users.sourceforge.net> + * File licensed under the GPL, see http://www.fsf.org/ for more info. + */ +#include "mp_config.h" + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ +#include "help_mp.h" +#include "osdep/bswap.h" +#include "codecs_ld.h" +#include "mp_config.h" +#include "ad_internal.h" +#include "mplayerxp.h" +#include "osdep/cpudetect.h" +#include "osdep/mm_accel.h" +#include "osdep/mplib.h" +#include "libao2/afmt.h" +#include "libao2/audio_out.h" +#include "postproc/af.h" + +static const ad_info_t info = { + "AAC (MPEG2/4 Advanced Audio Coding)", + "faad", + "Felix Buenemann", + "http://www.audiocoding.com/faad2.html" +}; + +static const config_t options[] = { + { NULL, NULL, 0, 0, 0, 0, NULL} +}; + +LIBAD_EXTERN(faad) + +typedef struct faad_priv_s { + float pts; +}priv_t; + +static const audio_probe_t probes[] = { + { "faad", "libfaad", 0xFF, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", 0x4143, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", 0x706D, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", 0xA106, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", 0xAAC0, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('A','A','C',' '), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('A','A','C','P'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('M','P','4','A'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('M','P','4','L'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('M','P','4','A'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('R','A','A','C'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('R','A','A','P'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { "faad", "libfaad", FOURCC_TAG('V','L','B',' '), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, + { NULL, NULL, 0x0, ACodecStatus_NotWorking, {AFMT_S8}} +}; + +static const audio_probe_t* __FASTCALL__ probe(sh_audio_t* sh,uint32_t wtag) { + UNUSED(sh); + unsigned i; + for(i=0;probes[i].driver;i++) + if(wtag==probes[i].wtag) + return &probes[i]; + return NULL; +} + +typedef any_t*NeAACDecHandle; +typedef struct NeAACDecConfiguration { + unsigned char defObjectType; + unsigned long defSampleRate; + unsigned char outputFormat; + unsigned char downMatrix; + unsigned char useOldADTSFormat; + unsigned char dontUpSampleImplicitSBR; +} NeAACDecConfiguration, *NeAACDecConfigurationPtr; +struct NeAACDecFrameInfo; + +typedef struct NeAACDecFrameInfo { + unsigned long bytesconsumed; + unsigned long samples; + unsigned char channels; + unsigned char error; + unsigned long samplerate; + + /* SBR: 0: off, 1: on; upsample, 2: on; downsampled, 3: off; upsampled */ + unsigned char sbr; + + /* MPEG-4 ObjectType */ + unsigned char object_type; + + /* AAC header type; MP4 will be signalled as RAW also */ + unsigned char header_type; + + /* multichannel configuration */ + unsigned char num_front_channels; + unsigned char num_side_channels; + unsigned char num_back_channels; + unsigned char num_lfe_channels; + unsigned char channel_position[64]; + + /* PS: 0: off, 1: on */ + unsigned char ps; +} NeAACDecFrameInfo; +#define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */ +/* configure maximum supported channels, * + * this is theoretically max. 64 chans */ +#define FAAD_MAX_CHANNELS 6 +#define FAAD_BUFFLEN (FAAD_MIN_STREAMSIZE*FAAD_MAX_CHANNELS) +#ifdef _WIN32 + #pragma pack(push, 8) + #ifndef NEAACDECAPI + #define NEAACDECAPI __cdecl + #endif +#else + #ifndef NEAACDECAPI + #define NEAACDECAPI + #endif +#endif +/* library output formats */ +#define FAAD_FMT_16BIT 1 +#define FAAD_FMT_24BIT 2 +#define FAAD_FMT_32BIT 3 +#define FAAD_FMT_FLOAT 4 +#define FAAD_FMT_FIXED FAAD_FMT_FLOAT +#define FAAD_FMT_DOUBLE 5 + + +static NeAACDecHandle (*NEAACDECAPI NeAACDecOpen_ptr)(unsigned); +#define NeAACDecOpen(a) (*NeAACDecOpen_ptr)(a) +static NeAACDecConfigurationPtr (*NEAACDECAPI NeAACDecGetCurrentConfiguration_ptr)(NeAACDecHandle hDecoder); +#define NeAACDecGetCurrentConfiguration(a) (*NeAACDecGetCurrentConfiguration_ptr)(a) +static unsigned char NEAACDECAPI (*NeAACDecSetConfiguration_ptr)(NeAACDecHandle hDecoder, + NeAACDecConfigurationPtr config); +#define NeAACDecSetConfiguration(a,b) (*NeAACDecSetConfiguration_ptr)(a,b) +static long (*NEAACDECAPI NeAACDecInit_ptr)(NeAACDecHandle hDecoder, + unsigned char *buffer, + unsigned long buffer_size, + unsigned long *samplerate, + unsigned char *channels); +#define NeAACDecInit(a,b,c,d,e) (*NeAACDecInit_ptr)(a,b,c,d,e) +static char (*NEAACDECAPI NeAACDecInit2_ptr)(NeAACDecHandle hDecoder, unsigned char *pBuffer, + unsigned long SizeOfDecoderSpecificInfo, + unsigned long *samplerate, unsigned char *channels); +#define NeAACDecInit2(a,b,c,d,e) (*NeAACDecInit2_ptr)(a,b,c,d,e) + +static void (*NEAACDECAPI NeAACDecClose_ptr)(NeAACDecHandle hDecoder); +#define NeAACDecClose(a) (*NeAACDecClose_ptr)(a) +static any_t* (*NEAACDECAPI NeAACDecDecode_ptr)(NeAACDecHandle hDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size); +#define NeAACDecDecode(a,b,c,d) (*NeAACDecDecode_ptr)(a,b,c,d) +static char* (*NEAACDECAPI NeAACDecGetErrorMessage_ptr)(unsigned char errcode); +#define NeAACDecGetErrorMessage(a) (*NeAACDecGetErrorMessage_ptr)(a) + +//#define AAC_DUMP_COMPRESSED + +static NeAACDecHandle NeAAC_hdec; +static NeAACDecFrameInfo NeAAC_finfo; + +static any_t*dll_handle; +static MPXP_Rc load_dll(const char *libname) +{ + if(!(dll_handle=ld_codec(libname,mpcodecs_ad_faad.info->url))) return MPXP_False; + NeAACDecOpen_ptr = (any_t* (*)(unsigned))ld_sym(dll_handle,"NeAACDecOpen"); + NeAACDecGetCurrentConfiguration_ptr = (NeAACDecConfiguration* (*)(any_t*))ld_sym(dll_handle,"NeAACDecGetCurrentConfiguration"); + NeAACDecSetConfiguration_ptr = (unsigned char (*)(any_t*,NeAACDecConfiguration*))ld_sym(dll_handle,"NeAACDecSetConfiguration"); + NeAACDecInit_ptr = (long (*)(any_t*,unsigned char*,unsigned long,unsigned long*,unsigned char*))ld_sym(dll_handle,"NeAACDecInit"); + NeAACDecInit2_ptr = (char (*)(any_t*,unsigned char *,unsigned long,unsigned long*,unsigned char*))ld_sym(dll_handle,"NeAACDecInit2"); + NeAACDecClose_ptr = (void (*)(any_t*))ld_sym(dll_handle,"NeAACDecClose"); + NeAACDecDecode_ptr = (any_t* (*)(any_t*,NeAACDecFrameInfo*,unsigned char *,unsigned long))ld_sym(dll_handle,"NeAACDecDecode"); + NeAACDecGetErrorMessage_ptr = (char* (*)(unsigned char))ld_sym(dll_handle,"NeAACDecGetErrorMessage"); + return (NeAACDecOpen_ptr && NeAACDecGetCurrentConfiguration_ptr && + NeAACDecInit_ptr && NeAACDecInit2_ptr && NeAACDecGetCurrentConfiguration_ptr && + NeAACDecClose_ptr && NeAACDecDecode_ptr && NeAACDecGetErrorMessage_ptr)? + MPXP_Ok:MPXP_False; + +} + +static MPXP_Rc preinit(sh_audio_t *sh) +{ + sh->audio_out_minsize=8192*FAAD_MAX_CHANNELS; + sh->audio_in_minsize=FAAD_BUFFLEN; + if(!(sh->context=mp_malloc(sizeof(priv_t)))) return MPXP_False; + return load_dll("libfaad"SLIBSUFFIX); +} + +static MPXP_Rc init(sh_audio_t *sh) +{ + unsigned long NeAAC_samplerate; + unsigned char NeAAC_channels; + float pts; + int NeAAC_init; + NeAACDecConfigurationPtr NeAAC_conf; + if(!(NeAAC_hdec = NeAACDecOpen(MPXPCtx->mplayer_accel))) { + MSG_WARN("FAAD: Failed to open the decoder!\n"); // XXX: deal with cleanup! + return MPXP_False; + } + // If we don't get the ES descriptor, try manual config + if(!sh->codecdata_len && sh->wf) { + sh->codecdata_len = sh->wf->cbSize; + sh->codecdata = (unsigned char*)(sh->wf+1); + MSG_DBG2("FAAD: codecdata extracted from WAVEFORMATEX\n"); + } + NeAAC_conf = NeAACDecGetCurrentConfiguration(NeAAC_hdec); + if(sh->rate) NeAAC_conf->defSampleRate = sh->rate; +#ifdef WORDS_BIGENDIAN +#define NeAAC_FMT32 AFMT_S32_BE +#define NeAAC_FMT24 AFMT_S24_BE +#define NeAAC_FMT16 AFMT_S16_BE +#else +#define NeAAC_FMT32 AFMT_S32_LE +#define NeAAC_FMT24 AFMT_S24_LE +#define NeAAC_FMT16 AFMT_S16_LE +#endif + /* Set the maximal quality */ + /* This is useful for expesive audio cards */ + if(af_query_fmt(sh->afilter,mpaf_format_decode(AFMT_FLOAT32)) == MPXP_Ok || + af_query_fmt(sh->afilter,mpaf_format_decode(NeAAC_FMT32)) == MPXP_Ok || + af_query_fmt(sh->afilter,mpaf_format_decode(NeAAC_FMT24)) == MPXP_Ok) { + sh->afmt=AFMT_FLOAT32; + NeAAC_conf->outputFormat=FAAD_FMT_FLOAT; + } else { + sh->afmt=NeAAC_FMT16; + NeAAC_conf->outputFormat=FAAD_FMT_16BIT; + } + /* Set the default object type and samplerate */ + NeAACDecSetConfiguration(NeAAC_hdec, NeAAC_conf); + if(!sh->codecdata_len) { + sh->a_in_buffer_len = demux_read_data_r(sh->ds, reinterpret_cast<unsigned char*>(sh->a_in_buffer), sh->a_in_buffer_size,&pts); + /* init the codec */ + NeAAC_init = NeAACDecInit(NeAAC_hdec, reinterpret_cast<unsigned char*>(sh->a_in_buffer), + sh->a_in_buffer_len, &NeAAC_samplerate, + &NeAAC_channels); + sh->a_in_buffer_len -= (NeAAC_init > 0)?NeAAC_init:0; // how many bytes init consumed + // XXX FIXME: shouldn't we memcpy() here in a_in_buffer ?? --A'rpi + } else { // We have ES DS in codecdata + NeAAC_init = NeAACDecInit2(NeAAC_hdec, sh->codecdata, + sh->codecdata_len, + &NeAAC_samplerate, + &NeAAC_channels); + } + if(NeAAC_init < 0) { + MSG_WARN("FAAD: Failed to initialize the decoder!\n"); // XXX: deal with cleanup! + NeAACDecClose(NeAAC_hdec); + // XXX: mp_free a_in_buffer here or in uninit? + return MPXP_False; + } else { + NeAAC_conf = NeAACDecGetCurrentConfiguration(NeAAC_hdec); + sh->nch = NeAAC_channels; + sh->rate = NeAAC_samplerate; + switch(NeAAC_conf->outputFormat){ + default: + case FAAD_FMT_16BIT: sh->afmt=bps2afmt(2); break; + case FAAD_FMT_24BIT: sh->afmt=bps2afmt(3); break; + case FAAD_FMT_FLOAT: + case FAAD_FMT_32BIT: sh->afmt=bps2afmt(4); break; + } + MSG_V("FAAD: Decoder init done (%dBytes)!\n", sh->a_in_buffer_len); // XXX: remove or move to debug! + MSG_V("FAAD: Negotiated samplerate: %dHz channels: %d bps: %d\n", NeAAC_samplerate, NeAAC_channels,afmt2bps(sh->afmt)); + //sh->o_bps = sh->samplesize*NeAAC_channels*NeAAC_samplerate; + if(!sh->i_bps) { + MSG_WARN("FAAD: compressed input bitrate missing, assuming 128kbit/s!\n"); + sh->i_bps = 128*1000/8; // XXX: HACK!!! ::atmos + } else MSG_V("FAAD: got %dkbit/s bitrate from MP4 header!\n",sh->i_bps*8/1000); + } + return MPXP_Ok; +} + +static void uninit(sh_audio_t *sh) +{ + MSG_V("FAAD: Closing decoder!\n"); + NeAACDecClose(NeAAC_hdec); + mp_free(sh->context); +} + +static MPXP_Rc control(sh_audio_t *sh,int cmd,any_t* arg, ...) +{ + UNUSED(sh); + UNUSED(cmd); + UNUSED(arg); + return MPXP_Unknown; +} + +static unsigned decode(sh_audio_t *sh,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +{ + priv_t *priv=reinterpret_cast<priv_t*>(sh->context); + int j = 0; + unsigned len = 0; + any_t*NeAAC_sample_buffer; + UNUSED(maxlen); + while(len < minlen) { + + /* update buffer for raw aac streams: */ + if(!sh->codecdata_len) + { + if(sh->a_in_buffer_len < sh->a_in_buffer_size){ + sh->a_in_buffer_len += + demux_read_data_r(sh->ds,reinterpret_cast<unsigned char*>(&sh->a_in_buffer[sh->a_in_buffer_len]), + sh->a_in_buffer_size - sh->a_in_buffer_len,pts); + *pts=FIX_APTS(sh,*pts,-sh->a_in_buffer_len); + priv->pts=*pts; + } + else *pts=priv->pts; +#ifdef DUMP_AAC_COMPRESSED + {unsigned i; + for (i = 0; i < 16; i++) + printf ("%02X ", sh->a_in_buffer[i]); + printf ("\n");} +#endif + } + if(!sh->codecdata_len){ + // raw aac stream: + do { + NeAAC_sample_buffer = NeAACDecDecode(NeAAC_hdec, &NeAAC_finfo, reinterpret_cast<unsigned char *>(sh->a_in_buffer+j), sh->a_in_buffer_len); + + /* update buffer index after NeAACDecDecode */ + if(NeAAC_finfo.bytesconsumed >= (unsigned)sh->a_in_buffer_len) { + sh->a_in_buffer_len=0; + } else { + sh->a_in_buffer_len-=NeAAC_finfo.bytesconsumed; + memcpy(sh->a_in_buffer,&sh->a_in_buffer[NeAAC_finfo.bytesconsumed],sh->a_in_buffer_len); + priv->pts=FIX_APTS(sh,priv->pts,NeAAC_finfo.bytesconsumed); + } + + if(NeAAC_finfo.error > 0) { + MSG_WARN("FAAD: error: %s, trying to resync!\n", + NeAACDecGetErrorMessage(NeAAC_finfo.error)); + j++; + } else + break; + } while(j < FAAD_BUFFLEN); + } else { + // packetized (.mp4) aac stream: + unsigned char* bufptr=NULL; + int buflen=ds_get_packet_r(sh->ds, &bufptr,pts); + if(buflen<=0) break; + NeAAC_sample_buffer = NeAACDecDecode(NeAAC_hdec, &NeAAC_finfo, bufptr, buflen); +// printf("NeAAC decoded %d of %d (err: %d) \n",NeAAC_finfo.bytesconsumed,buflen,NeAAC_finfo.error); + } + + if(NeAAC_finfo.error > 0) { + MSG_WARN("FAAD: Failed to decode frame: %s \n", + NeAACDecGetErrorMessage(NeAAC_finfo.error)); + } else if (NeAAC_finfo.samples == 0) { + MSG_DBG2("FAAD: Decoded zero samples!\n"); + } else { + /* XXX: samples already multiplied by channels! */ + MSG_DBG2("FAAD: Successfully decoded frame (%d Bytes)!\n", + afmt2bps(sh->afmt)*NeAAC_finfo.samples); + memcpy(buf+len,NeAAC_sample_buffer, afmt2bps(sh->afmt)*NeAAC_finfo.samples); + len += afmt2bps(sh->afmt)*NeAAC_finfo.samples; + //printf("FAAD: buffer: %d bytes consumed: %d \n", k, NeAAC_finfo.bytesconsumed); + } + } + return len; +} + Deleted: mplayerxp/libmpcodecs/ad_ffmpeg.c =================================================================== --- mplayerxp/libmpcodecs/ad_ffmpeg.c 2012-11-18 06:17:26 UTC (rev 402) +++ mplayerxp/libmpcodecs/ad_ffmpeg.c 2012-11-18 12:13:12 UTC (rev 403) @@ -1,231 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#define __USE_GNU 1 -#define __USE_XOPEN 1 -#include <unistd.h> -#include <assert.h> -#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ -#include "libao2/afmt.h" -#include "ad_internal.h" - -#include "mp_config.h" -#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" - -typedef struct priv_s { - AVCodecContext *lavc_ctx; - audio_probe_t* probe; -}priv_t; - -static const audio_probe_t* __FASTCALL__ probe(sh_audio_t* sh,uint32_t wtag) { - unsigned i; - audio_probe_t* acodec = NULL; - const char *what="AVCodecID"; - priv_t* priv=sh->context; - enum AVCodecID id = ff_codec_get_id(ff_codec_wav_tags,wtag); - if (id <= 0) { - prn_err: - MSG_ERR("Cannot find %s for '0x%X' tag! Try force -ac option\n" - ,what - ,sh->wtag); - return NULL; - } - if(!priv){ - priv=mp_mallocz(sizeof(priv_t)); - sh->context=priv; -// avcodec_init(); - avcodec_register_all(); - } - AVCodec *codec=avcodec_find_decoder(id); - if(!codec) { what="AVCodec"; goto prn_err; } - - acodec=mp_mallocz(sizeof(audio_probe_t)); - acodec->codec_dll=mp_strdup(avcodec_get_name(id)); - acodec->driver="ffmpeg"; - acodec->wtag=wtag; - if(codec->sample_fmts) - for(i=0;i<Audio_MaxOutSample;i++) { - if(codec->sa... [truncated message content] |