[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[386] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-11-16 13:12:55
|
Revision: 386 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=386&view=rev Author: nickols_k Date: 2012-11-16 13:12:42 +0000 (Fri, 16 Nov 2012) Log Message: ----------- more C++ sources Modified Paths: -------------- mplayerxp/libmpcodecs/Makefile mplayerxp/libmpcodecs/ad_internal.h mplayerxp/libmpcodecs/liba52/Makefile mplayerxp/libmpcodecs/liba52/a52.h mplayerxp/libmpcodecs/liba52/a52_internal.h mplayerxp/libmpdemux/librtsp/Makefile mplayerxp/libmpdemux/librtsp/rtsp.h mplayerxp/libmpdemux/realrtsp/Makefile Added Paths: ----------- mplayerxp/libmpcodecs/ad_a52.cpp mplayerxp/libmpcodecs/ad_hwac3.cpp mplayerxp/libmpcodecs/liba52/bit_allocate.cpp mplayerxp/libmpcodecs/liba52/bitstream.cpp mplayerxp/libmpcodecs/liba52/crc.cpp mplayerxp/libmpcodecs/liba52/downmix.cpp mplayerxp/libmpcodecs/liba52/imdct.cpp mplayerxp/libmpcodecs/liba52/parse.cpp mplayerxp/libmpcodecs/liba52/resample.cpp mplayerxp/libmpcodecs/liba52/resample_c.h mplayerxp/libmpcodecs/liba52/resample_mmx.h mplayerxp/libmpdemux/librtsp/rtsp.cpp mplayerxp/libmpdemux/realrtsp/real.cpp mplayerxp/libmpdemux/realrtsp/xbuffer.cpp Removed Paths: ------------- mplayerxp/libmpcodecs/ad_a52.c mplayerxp/libmpcodecs/ad_hwac3.c mplayerxp/libmpcodecs/liba52/bit_allocate.c mplayerxp/libmpcodecs/liba52/bitstream.c mplayerxp/libmpcodecs/liba52/crc.c mplayerxp/libmpcodecs/liba52/downmix.c mplayerxp/libmpcodecs/liba52/imdct.c mplayerxp/libmpcodecs/liba52/parse.c mplayerxp/libmpcodecs/liba52/resample.c mplayerxp/libmpcodecs/liba52/resample_c.c mplayerxp/libmpcodecs/liba52/resample_mmx.c mplayerxp/libmpdemux/librtsp/rtsp.c mplayerxp/libmpdemux/realrtsp/real.c mplayerxp/libmpdemux/realrtsp/xbuffer.c Modified: mplayerxp/libmpcodecs/Makefile =================================================================== --- mplayerxp/libmpcodecs/Makefile 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/Makefile 2012-11-16 13:12:42 UTC (rev 386) @@ -6,6 +6,7 @@ DO_ALL = @ for i in $(SUBDIRS); do $(MAKE) -C $$i all || exit; done CXXSRCS=dec_video.cpp vd.cpp ad.cpp dec_audio.cpp +CXXSRCS+=ad_a52.cpp ad_hwac3.cpp SRCS=vd_null.c \ vd_ffmpeg.c \ @@ -18,11 +19,9 @@ ad_null.c \ ad_ffmpeg.c \ ad_mp3.c \ - ad_hwac3.c \ ad_pcm.c \ ad_dvdpcm.c \ ad_faad.c \ - ad_a52.c \ ad_dca.c \ codecs_ld.c Deleted: mplayerxp/libmpcodecs/ad_a52.c =================================================================== --- mplayerxp/libmpcodecs/ad_a52.c 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/ad_a52.c 2012-11-16 13:12:42 UTC (rev 386) @@ -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 "osdep/mm_accel.h" -#include "mplayerxp.h" -#include "liba52/a52.h" -#include "libao2/afmt.h" -#include "libao2/audio_out.h" -#include "postproc/af.h" - -typedef struct priv_s { - float last_pts; -}priv_t; - -#define MAX_AC3_FRAME 3840 - -a52_state_t* mpxp_a52_state; -uint32_t mpxp_a52_accel=0; -uint32_t mpxp_a52_flags=0; - -#include "osdep/bswap.h" -#include "osdep/mplib.h" - -static const ad_info_t info = -{ - "liba52 AC3 driver", - "liba52", - "Nickols_K", - "build-in" -}; - -static const config_t options[] = { - { NULL, NULL, 0, 0, 0, 0, NULL} -}; - -LIBAD_EXTERN(a52) - -static const audio_probe_t probes[] = { - { "liba52", "liba52", 0x2000, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, - { "liba52", "liba52", 0x20736D, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, - { "liba52", "liba52", FOURCC_TAG('A','C','_','3'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, - { "liba52", "liba52", FOURCC_TAG('D','N','E','T'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, - { "liba52", "liba52", FOURCC_TAG('S','A','C','3'), ACodecStatus_Working, {AFMT_FLOAT32, 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 a52_fillbuff(sh_audio_t *sh_audio,float *pts){ - int length=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<8){ - 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; - } - if(sh_audio->wtag!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); - length = a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); - if(length>=7 && length<=MAX_AC3_FRAME) break; /* we're done.*/ - /* bad file => resync*/ - if(sh_audio->wtag!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); - memmove(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,7); - --sh_audio->a_in_buffer_len; - apts=0; - } - MSG_DBG2("a52: len=%d flags=0x%X %d Hz %d bit/s\n",length,flags,sample_rate,bit_rate); - sh_audio->rate=sample_rate; - sh_audio->i_bps=bit_rate/8; - demux_read_data_r(sh_audio->ds,sh_audio->a_in_buffer+8,length-8,apts?&null_pts:&apts); - if(sh_audio->wtag!=0x2000) swab(sh_audio->a_in_buffer+8,sh_audio->a_in_buffer+8,length-8); - priv->last_pts=*pts=apts; - if(crc16_block(sh_audio->a_in_buffer+2,length-2)!=0) - MSG_STATUS("a52: CRC check failed! \n"); - return length; -} - -/* returns: number of available channels*/ -static int a52_printinfo(sh_audio_t *sh_audio){ - int flags, sample_rate, bit_rate; - char* mode="unknown"; - int channels=0; - a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); - switch(flags&A52_CHANNEL_MASK){ - case A52_CHANNEL: mode="channel"; channels=2; break; - case A52_MONO: mode="mono"; channels=1; break; - case A52_STEREO: mode="stereo"; channels=2; break; - case A52_3F: mode="3f";channels=3;break; - case A52_2F1R: mode="2f+1r";channels=3;break; - case A52_3F1R: mode="3f+1r";channels=4;break; - case A52_2F2R: mode="2f+2r";channels=4;break; - case A52_3F2R: mode="3f+2r";channels=5;break; - case A52_CHANNEL1: mode="channel1"; channels=2; break; - case A52_CHANNEL2: mode="channel2"; channels=2; break; - case A52_DOLBY: mode="dolby"; channels=2; break; - } - MSG_INFO("AC3: %d.%d (%s%s) %d Hz %3.1f kbit/s Out: %u-bit\n", - channels, (flags&A52_LFE)?1:0, - mode, (flags&A52_LFE)?"+lfe":"", - sample_rate, bit_rate*0.001f, - afmt2bps(sh_audio->afmt)*8); - return (flags&A52_LFE) ? (channels+1) : channels; -} - -MPXP_Rc preinit(sh_audio_t *sh) -{ - /* Dolby AC3 audio: */ - /* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ -#ifdef WORDS_BIGENDIAN -#define A52_FMT32 AFMT_S32_BE -#define A52_FMT24 AFMT_S24_BE -#else -#define A52_FMT32 AFMT_S32_LE -#define A52_FMT24 AFMT_S24_LE -#endif - sh->afmt=bps2afmt(2); - if(af_query_fmt(sh->afilter,AFMT_FLOAT32) == MPXP_Ok|| - af_query_fmt(sh->afilter,A52_FMT32) == MPXP_Ok || - af_query_fmt(sh->afilter,A52_FMT24) == MPXP_Ok) { - sh->afmt=AFMT_FLOAT32; - } - sh->audio_out_minsize=mp_conf.ao_channels*afmt2bps(sh->afmt)*256*6; - sh->audio_in_minsize=MAX_AC3_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_a52_accel = MPXPCtx->mplayer_accel; - mpxp_a52_state=a52_init (mpxp_a52_accel); - if (mpxp_a52_state == NULL) { - MSG_ERR("A52 init failed\n"); - return MPXP_False; - } - if(a52_fillbuff(sh_audio,&pts)<0){ - MSG_ERR("A52 sync failed\n"); - return MPXP_False; - } - /* 'a52 cannot upmix' hotfix:*/ - a52_printinfo(sh_audio); - sh_audio->nch=mp_conf.ao_channels; - while(sh_audio->nch>0){ - switch(sh_audio->nch){ - case 1: mpxp_a52_flags=A52_MONO; break; -/* case 2: mpxp_a52_flags=A52_STEREO; break; */ - case 2: mpxp_a52_flags=A52_DOLBY; break; -/* case 3: mpxp_a52_flags=A52_3F; break;*/ - case 3: mpxp_a52_flags=A52_2F1R; break; - case 4: mpxp_a52_flags=A52_2F2R; break; /* 2+2*/ - case 5: mpxp_a52_flags=A52_3F2R; break; - case 6: mpxp_a52_flags=A52_3F2R|A52_LFE; break; /* 5.1*/ - } - /* test:*/ - flags=mpxp_a52_flags|A52_ADJUST_LEVEL; - MSG_V("A52 flags before a52_frame: 0x%X\n",flags); - if (a52_frame (mpxp_a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ - MSG_ERR("a52: error decoding frame -> nosound\n"); - return MPXP_False; - } - MSG_V("A52 flags after a52_frame: 0x%X\n",flags); - /* frame decoded, let's init resampler:*/ - if(afmt2bps(sh_audio->afmt)==4) { - if(a52_resample_init_float(mpxp_a52_state,mpxp_a52_accel,flags,sh_audio->nch)) break; - } else { - if(a52_resample_init(mpxp_a52_state,mpxp_a52_accel,flags,sh_audio->nch)) break; - } - --sh_audio->nch; /* try to decrease no. of channels*/ - } - if(sh_audio->nch<=0){ - MSG_ERR("a52: 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; - a52_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; - int flags=mpxp_a52_flags|A52_ADJUST_LEVEL; - unsigned i; - unsigned len=0; - UNUSED(minlen); - UNUSED(maxlen); - priv_t *priv=sh_audio->context; - if(!sh_audio->a_in_buffer_len) { - if(a52_fillbuff(sh_audio,pts)<0) return len; /* EOF */ - } else *pts=priv->last_pts; - sh_audio->a_in_buffer_len=0; - if (a52_frame (mpxp_a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ - MSG_WARN("a52: error decoding frame\n"); - return len; - } -// a52_dynrng(&mpxp_a52_state, NULL, NULL); - len=0; - for (i = 0; i < 6; i++) { - if (a52_block (mpxp_a52_state)){ - MSG_WARN("a52: error at resampling\n"); - break; - } - if(afmt2bps(sh_audio->afmt)==4) - len+=4*a52_resample32(a52_samples(mpxp_a52_state),(float *)&buf[len]); - else - len+=2*a52_resample(a52_samples(mpxp_a52_state),(int16_t *)&buf[len]); - } - return len; -} Copied: mplayerxp/libmpcodecs/ad_a52.cpp (from rev 374, mplayerxp/libmpcodecs/ad_a52.c) =================================================================== --- mplayerxp/libmpcodecs/ad_a52.cpp (rev 0) +++ mplayerxp/libmpcodecs/ad_a52.cpp 2012-11-16 13:12:42 UTC (rev 386) @@ -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 "osdep/mm_accel.h" +#include "mplayerxp.h" +#include "liba52/a52.h" +#include "libao2/afmt.h" +#include "libao2/audio_out.h" +#include "postproc/af.h" + +typedef struct priv_s { + float last_pts; +}priv_t; + +#define MAX_AC3_FRAME 3840 + +a52_state_t* mpxp_a52_state; +uint32_t mpxp_a52_accel=0; +uint32_t mpxp_a52_flags=0; + +#include "osdep/bswap.h" +#include "osdep/mplib.h" + +static const ad_info_t info = +{ + "liba52 AC3 driver", + "liba52", + "Nickols_K", + "build-in" +}; + +static const config_t options[] = { + { NULL, NULL, 0, 0, 0, 0, NULL} +}; + +LIBAD_EXTERN(a52) + +static const audio_probe_t probes[] = { + { "liba52", "liba52", 0x2000, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, + { "liba52", "liba52", 0x20736D, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, + { "liba52", "liba52", FOURCC_TAG('A','C','_','3'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, + { "liba52", "liba52", FOURCC_TAG('D','N','E','T'), ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S16_LE} }, + { "liba52", "liba52", FOURCC_TAG('S','A','C','3'), ACodecStatus_Working, {AFMT_FLOAT32, 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 a52_fillbuff(sh_audio_t *sh_audio,float *pts){ + int length=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<8){ + 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; + } + if(sh_audio->wtag!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); + length = a52_syncinfo ((uint8_t*)sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); + if(length>=7 && length<=MAX_AC3_FRAME) break; /* we're done.*/ + /* bad file => resync*/ + if(sh_audio->wtag!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); + memmove(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,7); + --sh_audio->a_in_buffer_len; + apts=0; + } + MSG_DBG2("a52: len=%d flags=0x%X %d Hz %d bit/s\n",length,flags,sample_rate,bit_rate); + sh_audio->rate=sample_rate; + sh_audio->i_bps=bit_rate/8; + demux_read_data_r(sh_audio->ds,(uint8_t*)sh_audio->a_in_buffer+8,length-8,apts?&null_pts:&apts); + if(sh_audio->wtag!=0x2000) swab(sh_audio->a_in_buffer+8,sh_audio->a_in_buffer+8,length-8); + priv->last_pts=*pts=apts; + if(crc16_block((uint8_t*)sh_audio->a_in_buffer+2,length-2)!=0) + MSG_STATUS("a52: CRC check failed! \n"); + return length; +} + +/* returns: number of available channels*/ +static int a52_printinfo(sh_audio_t *sh_audio){ + int flags, sample_rate, bit_rate; + const char* mode="unknown"; + int channels=0; + a52_syncinfo ((uint8_t*)sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); + switch(flags&A52_CHANNEL_MASK){ + case A52_CHANNEL: mode="channel"; channels=2; break; + case A52_MONO: mode="mono"; channels=1; break; + case A52_STEREO: mode="stereo"; channels=2; break; + case A52_3F: mode="3f";channels=3;break; + case A52_2F1R: mode="2f+1r";channels=3;break; + case A52_3F1R: mode="3f+1r";channels=4;break; + case A52_2F2R: mode="2f+2r";channels=4;break; + case A52_3F2R: mode="3f+2r";channels=5;break; + case A52_CHANNEL1: mode="channel1"; channels=2; break; + case A52_CHANNEL2: mode="channel2"; channels=2; break; + case A52_DOLBY: mode="dolby"; channels=2; break; + } + MSG_INFO("AC3: %d.%d (%s%s) %d Hz %3.1f kbit/s Out: %u-bit\n", + channels, (flags&A52_LFE)?1:0, + mode, (flags&A52_LFE)?"+lfe":"", + sample_rate, bit_rate*0.001f, + afmt2bps(sh_audio->afmt)*8); + return (flags&A52_LFE) ? (channels+1) : channels; +} + +MPXP_Rc preinit(sh_audio_t *sh) +{ + /* Dolby AC3 audio: */ + /* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ +#ifdef WORDS_BIGENDIAN +#define A52_FMT32 AFMT_S32_BE +#define A52_FMT24 AFMT_S24_BE +#else +#define A52_FMT32 AFMT_S32_LE +#define A52_FMT24 AFMT_S24_LE +#endif + sh->afmt=bps2afmt(2); + if(af_query_fmt(sh->afilter,mpaf_format_e(AFMT_FLOAT32)) == MPXP_Ok|| + af_query_fmt(sh->afilter,mpaf_format_e(A52_FMT32)) == MPXP_Ok || + af_query_fmt(sh->afilter,mpaf_format_e(A52_FMT24)) == MPXP_Ok) { + sh->afmt=AFMT_FLOAT32; + } + sh->audio_out_minsize=mp_conf.ao_channels*afmt2bps(sh->afmt)*256*6; + sh->audio_in_minsize=MAX_AC3_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_a52_accel = MPXPCtx->mplayer_accel; + mpxp_a52_state=a52_init (mpxp_a52_accel); + if (mpxp_a52_state == NULL) { + MSG_ERR("A52 init failed\n"); + return MPXP_False; + } + if(a52_fillbuff(sh_audio,&pts)<0){ + MSG_ERR("A52 sync failed\n"); + return MPXP_False; + } + /* 'a52 cannot upmix' hotfix:*/ + a52_printinfo(sh_audio); + sh_audio->nch=mp_conf.ao_channels; + while(sh_audio->nch>0){ + switch(sh_audio->nch){ + case 1: mpxp_a52_flags=A52_MONO; break; +/* case 2: mpxp_a52_flags=A52_STEREO; break; */ + case 2: mpxp_a52_flags=A52_DOLBY; break; +/* case 3: mpxp_a52_flags=A52_3F; break;*/ + case 3: mpxp_a52_flags=A52_2F1R; break; + case 4: mpxp_a52_flags=A52_2F2R; break; /* 2+2*/ + case 5: mpxp_a52_flags=A52_3F2R; break; + case 6: mpxp_a52_flags=A52_3F2R|A52_LFE; break; /* 5.1*/ + } + /* test:*/ + flags=mpxp_a52_flags|A52_ADJUST_LEVEL; + MSG_V("A52 flags before a52_frame: 0x%X\n",flags); + if (a52_frame (mpxp_a52_state, (uint8_t*)sh_audio->a_in_buffer, &flags, &level, bias)){ + MSG_ERR("a52: error decoding frame -> nosound\n"); + return MPXP_False; + } + MSG_V("A52 flags after a52_frame: 0x%X\n",flags); + /* frame decoded, let's init resampler:*/ + if(afmt2bps(sh_audio->afmt)==4) { + if(a52_resample_init_float(mpxp_a52_state,mpxp_a52_accel,flags,sh_audio->nch)) break; + } else { + if(a52_resample_init(mpxp_a52_state,mpxp_a52_accel,flags,sh_audio->nch)) break; + } + --sh_audio->nch; /* try to decrease no. of channels*/ + } + if(sh_audio->nch<=0){ + MSG_ERR("a52: 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; + a52_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; + int flags=mpxp_a52_flags|A52_ADJUST_LEVEL; + unsigned i; + unsigned len=0; + UNUSED(minlen); + UNUSED(maxlen); + priv_t *priv=reinterpret_cast<priv_t*>(sh_audio->context); + if(!sh_audio->a_in_buffer_len) { + if(a52_fillbuff(sh_audio,pts)<0) return len; /* EOF */ + } else *pts=priv->last_pts; + sh_audio->a_in_buffer_len=0; + if (a52_frame (mpxp_a52_state, (uint8_t*)sh_audio->a_in_buffer, &flags, &level, bias)){ + MSG_WARN("a52: error decoding frame\n"); + return len; + } +// a52_dynrng(&mpxp_a52_state, NULL, NULL); + len=0; + for (i = 0; i < 6; i++) { + if (a52_block (mpxp_a52_state)){ + MSG_WARN("a52: error at resampling\n"); + break; + } + if(afmt2bps(sh_audio->afmt)==4) + len+=4*a52_resample32(a52_samples(mpxp_a52_state),(float *)&buf[len]); + else + len+=2*a52_resample(a52_samples(mpxp_a52_state),(int16_t *)&buf[len]); + } + return len; +} Deleted: mplayerxp/libmpcodecs/ad_hwac3.c =================================================================== --- mplayerxp/libmpcodecs/ad_hwac3.c 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/ad_hwac3.c 2012-11-16 13:12:42 UTC (rev 386) @@ -1,252 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#define __USE_XOPEN 1 -#include <unistd.h> -#include <string.h> -#include <assert.h> -#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ -#include "ad_internal.h" - -#include "mp_config.h" -#include "help_mp.h" -#include "codecs_ld.h" -#include "osdep/cpudetect.h" -#include "osdep/bswap.h" - -#include "libao2/afmt.h" - -#define IEC61937_DATA_TYPE_AC3 1 - -typedef struct priv_s { - float last_pts; -}priv_t; - -struct hwac3info { - unsigned bitrate, framesize, samplerate, bsmod; -}; - -struct frmsize_s { - unsigned short bit_rate; - unsigned short frm_size[3]; -}; - -static const struct frmsize_s frmsizecod_tbl[64] = { - { 32 ,{64 ,69 ,96 } }, - { 32 ,{64 ,70 ,96 } }, - { 40 ,{80 ,87 ,120 } }, - { 40 ,{80 ,88 ,120 } }, - { 48 ,{96 ,104 ,144 } }, - { 48 ,{96 ,105 ,144 } }, - { 56 ,{112 ,121 ,168 } }, - { 56 ,{112 ,122 ,168 } }, - { 64 ,{128 ,139 ,192 } }, - { 64 ,{128 ,140 ,192 } }, - { 80 ,{160 ,174 ,240 } }, - { 80 ,{160 ,175 ,240 } }, - { 96 ,{192 ,208 ,288 } }, - { 96 ,{192 ,209 ,288 } }, - { 112 ,{224 ,243 ,336 } }, - { 112 ,{224 ,244 ,336 } }, - { 128 ,{256 ,278 ,384 } }, - { 128 ,{256 ,279 ,384 } }, - { 160 ,{320 ,348 ,480 } }, - { 160 ,{320 ,349 ,480 } }, - { 192 ,{384 ,417 ,576 } }, - { 192 ,{384 ,418 ,576 } }, - { 224 ,{448 ,487 ,672 } }, - { 224 ,{448 ,488 ,672 } }, - { 256 ,{512 ,557 ,768 } }, - { 256 ,{512 ,558 ,768 } }, - { 320 ,{640 ,696 ,960 } }, - { 320 ,{640 ,697 ,960 } }, - { 384 ,{768 ,835 ,1152 } }, - { 384 ,{768 ,836 ,1152 } }, - { 448 ,{896 ,975 ,1344 } }, - { 448 ,{896 ,976 ,1344 } }, - { 512 ,{1024 ,1114 ,1536 } }, - { 512 ,{1024 ,1115 ,1536 } }, - { 576 ,{1152 ,1253 ,1728 } }, - { 576 ,{1152 ,1254 ,1728 } }, - { 640 ,{1280 ,1393 ,1920 } }, - { 640 ,{1280 ,1394 ,1920 } } -}; - -struct syncframe { - struct syncinfo { - unsigned char syncword[2]; - unsigned char crc1[2]; - unsigned char code; - } syncinfo; - struct bsi { - unsigned char bsidmod; - unsigned char acmod; - } bsi; -}; - -unsigned ac3_iec958_build_burst(unsigned length, unsigned data_type, unsigned big_endian, unsigned char * data, unsigned char * out) -{ - out[0] = 0x72; - out[1] = 0xF8; - out[2] = 0x1F; - out[3] = 0x4E; - out[4] = (length) ? data_type : 0; /* & 0x1F; */ - out[5] = 0x00; - out[6] = (length << 3) & 0xFF; - out[7] = (length >> 5) & 0xFF; - if (big_endian) - swab(data, out + 8, length); - else - memcpy(out + 8, data, length); - memset(out + 8 + length, 0, 6144 - 8 - length); - return 6144; -} - -int ac3_iec958_parse_syncinfo(unsigned char *buf, unsigned size, struct hwac3info *ai, unsigned *skipped) -{ - int samplerates[4] = { 48000, 44100, 32000, -1 }; - unsigned short _sync = 0; - unsigned char *ptr = buf; - int fscod, frmsizecod; - struct syncframe *sf; - - _sync = buf[0] << 8; - _sync |= buf[1]; - ptr = buf + 2; - *skipped = 0; - while (_sync != 0xb77 && *skipped < size - 8) { - _sync <<= 8; - _sync |= *ptr; - ptr++; - *skipped += 1; - } - if (_sync != 0xb77) - return -1; - ptr -= 2; - sf = (struct syncframe *) ptr; - fscod = (sf->syncinfo.code >> 6) & 0x03; - ai->samplerate = samplerates[fscod]; - if ((int)ai->samplerate == -1) - return -1; - frmsizecod = sf->syncinfo.code & 0x3f; - ai->framesize = 2 * frmsizecod_tbl[frmsizecod].frm_size[fscod]; - ai->bitrate = frmsizecod_tbl[frmsizecod].bit_rate; - if (((sf->bsi.bsidmod >> 3) & 0x1f) != 0x08) - return -1; - ai->bsmod = sf->bsi.bsidmod & 0x7; - - return 0; -} - -typedef struct a52_state_s a52_state_t; -extern a52_state_t *mpxp_a52_state; -extern uint32_t mpxp_a52_accel; -extern uint32_t mpxp_a52_flags; -int a52_fillbuff(sh_audio_t *sh_audio,float *pts); - -static const ad_info_t info = { - "AC3/DTS pass-through S/PDIF", - "hwac3", - "Nickols_K", - "build-in" -}; - -static const config_t options[] = { - { NULL, NULL, 0, 0, 0, 0, NULL} -}; - -LIBAD_EXTERN(hwac3) -extern ad_functions_t mpcodecs_ad_a52; - -static a52_state_t * (*a52_init_ptr) (uint32_t mm_accel); -#define a52_init(a) (*a52_init_ptr)(a) - -static const audio_probe_t probes[] = { - { "hwac3", "hwac3", 0x2000, ACodecStatus_Working, {AFMT_AC3} }, - { "hwac3", "hwac3", 0x2001, ACodecStatus_Working, {AFMT_AC3} }, - { "hwac3", "hwac3", FOURCC_TAG('A','C','_','3'), ACodecStatus_Working, {AFMT_AC3} }, - { "hwac3", "hwac3", FOURCC_TAG('D','N','E','T'), ACodecStatus_Working, {AFMT_AC3} }, - { "hwac3", "hwac3", FOURCC_TAG('S','A','C','3'), ACodecStatus_Working, {AFMT_AC3} }, - { 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; -} - - -MPXP_Rc preinit(sh_audio_t *sh) -{ - /* Dolby AC3 audio: */ - mpcodecs_ad_a52.preinit(sh); - sh->audio_out_minsize=4*256*6; - sh->audio_in_minsize=3840; - sh->nch=2; - sh->afmt=AFMT_AC3; - return MPXP_Ok; -} - -MPXP_Rc init(sh_audio_t *sh_audio) -{ - /* Dolby AC3 passthrough:*/ - float pts; - mpxp_a52_state=a52_init (mpxp_a52_accel); /* doesn't require mmx optimzation */ - if (mpxp_a52_state == NULL) { - MSG_ERR("A52 init failed\n"); - return MPXP_False; - } - if(a52_fillbuff(sh_audio,&pts)<0) { - MSG_ERR("A52 sync failed\n"); - return 0; - } - /* - sh_audio->samplerate=ai.samplerate; // SET by a52_fillbuff() - sh_audio->samplesize=ai.framesize; - sh_audio->i_bps=ai.bitrate*(1000/8); // SET by a52_fillbuff() - sh_audio->ac3_frame=mp_malloc(6144); - sh_audio->o_bps=sh_audio->i_bps; // XXX FIXME!!! XXX - - o_bps is calculated from samplesize*channels*samplerate - a single ac3 frame is always translated to 6144 byte packet. (zero padding)*/ - sh_audio->nch=2; - sh_audio->afmt=bps2afmt(2); /* 2*2*(6*256) = 6144 (very TRICKY!)*/ - return MPXP_Ok; -} - -void uninit(sh_audio_t *sh) -{ - mpcodecs_ad_a52.uninit(sh); -} - -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; - a52_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) -{ - unsigned len=0; - UNUSED(minlen); - UNUSED(maxlen); - if(!sh_audio->a_in_buffer_len) - if((int)(len=a52_fillbuff(sh_audio,pts))<0) return 0; /*EOF*/ - sh_audio->a_in_buffer_len=0; - len = ac3_iec958_build_burst(len, 0x01, 1, sh_audio->a_in_buffer, buf); - return len; -} Copied: mplayerxp/libmpcodecs/ad_hwac3.cpp (from rev 369, mplayerxp/libmpcodecs/ad_hwac3.c) =================================================================== --- mplayerxp/libmpcodecs/ad_hwac3.cpp (rev 0) +++ mplayerxp/libmpcodecs/ad_hwac3.cpp 2012-11-16 13:12:42 UTC (rev 386) @@ -0,0 +1,252 @@ +#include <stdio.h> +#include <stdlib.h> +#define __USE_XOPEN 1 +#include <unistd.h> +#include <string.h> +#include <assert.h> +#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ +#include "ad_internal.h" + +#include "mp_config.h" +#include "help_mp.h" +#include "codecs_ld.h" +#include "osdep/cpudetect.h" +#include "osdep/bswap.h" + +#include "libao2/afmt.h" + +#define IEC61937_DATA_TYPE_AC3 1 + +typedef struct priv_s { + float last_pts; +}priv_t; + +struct hwac3info { + unsigned bitrate, framesize, samplerate, bsmod; +}; + +struct frmsize_s { + unsigned short bit_rate; + unsigned short frm_size[3]; +}; + +static const struct frmsize_s frmsizecod_tbl[64] = { + { 32 ,{64 ,69 ,96 } }, + { 32 ,{64 ,70 ,96 } }, + { 40 ,{80 ,87 ,120 } }, + { 40 ,{80 ,88 ,120 } }, + { 48 ,{96 ,104 ,144 } }, + { 48 ,{96 ,105 ,144 } }, + { 56 ,{112 ,121 ,168 } }, + { 56 ,{112 ,122 ,168 } }, + { 64 ,{128 ,139 ,192 } }, + { 64 ,{128 ,140 ,192 } }, + { 80 ,{160 ,174 ,240 } }, + { 80 ,{160 ,175 ,240 } }, + { 96 ,{192 ,208 ,288 } }, + { 96 ,{192 ,209 ,288 } }, + { 112 ,{224 ,243 ,336 } }, + { 112 ,{224 ,244 ,336 } }, + { 128 ,{256 ,278 ,384 } }, + { 128 ,{256 ,279 ,384 } }, + { 160 ,{320 ,348 ,480 } }, + { 160 ,{320 ,349 ,480 } }, + { 192 ,{384 ,417 ,576 } }, + { 192 ,{384 ,418 ,576 } }, + { 224 ,{448 ,487 ,672 } }, + { 224 ,{448 ,488 ,672 } }, + { 256 ,{512 ,557 ,768 } }, + { 256 ,{512 ,558 ,768 } }, + { 320 ,{640 ,696 ,960 } }, + { 320 ,{640 ,697 ,960 } }, + { 384 ,{768 ,835 ,1152 } }, + { 384 ,{768 ,836 ,1152 } }, + { 448 ,{896 ,975 ,1344 } }, + { 448 ,{896 ,976 ,1344 } }, + { 512 ,{1024 ,1114 ,1536 } }, + { 512 ,{1024 ,1115 ,1536 } }, + { 576 ,{1152 ,1253 ,1728 } }, + { 576 ,{1152 ,1254 ,1728 } }, + { 640 ,{1280 ,1393 ,1920 } }, + { 640 ,{1280 ,1394 ,1920 } } +}; + +struct syncframe { + struct syncinfo { + unsigned char syncword[2]; + unsigned char crc1[2]; + unsigned char code; + } syncinfo; + struct bsi { + unsigned char bsidmod; + unsigned char acmod; + } bsi; +}; + +unsigned ac3_iec958_build_burst(unsigned length, unsigned data_type, unsigned big_endian, unsigned char * data, unsigned char * out) +{ + out[0] = 0x72; + out[1] = 0xF8; + out[2] = 0x1F; + out[3] = 0x4E; + out[4] = (length) ? data_type : 0; /* & 0x1F; */ + out[5] = 0x00; + out[6] = (length << 3) & 0xFF; + out[7] = (length >> 5) & 0xFF; + if (big_endian) + swab(data, out + 8, length); + else + memcpy(out + 8, data, length); + memset(out + 8 + length, 0, 6144 - 8 - length); + return 6144; +} + +int ac3_iec958_parse_syncinfo(unsigned char *buf, unsigned size, struct hwac3info *ai, unsigned *skipped) +{ + int samplerates[4] = { 48000, 44100, 32000, -1 }; + unsigned short _sync = 0; + unsigned char *ptr = buf; + int fscod, frmsizecod; + struct syncframe *sf; + + _sync = buf[0] << 8; + _sync |= buf[1]; + ptr = buf + 2; + *skipped = 0; + while (_sync != 0xb77 && *skipped < size - 8) { + _sync <<= 8; + _sync |= *ptr; + ptr++; + *skipped += 1; + } + if (_sync != 0xb77) + return -1; + ptr -= 2; + sf = (struct syncframe *) ptr; + fscod = (sf->syncinfo.code >> 6) & 0x03; + ai->samplerate = samplerates[fscod]; + if ((int)ai->samplerate == -1) + return -1; + frmsizecod = sf->syncinfo.code & 0x3f; + ai->framesize = 2 * frmsizecod_tbl[frmsizecod].frm_size[fscod]; + ai->bitrate = frmsizecod_tbl[frmsizecod].bit_rate; + if (((sf->bsi.bsidmod >> 3) & 0x1f) != 0x08) + return -1; + ai->bsmod = sf->bsi.bsidmod & 0x7; + + return 0; +} + +typedef struct a52_state_s a52_state_t; +extern a52_state_t *mpxp_a52_state; +extern uint32_t mpxp_a52_accel; +extern uint32_t mpxp_a52_flags; +int a52_fillbuff(sh_audio_t *sh_audio,float *pts); + +static const ad_info_t info = { + "AC3/DTS pass-through S/PDIF", + "hwac3", + "Nickols_K", + "build-in" +}; + +static const config_t options[] = { + { NULL, NULL, 0, 0, 0, 0, NULL} +}; + +LIBAD_EXTERN(hwac3) +extern ad_functions_t mpcodecs_ad_a52; + +static a52_state_t * (*a52_init_ptr) (uint32_t mm_accel); +#define a52_init(a) (*a52_init_ptr)(a) + +static const audio_probe_t probes[] = { + { "hwac3", "hwac3", 0x2000, ACodecStatus_Working, {AFMT_AC3} }, + { "hwac3", "hwac3", 0x2001, ACodecStatus_Working, {AFMT_AC3} }, + { "hwac3", "hwac3", FOURCC_TAG('A','C','_','3'), ACodecStatus_Working, {AFMT_AC3} }, + { "hwac3", "hwac3", FOURCC_TAG('D','N','E','T'), ACodecStatus_Working, {AFMT_AC3} }, + { "hwac3", "hwac3", FOURCC_TAG('S','A','C','3'), ACodecStatus_Working, {AFMT_AC3} }, + { 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; +} + + +MPXP_Rc preinit(sh_audio_t *sh) +{ + /* Dolby AC3 audio: */ + mpcodecs_ad_a52.preinit(sh); + sh->audio_out_minsize=4*256*6; + sh->audio_in_minsize=3840; + sh->nch=2; + sh->afmt=AFMT_AC3; + return MPXP_Ok; +} + +MPXP_Rc init(sh_audio_t *sh_audio) +{ + /* Dolby AC3 passthrough:*/ + float pts; + mpxp_a52_state=a52_init (mpxp_a52_accel); /* doesn't require mmx optimzation */ + if (mpxp_a52_state == NULL) { + MSG_ERR("A52 init failed\n"); + return MPXP_False; + } + if(a52_fillbuff(sh_audio,&pts)<0) { + MSG_ERR("A52 sync failed\n"); + return MPXP_False; + } + /* + sh_audio->samplerate=ai.samplerate; // SET by a52_fillbuff() + sh_audio->samplesize=ai.framesize; + sh_audio->i_bps=ai.bitrate*(1000/8); // SET by a52_fillbuff() + sh_audio->ac3_frame=mp_malloc(6144); + sh_audio->o_bps=sh_audio->i_bps; // XXX FIXME!!! XXX + + o_bps is calculated from samplesize*channels*samplerate + a single ac3 frame is always translated to 6144 byte packet. (zero padding)*/ + sh_audio->nch=2; + sh_audio->afmt=bps2afmt(2); /* 2*2*(6*256) = 6144 (very TRICKY!)*/ + return MPXP_Ok; +} + +void uninit(sh_audio_t *sh) +{ + mpcodecs_ad_a52.uninit(sh); +} + +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; + a52_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) +{ + unsigned len=0; + UNUSED(minlen); + UNUSED(maxlen); + if(!sh_audio->a_in_buffer_len) + if((int)(len=a52_fillbuff(sh_audio,pts))<0) return 0; /*EOF*/ + sh_audio->a_in_buffer_len=0; + len = ac3_iec958_build_burst(len, 0x01, 1, (unsigned char *)sh_audio->a_in_buffer, buf); + return len; +} Modified: mplayerxp/libmpcodecs/ad_internal.h =================================================================== --- mplayerxp/libmpcodecs/ad_internal.h 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/ad_internal.h 2012-11-16 13:12:42 UTC (rev 386) @@ -19,9 +19,9 @@ static MPXP_Rc control(sh_audio_t *sh,int cmd,any_t* arg, ...); static unsigned __FASTCALL__ decode(sh_audio_t *sh_audio,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts); -#define LIBAD_EXTERN(x) const ad_functions_t mpcodecs_ad_##x = {\ +#define LIBAD_EXTERN(x) extern const ad_functions_t mpcodecs_ad_##x = {\ &info,\ - &options,\ + options,\ probe, \ preinit,\ init,\ Modified: mplayerxp/libmpcodecs/liba52/Makefile =================================================================== --- mplayerxp/libmpcodecs/liba52/Makefile 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/liba52/Makefile 2012-11-16 13:12:42 UTC (rev 386) @@ -1,9 +1,12 @@ include ../../mp_config.mak -SRCS = crc.c bit_allocate.c bitstream.c downmix.c imdct.c parse.c resample.c +CXXSRCS = parse.cpp bitstream.cpp imdct.cpp downmix.cpp bit_allocate.cpp crc.cpp resample.cpp +SRCS = OBJS = $(SRCS:.c=.o) +CXXOBJS = $(CXXSRCS:.cpp=.o) CFLAGS = $(MLIB_INC) $(OPTFLAGS) -W -Wall +CXXFLAGS = $(MLIB_INC) $(OPTXXFLAGS) -W -Wall .SUFFIXES: .c .o @@ -11,8 +14,10 @@ .c.o: $(CC) -c $(CFLAGS) -o $@ $< +.cpp.o: + $(CC) -c $(CXXFLAGS) -o $@ $< -all: $(OBJS) +all: $(OBJS) $(CXXOBJS) clean: rm -f *.o *.a *~ @@ -23,7 +28,7 @@ dep: depend depend: - $(CC) -MM $(CFLAGS) $(SRCS) 1>.depend + $(CC) -MM $(CFLAGS) $(SRCS) $(CXXSRCS) 1>.depend # # include dependency files if they exist Modified: mplayerxp/libmpcodecs/liba52/a52.h =================================================================== --- mplayerxp/libmpcodecs/liba52/a52.h 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/liba52/a52.h 2012-11-16 13:12:42 UTC (rev 386) @@ -51,6 +51,9 @@ A52_ADJUST_LEVEL=32 }; +typedef int (*a52_resample_t) (float * _f, int16_t * s16); +typedef int (*a52_resample32_t) (float * _f, float * s16); + a52_state_t * a52_init (uint32_t mm_accel); sample_t * a52_samples (a52_state_t * state); extern int a52_syncinfo (uint8_t * buf, int * flags, @@ -62,8 +65,9 @@ extern int a52_block (a52_state_t * state); extern void a52_free (a52_state_t * state); extern uint16_t crc16_block(uint8_t *data,uint32_t num_bytes); -extern any_t* a52_resample_init_float(a52_state_t * state,uint32_t mm_accel,int flags,int chans); -extern any_t* a52_resample_init(a52_state_t * state,uint32_t mm_accel,int flags,int chans); +extern a52_resample32_t a52_resample_init_float(a52_state_t * state,uint32_t mm_accel,int flags,int chans); +extern a52_resample_t a52_resample_init(a52_state_t * state,uint32_t mm_accel,int flags,int chans); + extern int (* a52_resample) (float * _f, int16_t * s16); extern int (* a52_resample32) (float * _f, float * s16); Modified: mplayerxp/libmpcodecs/liba52/a52_internal.h =================================================================== --- mplayerxp/libmpcodecs/liba52/a52_internal.h 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/liba52/a52_internal.h 2012-11-16 13:12:42 UTC (rev 386) @@ -117,6 +117,6 @@ sample_t clev, sample_t slev); void a52_upmix (sample_t * samples, int acmod, int output); -char * a52_imdct_init (void); +const char * a52_imdct_init (void); void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias); void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias); Deleted: mplayerxp/libmpcodecs/liba52/bit_allocate.c =================================================================== --- mplayerxp/libmpcodecs/liba52/bit_allocate.c 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/liba52/bit_allocate.c 2012-11-16 13:12:42 UTC (rev 386) @@ -1,265 +0,0 @@ -/* - * bit_allocate.c - * Copyright (C) 2000-2002 Michel Lespinasse <wa...@zo...> - * Copyright (C) 1999-2000 Aaron Holtzman <aho...@es...> - * - * This file is part of a52dec, a mp_free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec is mp_free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * a52dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../../mp_config.h" - -#include <inttypes.h> - -#include "a52.h" -#include "a52_internal.h" - -static int hthtab[3][50] = { - {0x730, 0x730, 0x7c0, 0x800, 0x820, 0x840, 0x850, 0x850, 0x860, 0x860, - 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x890, 0x890, - 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, - 0x910, 0x910, 0x910, 0x910, 0x900, 0x8f0, 0x8c0, 0x870, 0x820, 0x7e0, - 0x7a0, 0x770, 0x760, 0x7a0, 0x7c0, 0x7c0, 0x6e0, 0x400, 0x3c0, 0x3c0}, - {0x710, 0x710, 0x7a0, 0x7f0, 0x820, 0x830, 0x840, 0x850, 0x850, 0x860, - 0x860, 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, - 0x890, 0x890, 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8e0, 0x8f0, - 0x900, 0x910, 0x910, 0x910, 0x910, 0x900, 0x8e0, 0x8b0, 0x870, 0x820, - 0x7e0, 0x7b0, 0x760, 0x770, 0x7a0, 0x7c0, 0x780, 0x5d0, 0x3c0, 0x3c0}, - {0x680, 0x680, 0x750, 0x7b0, 0x7e0, 0x810, 0x820, 0x830, 0x840, 0x850, - 0x850, 0x850, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, - 0x870, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, 0x890, 0x8a0, 0x8b0, - 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, 0x910, 0x910, 0x910, 0x900, 0x8f0, - 0x8d0, 0x8b0, 0x840, 0x7f0, 0x790, 0x760, 0x7a0, 0x7c0, 0x7b0, 0x720} -}; - -static int8_t baptab[305] = { - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, /* 93 padding elems */ - - 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, - 14, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, - 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, - 5, 4, 4, -3, -3, 3, 3, 3, -2, -2, -1, -1, -1, -1, -1, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 /* 148 padding elems */ -}; - -static int bndtab[30] = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34, - 37, 40, 43, 46, 49, 55, 61, 67, 73, 79, - 85, 97, 109, 121, 133, 157, 181, 205, 229, 253}; - -static int8_t latab[256] = { - -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, - -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -44, -44, - -43, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35, - -35, -34, -33, -33, -32, -32, -31, -30, -30, -29, -29, -28, - -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -22, - -22, -21, -21, -21, -20, -20, -19, -19, -19, -18, -18, -18, - -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, - -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -11, -11, - -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, - -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6, - -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, - -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; - -#define UPDATE_LEAK() \ -do { \ - fastleak += fdecay; \ - if (fastleak > psd + fgain) \ - fastleak = psd + fgain; \ - slowleak += sdecay; \ - if (slowleak > psd + sgain) \ - slowleak = psd + sgain; \ -} while (0) - -#define COMPUTE_MASK() \ -do { \ - if (psd > dbknee) \ - mask -= (psd - dbknee) >> 2; \ - if (mask > hth [i >> halfrate]) \ - mask = hth [i >> halfrate]; \ - mask -= snroffset + 128 * deltba[i]; \ - mask = (mask > 0) ? 0 : ((-mask) >> 5); \ - mask -= floor; \ -} while (0) - -void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, - int start, int end, int fastleak, int slowleak, - expbap_t * expbap) -{ - static int slowgain[4] = {0x540, 0x4d8, 0x478, 0x410}; - static int dbpbtab[4] = {0xc00, 0x500, 0x300, 0x100}; - static int floortab[8] = {0x910, 0x950, 0x990, 0x9d0, - 0xa10, 0xa90, 0xb10, 0x1400}; - - int i, j; - uint8_t * exp; - int8_t * bap; - int fdecay, fgain, sdecay, sgain, dbknee, floor, snroffset; - int psd, mask; - int8_t * deltba; - int * hth; - int halfrate; - - halfrate = state->halfrate; - fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */ - fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */ - sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */ - sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */ - dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */ - hth = hthtab[state->fscod]; - /* - * if there is no delta bit allocation, make deltba point to an area - * known to contain zeroes. baptab+156 here. - */ - deltba = (ba->deltbae == DELTA_BIT_NONE) ? baptab + 156 : ba->deltba; - floor = floortab[state->bai & 7]; /* floorcod */ - snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor; - floor >>= 5; - - exp = expbap->exp; - bap = expbap->bap; - - i = bndstart; - j = start; - if (start == 0) { /* not the coupling channel */ - int lowcomp; - - lowcomp = 0; - j = end - 1; - do { - if (i < j) { - if (exp[i+1] == exp[i] - 2) - lowcomp = 384; - else if (lowcomp && (exp[i+1] > exp[i])) - lowcomp -= 64; - } - psd = 128 * exp[i]; - mask = psd + fgain + lowcomp; - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } while ((i < 3) || ((i < 7) && (exp[i] > exp[i-1]))); - fastleak = psd + fgain; - slowleak = psd + sgain; - - while (i < 7) { - if (i < j) { - if (exp[i+1] == exp[i] - 2) - lowcomp = 384; - else if (lowcomp && (exp[i+1] > exp[i])) - lowcomp -= 64; - } - psd = 128 * exp[i]; - UPDATE_LEAK (); - mask = ((fastleak + lowcomp < slowleak) ? - fastleak + lowcomp : slowleak); - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } - - if (end == 7) /* lfe channel */ - return; - - do { - if (exp[i+1] == exp[i] - 2) - lowcomp = 320; - else if (lowcomp && (exp[i+1] > exp[i])) - lowcomp -= 64; - psd = 128 * exp[i]; - UPDATE_LEAK (); - mask = ((fastleak + lowcomp < slowleak) ? - fastleak + lowcomp : slowleak); - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } while (i < 20); - - while (lowcomp > 128) { /* two iterations maximum */ - lowcomp -= 128; - psd = 128 * exp[i]; - UPDATE_LEAK (); - mask = ((fastleak + lowcomp < slowleak) ? - fastleak + lowcomp : slowleak); - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } - j = i; - } - - do { - int startband, endband; - - startband = j; - endband = (bndtab[i-20] < end) ? bndtab[i-20] : end; - psd = 128 * exp[j++]; - while (j < endband) { - int next, delta; - - next = 128 * exp[j++]; - delta = next - psd; - switch (delta >> 9) { - case -6: case -5: case -4: case -3: case -2: - psd = next; - break; - case -1: - psd = next + latab[(-delta) >> 1]; - break; - case 0: - psd += latab[delta >> 1]; - break; - } - } - /* minpsd = -289 */ - UPDATE_LEAK (); - mask = (fastleak < slowleak) ? fastleak : slowleak; - COMPUTE_MASK (); - i++; - j = startband; - do { - /* max(mask+4*exp)=147=-(minpsd+fgain-deltba-snroffset)>>5+4*exp */ - /* min(mask+4*exp)=-156=-(sgain-deltba-snroffset)>>5 */ - bap[j] = (baptab+156)[mask + 4 * exp[j]]; - } while (++j < endband); - } while (j < end); -} Copied: mplayerxp/libmpcodecs/liba52/bit_allocate.cpp (from rev 369, mplayerxp/libmpcodecs/liba52/bit_allocate.c) =================================================================== --- mplayerxp/libmpcodecs/liba52/bit_allocate.cpp (rev 0) +++ mplayerxp/libmpcodecs/liba52/bit_allocate.cpp 2012-11-16 13:12:42 UTC (rev 386) @@ -0,0 +1,265 @@ +/* + * bit_allocate.c + * Copyright (C) 2000-2002 Michel Lespinasse <wa...@zo...> + * Copyright (C) 1999-2000 Aaron Holtzman <aho...@es...> + * + * This file is part of a52dec, a mp_free ATSC A-52 stream decoder. + * See http://liba52.sourceforge.net/ for updates. + * + * a52dec is mp_free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * a52dec is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../../mp_config.h" + +#include <inttypes.h> + +#include "a52.h" +#include "a52_internal.h" + +static int hthtab[3][50] = { + {0x730, 0x730, 0x7c0, 0x800, 0x820, 0x840, 0x850, 0x850, 0x860, 0x860, + 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x890, 0x890, + 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, + 0x910, 0x910, 0x910, 0x910, 0x900, 0x8f0, 0x8c0, 0x870, 0x820, 0x7e0, + 0x7a0, 0x770, 0x760, 0x7a0, 0x7c0, 0x7c0, 0x6e0, 0x400, 0x3c0, 0x3c0}, + {0x710, 0x710, 0x7a0, 0x7f0, 0x820, 0x830, 0x840, 0x850, 0x850, 0x860, + 0x860, 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, + 0x890, 0x890, 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8e0, 0x8f0, + 0x900, 0x910, 0x910, 0x910, 0x910, 0x900, 0x8e0, 0x8b0, 0x870, 0x820, + 0x7e0, 0x7b0, 0x760, 0x770, 0x7a0, 0x7c0, 0x780, 0x5d0, 0x3c0, 0x3c0}, + {0x680, 0x680, 0x750, 0x7b0, 0x7e0, 0x810, 0x820, 0x830, 0x840, 0x850, + 0x850, 0x850, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, + 0x870, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, 0x890, 0x8a0, 0x8b0, + 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, 0x910, 0x910, 0x910, 0x900, 0x8f0, + 0x8d0, 0x8b0, 0x840, 0x7f0, 0x790, 0x760, 0x7a0, 0x7c0, 0x7b0, 0x720} +}; + +static int8_t baptab[305] = { + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, /* 93 padding elems */ + + 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, + 14, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, + 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, + 5, 4, 4, -3, -3, 3, 3, 3, -2, -2, -1, -1, -1, -1, -1, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 /* 148 padding elems */ +}; + +static int bndtab[30] = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34, + 37, 40, 43, 46, 49, 55, 61, 67, 73, 79, + 85, 97, 109, 121, 133, 157, 181, 205, 229, 253}; + +static int8_t latab[256] = { + -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, + -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -44, -44, + -43, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35, + -35, -34, -33, -33, -32, -32, -31, -30, -30, -29, -29, -28, + -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -22, + -22, -21, -21, -21, -20, -20, -19, -19, -19, -18, -18, -18, + -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, + -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -11, -11, + -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, + -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6, + -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, + -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, + -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 +}; + +#define UPDATE_LEAK() \ +do { \ + fastleak += fdecay; \ + if (fastleak > psd + fgain) \ + fastleak = psd + fgain; \ + slowleak += sdecay; \ + if (slowleak > psd + sgain) \ + slowleak = psd + sgain; \ +} while (0) + +#define COMPUTE_MASK() \ +do { \ + if (psd > dbknee) \ + mask -= (psd - dbknee) >> 2; \ + if (mask > hth [i >> halfrate]) \ + mask = hth [i >> halfrate]; \ + mask -= snroffset + 128 * deltba[i]; \ + mask = (mask > 0) ? 0 : ((-mask) >> 5); \ + mask -= floor; \ +} while (0) + +void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, + int start, int end, int fastleak, int slowleak, + expbap_t * expbap) +{ + static int slowgain[4] = {0x540, 0x4d8, 0x478, 0x410}; + static int dbpbtab[4] = {0xc00, 0x500, 0x300, 0x100}; + static int floortab[8] = {0x910, 0x950, 0x990, 0x9d0, + 0xa10, 0xa90, 0xb10, 0x1400}; + + int i, j; + uint8_t * exp; + int8_t * bap; + int fdecay, fgain, sdecay, sgain, dbknee, floor, snroffset; + int psd, mask; + int8_t * deltba; + int * hth; + int halfrate; + + halfrate = state->halfrate; + fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */ + fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */ + sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */ + sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */ + dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */ + hth = hthtab[state->fscod]; + /* + * if there is no delta bit allocation, make deltba point to an area + * known to contain zeroes. baptab+156 here. + */ + deltba = (ba->deltbae == DELTA_BIT_NONE) ? baptab + 156 : ba->deltba; + floor = floortab[state->bai & 7]; /* floorcod */ + snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor; + floor >>= 5; + + exp = expbap->exp; + bap = expbap->bap; + + i = bndstart; + j = start; + if (start == 0) { /* not the coupling channel */ + int lowcomp; + + lowcomp = 0; + j = end - 1; + do { + if (i < j) { + if (exp[i+1] == exp[i] - 2) + lowcomp = 384; + else if (lowcomp && (exp[i+1] > exp[i])) + lowcomp -= 64; + } + psd = 128 * exp[i]; + mask = psd + fgain + lowcomp; + COMPUTE_MASK (); + bap[i] = (baptab+156)[mask + 4 * exp[i]]; + i++; + } while ((i < 3) || ((i < 7) && (exp[i] > exp[i-1]))); + fastleak = psd + fgain; + slowleak = psd + sgain; + + while (i < 7) { + if (i < j) { + if (exp[i+1] == exp[i] - 2) + lowcomp = 384; + else if (lowcomp && (exp[i+1] > exp[i])) + lowcomp -= 64; + } + psd = 128 * exp[i]; + UPDATE_LEAK (); + mask = ((fastleak + lowcomp < slowleak) ? + fastleak + lowcomp : slowleak); + COMPUTE_MASK (); + bap[i] = (baptab+156)[mask + 4 * exp[i]]; + i++; + } + + if (end == 7) /* lfe channel */ + return; + + do { + if (exp[i+1] == exp[i] - 2) + lowcomp = 320; + else if (lowcomp && (exp[i+1] > exp[i])) + lowcomp -= 64; + psd = 128 * exp[i]; + UPDATE_LEAK (); + mask = ((fastleak + lowcomp < slowleak) ? + fastleak + lowcomp : slowleak); + COMPUTE_MASK (); + bap[i] = (baptab+156)[mask + 4 * exp[i]]; + i++; + } while (i < 20); + + while (lowcomp > 128) { /* two iterations maximum */ + lowcomp -= 128; + psd = 128 * exp[i]; + UPDATE_LEAK (); + mask = ((fastleak + lowcomp < slowleak) ? + fastleak + lowcomp : slowleak); + COMPUTE_MASK (); + bap[i] = (baptab+156)[mask + 4 * exp[i]]; + i++; + } + j = i; + } + + do { + int startband, endband; + + startband = j; + endband = (bndtab[i-20] < end) ? bndtab[i-20] : end; + psd = 128 * exp[j++]; + while (j < endband) { + int next, delta; + + next = 128 * exp[j++]; + delta = next - psd; + switch (delta >> 9) { + case -6: case -5: case -4: case -3: case -2: + psd = next; + break; + case -1: + psd = next + latab[(-delta) >> 1]; + break; + case 0: + psd += latab[delta >> 1]; + break; + } + } + /* minpsd = -289 */ + UPDATE_LEAK (); + mask = (fastleak < slowleak) ? fastleak : slowleak; + COMPUTE_MASK (); + i++; + j = startband; + do { + /* max(mask+4*exp)=147=-(minpsd+fgain-deltba-snroffset)>>5+4*exp */ + /* min(mask+4*exp)=-156=-(sgain-deltba-snroffset)>>5 */ + bap[j] = (baptab+156)[mask + 4 * exp[j]]; + } while (++j < endband); + } while (j < end); +} Deleted: mplayerxp/libmpcodecs/liba52/bitstream.c =================================================================== --- mplayerxp/libmpcodecs/liba52/bitstream.c 2012-11-16 12:13:37 UTC (rev 385) +++ mplayerxp/libmpcodecs/liba52/bitstream.c 2012-11-16 13:12:42 UTC (rev 386) @@ -1,96 +0,0 @@ -/* - * bitstream.c - * Copyright (C) 2000-2002 Michel Lespinasse <wa...@zo...> - * Copyright (C) 1999-2000 Aaron Holtzman <aho...@es...> - * - * This file is part of a52dec, a mp_free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec is mp_free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * a52dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../../mp_config.h" - -#include <inttypes.h> - -#include "a52.h" -#include "a52_internal.h" -#include "bitstream.h" - -#define BUFFER_SIZE 4096 - -void a52_bitstream_set_ptr (a52_state_t * state, uint8_t * buf) -{ - int align; - - align = (long)buf & 3; - state->buffer_start = (uint32_t *) (buf - align); - state->bits_left = 0; - state->current_word = 0; - bitstream_get (state, align * 8); -} - -static inline void bitstream_fill_current (a52_state_t * state) -{ - uint32_t tmp; - - tmp = *(state->buffer_start++); - state->current_word = swab32 (tmp); -} - -/* - * The fast paths for _get is in the - * bitstream.h header file so it can be inlined. - * - * The "bottom half" of this routine is suffixed _bh - * - * -ah - */ - -uint32_t a52_bitstream_get_bh (a52_state_t * state, uint32_t num_bits) -{ - uint32_t result; - - num_bits -= state->bits_left; - result = ((state->current_word << (32 - state->bits_left)) >> - (32 - state->bits_left)); - - bitstream_fill_current (state); - - if (num_bits != 0) - result = (result << num_bits) | (state->current_word >> (32 - num_bits)); - - state->bits_left = 32 - num_bits; - - return result; -} - -... [truncated message content] |