[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[600] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-12-25 14:21:31
|
Revision: 600 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=600&view=rev Author: nickols_k Date: 2012-12-25 14:21:19 +0000 (Tue, 25 Dec 2012) Log Message: ----------- use references instead of pointer + minor redesign architecture of libmpcodecs Modified Paths: -------------- mplayerxp/dump.cpp mplayerxp/libmpcodecs/ad.cpp mplayerxp/libmpcodecs/ad.h mplayerxp/libmpcodecs/ad_a52.cpp mplayerxp/libmpcodecs/ad_acm.cpp mplayerxp/libmpcodecs/ad_dca.cpp mplayerxp/libmpcodecs/ad_dmo.cpp mplayerxp/libmpcodecs/ad_dshow.cpp mplayerxp/libmpcodecs/ad_dvdpcm.cpp mplayerxp/libmpcodecs/ad_faad.cpp mplayerxp/libmpcodecs/ad_hwac3.cpp mplayerxp/libmpcodecs/ad_internal.h mplayerxp/libmpcodecs/ad_lavc.cpp mplayerxp/libmpcodecs/ad_libdv.cpp mplayerxp/libmpcodecs/ad_mp3.cpp mplayerxp/libmpcodecs/ad_null.cpp mplayerxp/libmpcodecs/ad_pcm.cpp mplayerxp/libmpcodecs/ad_qtaudio.cpp mplayerxp/libmpcodecs/ad_real.cpp mplayerxp/libmpcodecs/ad_twin.cpp mplayerxp/libmpcodecs/ad_vorbis.cpp mplayerxp/libmpcodecs/dec_audio.cpp mplayerxp/libmpcodecs/dec_audio.h mplayerxp/libmpcodecs/dec_video.cpp mplayerxp/libmpcodecs/dec_video.h mplayerxp/libmpcodecs/vd.cpp mplayerxp/libmpcodecs/vd.h mplayerxp/libmpcodecs/vd_divx4.cpp mplayerxp/libmpcodecs/vd_dmo.cpp mplayerxp/libmpcodecs/vd_dshow.cpp mplayerxp/libmpcodecs/vd_huffyuv.cpp mplayerxp/libmpcodecs/vd_internal.h mplayerxp/libmpcodecs/vd_lavc.cpp mplayerxp/libmpcodecs/vd_libdv.cpp mplayerxp/libmpcodecs/vd_libmpeg2.cpp mplayerxp/libmpcodecs/vd_mpegpes.cpp mplayerxp/libmpcodecs/vd_null.cpp mplayerxp/libmpcodecs/vd_nuv.cpp mplayerxp/libmpcodecs/vd_qtvideo.cpp mplayerxp/libmpcodecs/vd_raw.cpp mplayerxp/libmpcodecs/vd_real.cpp mplayerxp/libmpcodecs/vd_theora.cpp mplayerxp/libmpcodecs/vd_vfw.cpp mplayerxp/libmpcodecs/vd_xanim.cpp mplayerxp/libmpcodecs/vd_xvid.cpp mplayerxp/libmpdemux/demux_avi.cpp mplayerxp/libmpdemux/demuxer_r.cpp mplayerxp/libmpdemux/demuxer_r.h mplayerxp/libmpstream2/network_asf.cpp mplayerxp/loader/afl.c mplayerxp/loader/dmo/DMO_AudioDecoder.c mplayerxp/loader/dmo/DMO_VideoDecoder.c mplayerxp/loader/dmo/Makefile mplayerxp/loader/dmo/buffer.c mplayerxp/loader/dmo/dmo.c mplayerxp/loader/driver.c mplayerxp/loader/dshow/DS_AudioDecoder.c mplayerxp/loader/dshow/DS_Filter.c mplayerxp/loader/dshow/DS_VideoDecoder.c mplayerxp/loader/dshow/Makefile mplayerxp/loader/dshow/allocator.c mplayerxp/loader/dshow/cmediasample.c mplayerxp/loader/dshow/inputpin.c mplayerxp/loader/dshow/outputpin.c mplayerxp/loader/ext.c mplayerxp/loader/ldt_keeper.c mplayerxp/loader/module.c mplayerxp/loader/pe_image.c mplayerxp/loader/registry.c mplayerxp/loader/vfl.c mplayerxp/loader/win32.c mplayerxp/mplayerxp.cpp mplayerxp/osdep/cpudetect.h mplayerxp/postproc/vf.cpp mplayerxp/xmpcore/xmp_adecoder.cpp mplayerxp/xmpcore/xmp_aplayer.cpp mplayerxp/xmpcore/xmp_vdecoder.cpp mplayerxp/xmpcore/xmp_vplayer.cpp Modified: mplayerxp/dump.cpp =================================================================== --- mplayerxp/dump.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/dump.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -338,7 +338,7 @@ seek_to_sec = NULL; MSG_INFO("seeking to %u seconds\n"); seek_p.secs=rel_seek_secs; - demux_seek_r(demuxer,&seek_p); + demux_seek_r(*demuxer,&seek_p); } aeof=sha?0:1; veof=shv?0:1; @@ -355,7 +355,7 @@ and don't generate badly interlaved stream. The ideal case is: type=read_packet(ANY_TYPE); put_packet(type); */ - in_size=ds_get_packet_r(sha->ds,&start,&a_pts); + in_size=ds_get_packet_r(*sha->ds,&start,a_pts); cmd = check_cmd(priv); if(cmd == -1) goto done; else @@ -420,7 +420,7 @@ float s_pts=0; while(s_pts < (shv?priv->vtimer:HUGE) || !shv || veof) /* autolimitation of sub reading */ { - in_size=ds_get_packet_r(demuxer->sub,&start,&s_pts); + in_size=ds_get_packet_r(*demuxer->sub,&start,s_pts); seof=demuxer->sub->eof; if(seof) break; cmd = check_cmd(priv); Modified: mplayerxp/libmpcodecs/ad.cpp =================================================================== --- mplayerxp/libmpcodecs/ad.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -77,23 +77,23 @@ } } -const ad_functions_t* afm_find_driver(const char *name) { +const ad_functions_t* afm_find_driver(const std::string& name) { unsigned i; for (i=0; mpcodecs_ad_drivers[i] != &mpcodecs_ad_null; i++) { - if(strcmp(mpcodecs_ad_drivers[i]->info->driver_name,name)==0){ + if(name==mpcodecs_ad_drivers[i]->info->driver_name){ return mpcodecs_ad_drivers[i]; } } return NULL; } -const audio_probe_t* afm_probe_driver(ad_private_t*ctx,sh_audio_t *sh,audio_filter_info_t* afi) { +const audio_probe_t* afm_probe_driver(Opaque& ctx,sh_audio_t *sh,audio_filter_info_t& afi) { unsigned i; const audio_probe_t* probe; for (i=0; mpcodecs_ad_drivers[i] != &mpcodecs_ad_null; i++) { MSG_V("Probing: %s\n",mpcodecs_ad_drivers[i]->info->driver_name); if((probe=mpcodecs_ad_drivers[i]->probe(sh->wtag))!=NULL) { - ad_private_t* priv=mpcodecs_ad_drivers[i]->preinit(probe,sh,afi); + Opaque* priv=mpcodecs_ad_drivers[i]->preinit(*probe,sh,afi); MSG_V("Driver: %s supports these outfmt for 0x%X wtag:\n" ,mpcodecs_ad_drivers[i]->info->driver_name,sh->wtag); for(i=0;i<Audio_MaxOutSample;i++) { @@ -101,7 +101,8 @@ if(probe->sample_fmt[i]==-1||probe->sample_fmt[i]==0) break; } MSG_V("\n"); - mpcodecs_ad_drivers[i]->uninit(priv); + mpcodecs_ad_drivers[i]->uninit(*priv); + delete priv; return probe; } } Modified: mplayerxp/libmpcodecs/ad.h =================================================================== --- mplayerxp/libmpcodecs/ad.h 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad.h 2012-12-25 14:21:19 UTC (rev 600) @@ -45,21 +45,20 @@ }; /* interface of video decoder drivers */ -struct ad_private_t; struct ad_functions_t { const ad_info_t* info; const config_t* options;/**< Optional: MPlayerXP's option related */ const audio_probe_t*(* __FASTCALL__ probe)(uint32_t wtag); - ad_private_t* (* __FASTCALL__ preinit)(const audio_probe_t*,sh_audio_t *,audio_filter_info_t*); - MPXP_Rc (* __FASTCALL__ init)(ad_private_t *ctx); - void (* __FASTCALL__ uninit)(ad_private_t *ctx); - MPXP_Rc (*control_ad)(ad_private_t *ctx,int cmd,any_t* arg, ...); - unsigned (* __FASTCALL__ decode)(ad_private_t *ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts); + Opaque* (* __FASTCALL__ preinit)(const audio_probe_t&,sh_audio_t*,audio_filter_info_t&); + MPXP_Rc (* __FASTCALL__ init)(Opaque& ctx); + void (* __FASTCALL__ uninit)(Opaque& ctx); + MPXP_Rc (*control_ad)(Opaque& ctx,int cmd,any_t* arg, ...); + unsigned (* __FASTCALL__ decode)(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts); }; -extern const ad_functions_t* afm_find_driver(const char *name); -extern const audio_probe_t* afm_probe_driver(ad_private_t*ctx,sh_audio_t*sh,audio_filter_info_t* afi); -#define FIX_APTS(sh_audio,pts,in_size) (sh_audio->i_bps?((float)(pts)+(float)(in_size)/(float)sh_audio->i_bps):((float)(pts))) +extern const ad_functions_t* afm_find_driver(const std::string& name); +extern const audio_probe_t* afm_probe_driver(Opaque& ctx,sh_audio_t*sh,audio_filter_info_t& afi); +inline float FIX_APTS(sh_audio_t* sh_audio,float& pts,unsigned in_size) { return sh_audio->i_bps?(pts+float(in_size))/float(sh_audio->i_bps):pts; } #endif Modified: mplayerxp/libmpcodecs/ad_a52.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_a52.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_a52.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -22,12 +22,17 @@ #include "libao3/audio_out.h" #include "postproc/af.h" -struct ad_private_t { +struct a52_private_t : public Opaque { + a52_private_t(); + virtual ~a52_private_t(); + sh_audio_t* sh; float last_pts; }; +a52_private_t::a52_private_t() {} +a52_private_t::~a52_private_t() {} -#define MAX_AC3_FRAME 3840 +static const int MAX_AC3_FRAME=3840; a52_state_t* mpxp_a52_state; uint32_t mpxp_a52_accel=0; @@ -64,20 +69,20 @@ return NULL; } -int a52_fillbuff(ad_private_t *priv,float *pts){ +int a52_fillbuff(a52_private_t& priv,float& pts){ int length=0; int flags=0; int sample_rate=0; int bit_rate=0; float apts=0.,null_pts; - sh_audio_t* sh_audio = priv->sh; + sh_audio_t* sh_audio = priv.sh; 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*/ + 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); @@ -92,9 +97,9 @@ 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); + 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; + 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; @@ -127,10 +132,10 @@ return (flags&A52_LFE) ? (channels+1) : channels; } -ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh,audio_filter_info_t* afi) +Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh,audio_filter_info_t& afi) { UNUSED(probe); - ad_private_t* ctx=new(zeromem) ad_private_t; + a52_private_t* ctx=new(zeromem) a52_private_t; /* Dolby AC3 audio: */ /* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ #ifdef WORDS_BIGENDIAN @@ -141,9 +146,9 @@ #define A52_FMT24 AFMT_S24_LE #endif sh->afmt=bps2afmt(2); - if(af_query_fmt(afi->afilter,mpaf_format_e(AFMT_FLOAT32)) == MPXP_Ok|| - af_query_fmt(afi->afilter,mpaf_format_e(A52_FMT32)) == MPXP_Ok || - af_query_fmt(afi->afilter,mpaf_format_e(A52_FMT24)) == MPXP_Ok) { + if(af_query_fmt(afi.afilter,mpaf_format_e(AFMT_FLOAT32)) == MPXP_Ok|| + af_query_fmt(afi.afilter,mpaf_format_e(A52_FMT32)) == MPXP_Ok || + af_query_fmt(afi.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; @@ -152,9 +157,10 @@ return ctx; } -MPXP_Rc init(ad_private_t *ctx) +MPXP_Rc init(Opaque& ctx) { - sh_audio_t* sh_audio = ctx->sh; + a52_private_t& priv=static_cast<a52_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; sample_t level=1, bias=384; float pts; int flags=0; @@ -165,12 +171,12 @@ MSG_ERR("A52 init failed\n"); return MPXP_False; } - if(a52_fillbuff(ctx,&pts)<0){ + if(a52_fillbuff(priv,pts)<0){ MSG_ERR("A52 sync failed\n"); return MPXP_False; } /* 'a52 cannot upmix' hotfix:*/ - a52_printinfo(ctx->sh); + a52_printinfo(priv.sh); sh_audio->nch=mp_conf.ao_channels; while(sh_audio->nch>0){ switch(sh_audio->nch){ @@ -206,14 +212,12 @@ return MPXP_Ok; } -void uninit(ad_private_t *ctx) -{ - delete ctx; -} +void uninit(Opaque& ctx) { UNUSED(ctx); } -MPXP_Rc control_ad(ad_private_t *ctx,int cmd,any_t* arg, ...) +MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - sh_audio_t* sh = ctx->sh; + a52_private_t& priv=static_cast<a52_private_t&>(ctx); + sh_audio_t* sh = priv.sh; UNUSED(arg); switch(cmd) { case ADCTRL_RESYNC_STREAM: @@ -221,7 +225,7 @@ return MPXP_True; case ADCTRL_SKIP_FRAME: { float pts; - a52_fillbuff(ctx,&pts); // skip AC3 frame + a52_fillbuff(priv,pts); // skip AC3 frame return MPXP_True; } default: @@ -230,9 +234,10 @@ return MPXP_Unknown; } -unsigned decode(ad_private_t *ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh_audio = ctx->sh; + a52_private_t& priv=static_cast<a52_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; sample_t level=1, bias=384; int flags=mpxp_a52_flags|A52_ADJUST_LEVEL; unsigned i; @@ -240,8 +245,8 @@ UNUSED(minlen); UNUSED(maxlen); if(!sh_audio->a_in_buffer_len) { - if(a52_fillbuff(ctx,pts)<0) return len; /* EOF */ - } else *pts=ctx->last_pts; + if(a52_fillbuff(priv,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"); Modified: mplayerxp/libmpcodecs/ad_acm.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_acm.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_acm.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -26,55 +26,60 @@ LIBAD_EXTERN(msacm) -struct ad_private_t { - float pts; - WAVEFORMATEX o_wf; // out format - HACMSTREAM srcstream; // handle - sh_audio_t* sh; +struct acm_private_t : public Opaque { + acm_private_t(); + virtual ~acm_private_t(); + + float pts; + WAVEFORMATEX o_wf; // out format + HACMSTREAM srcstream; // handle + sh_audio_t* sh; }; +acm_private_t::acm_private_t() {} +acm_private_t::~acm_private_t() {} static const audio_probe_t* __FASTCALL__ probe(uint32_t wtag) { return NULL; } -static int init_acm_audio_codec(ad_private_t *priv){ - sh_audio_t* sh_audio = priv->sh; +static int init_acm_audio_codec(acm_private_t& priv){ + sh_audio_t* sh_audio = priv.sh; HRESULT ret; WAVEFORMATEX *in_fmt=sh_audio->wf; unsigned int srcsize=0; MSG_V("======= Win32 (ACM) AUDIO Codec init =======\n"); - priv->srcstream=0; + priv.srcstream=0; - priv->o_wf.nChannels=sh_audio->nch; - priv->o_wf.nSamplesPerSec=sh_audio->rate; - priv->o_wf.nAvgBytesPerSec=2*priv->o_wf.nSamplesPerSec*priv->o_wf.nChannels; - priv->o_wf.wFormatTag=WAVE_FORMAT_PCM; - priv->o_wf.nBlockAlign=2*sh_audio->nch; - priv->o_wf.wBitsPerSample=sh_audio->afmt?afmt2bps(sh_audio->afmt)*8:16; - priv->o_wf.cbSize=0; + priv.o_wf.nChannels=sh_audio->nch; + priv.o_wf.nSamplesPerSec=sh_audio->rate; + priv.o_wf.nAvgBytesPerSec=2*priv.o_wf.nSamplesPerSec*priv.o_wf.nChannels; + priv.o_wf.wFormatTag=WAVE_FORMAT_PCM; + priv.o_wf.nBlockAlign=2*sh_audio->nch; + priv.o_wf.wBitsPerSample=sh_audio->afmt?afmt2bps(sh_audio->afmt)*8:16; + priv.o_wf.cbSize=0; if(!in_fmt) { in_fmt=sh_audio->wf=new(zeromem) WAVEFORMATEX; - memcpy(in_fmt,&priv->o_wf,sizeof(WAVEFORMATEX)); + memcpy(in_fmt,&priv.o_wf,sizeof(WAVEFORMATEX)); in_fmt->wFormatTag=sh_audio->wtag; } if(mp_conf.verbose) { MSG_V("Output fmt:\n"); - print_wave_header(&priv->o_wf,sizeof(WAVEFORMATEX)); + print_wave_header(&priv.o_wf,sizeof(WAVEFORMATEX)); } MSACM_RegisterDriver((const char *)sh_audio->codec->dll_name, sh_audio->wtag, 0); - ret=acmStreamOpen(&priv->srcstream,(HACMDRIVER)NULL,in_fmt,&priv->o_wf,NULL,0,0,0); + ret=acmStreamOpen(&priv.srcstream,(HACMDRIVER)NULL,in_fmt,&priv.o_wf,NULL,0,0,0); if(ret){ if(ret==ACMERR_NOTPOSSIBLE) MSG_ERR("ACM_Decoder: Unappropriate audio format\n"); else MSG_ERR("ACM_Decoder: acmStreamOpen error: %d", (int)ret); - priv->srcstream=0; + priv.srcstream=0; return 0; } MSG_V("Audio codec opened OK! ;-)\n"); - acmStreamSize(priv->srcstream, in_fmt->nBlockAlign, (LPDWORD)&srcsize, ACM_STREAMSIZEF_SOURCE); + acmStreamSize(priv.srcstream, in_fmt->nBlockAlign, (LPDWORD)&srcsize, ACM_STREAMSIZEF_SOURCE); srcsize*=2; //if(srcsize<MAX_OUTBURST) srcsize=MAX_OUTBURST; if(!srcsize){ @@ -87,14 +92,14 @@ sh_audio->audio_out_minsize=srcsize; // audio output min. size MSG_V("Audio ACM output buffer min. size: %ld\n",srcsize); - acmStreamSize(priv->srcstream, srcsize, (LPDWORD)&srcsize, ACM_STREAMSIZEF_DESTINATION); + acmStreamSize(priv.srcstream, srcsize, (LPDWORD)&srcsize, ACM_STREAMSIZEF_DESTINATION); if(srcsize<in_fmt->nBlockAlign) srcsize=2*in_fmt->nBlockAlign; sh_audio->audio_in_minsize=srcsize; // audio input min. size MSG_V("Audio ACM input buffer min. size: %ld\n",srcsize); sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec; - sh_audio->nch=priv->o_wf.nChannels; - sh_audio->rate=priv->o_wf.nSamplesPerSec; - sh_audio->afmt=bps2afmt((priv->o_wf.wBitsPerSample+7)/8); + sh_audio->nch=priv.o_wf.nChannels; + sh_audio->rate=priv.o_wf.nSamplesPerSec; + sh_audio->afmt=bps2afmt((priv.o_wf.wBitsPerSample+7)/8); sh_audio->a_in_buffer_size=2*sh_audio->audio_in_minsize; sh_audio->a_in_buffer=new char [sh_audio->a_in_buffer_size]; sh_audio->a_in_buffer_len=0; @@ -102,12 +107,11 @@ return 1; } -static int close_acm_audio_codec(ad_private_t *priv) +static int close_acm_audio_codec(acm_private_t& priv) { - sh_audio_t* sh_audio = priv->sh; HRESULT ret; - ret = acmStreamClose(priv->srcstream, 0); + ret = acmStreamClose(priv.srcstream, 0); if (ret) switch(ret) @@ -128,11 +132,12 @@ return 1; } -MPXP_Rc init(ad_private_t *priv) +MPXP_Rc init(Opaque& ctx) { - sh_audio_t* sh_audio = priv->sh; + acm_private_t& priv=static_cast<acm_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; float pts; - int ret=decode(priv,reinterpret_cast<unsigned char*>(sh_audio->a_buffer),4096,sh_audio->a_buffer_size,&pts); + int ret=decode(priv,reinterpret_cast<unsigned char*>(sh_audio->a_buffer),4096,sh_audio->a_buffer_size,pts); if(ret<0){ MSG_INFO("ACM decoding error: %d\n",ret); return MPXP_False; @@ -141,15 +146,15 @@ return MPXP_Ok; } -ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh_audio,audio_filter_info_t* afi) +Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh_audio,audio_filter_info_t& afi) { UNUSED(probe); UNUSED(afi); /* Win32 ACM audio codec: */ - ad_private_t *priv; - if(!(priv=new(zeromem) ad_private_t)) return NULL; + acm_private_t *priv; + if(!(priv=new(zeromem) acm_private_t)) return NULL; priv->sh = sh_audio; - if(!init_acm_audio_codec(priv)){ + if(!init_acm_audio_codec(*priv)){ MSG_ERR(MSGTR_ACMiniterror); delete priv; return NULL; @@ -158,16 +163,18 @@ return priv; } -void uninit(ad_private_t *p) +void uninit(Opaque& ctx) { - close_acm_audio_codec(p); - delete p; + acm_private_t& priv=static_cast<acm_private_t&>(ctx); + close_acm_audio_codec(priv); } -MPXP_Rc control_ad(ad_private_t *priv,int cmd,any_t* arg, ...) +MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - sh_audio_t* sh_audio = priv->sh; + acm_private_t& priv=static_cast<acm_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; int skip; + UNUSED(arg); switch(cmd) { // case ADCTRL_RESYNC_STREAM: // sh_audio->a_in_buffer_len=0;/* reset ACM/DShow audio buffer */ @@ -179,7 +186,7 @@ skip=(sh_audio->wf->nAvgBytesPerSec/16)&(~7); if(skip<16) skip=16; } - demux_read_data_r(sh_audio->ds,NULL,skip,&pts); + demux_read_data_r(*sh_audio->ds,NULL,skip,pts); return MPXP_True; } default: @@ -188,36 +195,37 @@ return MPXP_Unknown; } -unsigned decode(ad_private_t *priv,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh_audio = priv->sh; + acm_private_t& priv=static_cast<acm_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; ACMSTREAMHEADER ash; HRESULT hr; DWORD srcsize=0; DWORD len=minlen; - acmStreamSize(priv->srcstream,len , &srcsize, ACM_STREAMSIZEF_DESTINATION); + acmStreamSize(priv.srcstream,len , &srcsize, ACM_STREAMSIZEF_DESTINATION); MSG_V("acm says: srcsize=%ld (bufflen=%d size=%d) out_size=%d\n",srcsize,sh_audio->a_in_buffer_len,sh_audio->a_in_buffer_size,len); if(srcsize<sh_audio->wf->nBlockAlign){ srcsize=sh_audio->wf->nBlockAlign; - acmStreamSize(priv->srcstream, srcsize, &len, ACM_STREAMSIZEF_SOURCE); + acmStreamSize(priv.srcstream, srcsize, &len, ACM_STREAMSIZEF_SOURCE); MSG_V("acm says: srcsize=%ld (bufflen=%d size=%d) out_size=%d\n",srcsize,sh_audio->a_in_buffer_len,sh_audio->a_in_buffer_size,len); if(len>maxlen) len=maxlen; } - //if(srcsize==0) srcsize=priv->o_wf.nBlockAlign; + //if(srcsize==0) srcsize=priv.o_wf.nBlockAlign; if(srcsize>sh_audio->a_in_buffer_size) srcsize=sh_audio->a_in_buffer_size; // !!!!!! if(sh_audio->a_in_buffer_len<srcsize){ int l; - l = demux_read_data_r(sh_audio->ds,reinterpret_cast<unsigned char*>(&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len]), + l = demux_read_data_r(*sh_audio->ds,reinterpret_cast<unsigned char*>(&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len]), srcsize-sh_audio->a_in_buffer_len,pts); - *pts=FIX_APTS(sh_audio,*pts,-sh_audio->a_in_buffer_len); + pts=FIX_APTS(sh_audio,pts,-sh_audio->a_in_buffer_len); sh_audio->a_in_buffer_len+=l; - priv->pts=*pts; + priv.pts=pts; } - else *pts=priv->pts; + else pts=priv.pts; /* !!! NK: FINALY WE MUST KNOW size of output buffer after a_in_buffer_len modifying !!!! */ - acmStreamSize(priv->srcstream,sh_audio->a_in_buffer_len, &len, ACM_STREAMSIZEF_SOURCE); + acmStreamSize(priv.srcstream,sh_audio->a_in_buffer_len, &len, ACM_STREAMSIZEF_SOURCE); MSG_DBG2("acm convert %d -> %d bytes\n",sh_audio->a_in_buffer_len,len); memset(&ash, 0, sizeof(ash)); @@ -228,12 +236,12 @@ ash.cbSrcLength=sh_audio->a_in_buffer_len; ash.pbDst=buf; ash.cbDstLength=len; - hr=acmStreamPrepareHeader(priv->srcstream,&ash,0); + hr=acmStreamPrepareHeader(priv.srcstream,&ash,0); if(hr){ MSG_V("ACM_Decoder: acmStreamPrepareHeader error %d\n",(int)hr); return -1; } - hr=acmStreamConvert(priv->srcstream,&ash,0); + hr=acmStreamConvert(priv.srcstream,&ash,0); if(hr){ MSG_DBG2("ACM_Decoder: acmStreamConvert error %d\n",(int)hr); switch(hr) @@ -249,10 +257,10 @@ } else { sh_audio->a_in_buffer_len-=ash.cbSrcLengthUsed; memcpy(sh_audio->a_in_buffer,&sh_audio->a_in_buffer[ash.cbSrcLengthUsed],sh_audio->a_in_buffer_len); - priv->pts=FIX_APTS(sh_audio,priv->pts,ash.cbSrcLengthUsed); + priv.pts=FIX_APTS(sh_audio,priv.pts,ash.cbSrcLengthUsed); } len=ash.cbDstLengthUsed; - hr=acmStreamUnprepareHeader(priv->srcstream,&ash,0); + hr=acmStreamUnprepareHeader(priv.srcstream,&ash,0); if(hr){ MSG_V("ACM_Decoder: acmStreamUnprepareHeader error %d\n",(int)hr); } Modified: mplayerxp/libmpcodecs/ad_dca.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_dca.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_dca.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -22,16 +22,21 @@ #include "libao3/audio_out.h" #include "postproc/af.h" -#define MAX_AC5_FRAME 4096 +static const unsigned MAX_AC5_FRAME=4096; dca_state_t* mpxp_dca_state; uint32_t mpxp_dca_accel=0; uint32_t mpxp_dca_flags=0; -struct ad_private_t { +struct dca_private_t : public Opaque { + dca_private_t(); + virtual ~dca_private_t(); + float last_pts; sh_audio_t* sh; }; +dca_private_t::dca_private_t() {} +dca_private_t::~dca_private_t() {} static const ad_info_t info = { "DTS Coherent Acoustics", @@ -66,20 +71,19 @@ return NULL; } -int dca_fillbuff(ad_private_t *priv,float *pts){ +int dca_fillbuff(dca_private_t& priv,float& pts){ int length=0,flen=0; int flags=0; int sample_rate=0; int bit_rate=0; float apts=0.,null_pts; - sh_audio_t* sh_audio = priv->sh; - + sh_audio_t* sh_audio=priv.sh; 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*/ + 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); @@ -92,8 +96,8 @@ 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; + 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; } @@ -125,7 +129,7 @@ return (flags&DCA_LFE) ? (channels+1) : channels; } -ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh,audio_filter_info_t* afi) +Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh,audio_filter_info_t& afi) { UNUSED(probe); /* DTS audio: @@ -138,22 +142,23 @@ #define DCA_FMT24 AFMT_S24_LE #endif sh->afmt=bps2afmt(2); - if( af_query_fmt(afi->afilter,afmt2mpaf(AFMT_FLOAT32)) == MPXP_Ok|| - af_query_fmt(afi->afilter,afmt2mpaf(DCA_FMT32)) == MPXP_Ok || - af_query_fmt(afi->afilter,afmt2mpaf(DCA_FMT24)) == MPXP_Ok) + if( af_query_fmt(afi.afilter,afmt2mpaf(AFMT_FLOAT32)) == MPXP_Ok|| + af_query_fmt(afi.afilter,afmt2mpaf(DCA_FMT32)) == MPXP_Ok || + af_query_fmt(afi.afilter,afmt2mpaf(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; - ad_private_t* priv = new(zeromem) ad_private_t; + dca_private_t* priv = new(zeromem) dca_private_t; priv->sh = sh; return priv; } -MPXP_Rc init(ad_private_t *priv) +MPXP_Rc init(Opaque& ctx) { - sh_audio_t* sh_audio = priv->sh; + dca_private_t& priv=static_cast<dca_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; sample_t level=1, bias=384; float pts; int flags=0; @@ -164,7 +169,7 @@ MSG_ERR("dca init failed\n"); return MPXP_False; } - if(dca_fillbuff(priv,&pts)<0){ + if(dca_fillbuff(priv,pts)<0){ MSG_ERR("dca sync failed\n"); return MPXP_False; } @@ -204,14 +209,12 @@ return MPXP_Ok; } -void uninit(ad_private_t *ctx) -{ - delete ctx; -} +void uninit(Opaque& ctx) { UNUSED(ctx); } -MPXP_Rc control_ad(ad_private_t *priv,int cmd,any_t* arg, ...) +MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - sh_audio_t* sh = priv->sh; + dca_private_t& priv=static_cast<dca_private_t&>(ctx); + sh_audio_t* sh = priv.sh; UNUSED(arg); switch(cmd) { case ADCTRL_RESYNC_STREAM: @@ -219,7 +222,7 @@ return MPXP_True; case ADCTRL_SKIP_FRAME: { float pts; - dca_fillbuff(priv,&pts); // skip AC3 frame + dca_fillbuff(priv,pts); // skip AC3 frame return MPXP_True; } default: @@ -228,18 +231,19 @@ return MPXP_Unknown; } -unsigned decode(ad_private_t *priv,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { + dca_private_t& priv=static_cast<dca_private_t&>(ctx); sample_t level=1, bias=384; unsigned i,nblocks,flags=mpxp_dca_flags|DCA_ADJUST_LEVEL; unsigned len=0; - sh_audio_t* sh_audio = priv->sh; + sh_audio_t* sh_audio = priv.sh; UNUSED(minlen); UNUSED(maxlen); if(!sh_audio->a_in_buffer_len) { if(dca_fillbuff(priv,pts)<0) return len; /* EOF */ } - else *pts=priv->last_pts; + 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"); Modified: mplayerxp/libmpcodecs/ad_dmo.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_dmo.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_dmo.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -28,28 +28,35 @@ #include "loader/dmo/DMO_AudioDecoder.h" -struct ad_private_t { +struct admo_private_t : public Opaque { + admo_private_t(); + virtual ~admo_private_t(); + float pts; DMO_AudioDecoder* ds_adec; sh_audio_t* sh; }; +admo_private_t::admo_private_t() {} +admo_private_t::~admo_private_t() { + DMO_AudioDecoder_Destroy(ds_adec); +} static const audio_probe_t* __FASTCALL__ probe(uint32_t wtag) { return NULL; } -static MPXP_Rc init(ad_private_t *p) +static MPXP_Rc init(admo_private_t *p) { UNUSED(p); return MPXP_Ok; } -static ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh_audio,audio_filter_info_t* afi) +static Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh_audio,audio_filter_info_t& afi) { UNUSED(probe); UNUSED(afi); - ad_private_t*priv; + admo_private_t*priv; int chans=(mp_conf.ao_channels==sh_audio->wf->nChannels) ? mp_conf.ao_channels : (sh_audio->wf->nChannels>=2 ? 2 : 1); - if(!(priv=new(zeromem) ad_private_t)) return NULL; + if(!(priv=new(zeromem) admo_private_t)) return NULL; priv->sh=sh_audio; if(!(priv->ds_adec=DMO_AudioDecoder_Open(sh_audio->codec->dll_name,&sh_audio->codec->guid,sh_audio->wf,chans))) { MSG_ERR(MSGTR_MissingDLLcodec,sh_audio->codec->dll_name); @@ -66,15 +73,12 @@ return priv; } -static void uninit(ad_private_t *priv) -{ - DMO_AudioDecoder_Destroy(priv->ds_adec); - delete priv; -} +static void uninit(Opaque& ctx) { UNUSED(ctx); } -static MPXP_Rc control_ad(ad_private_t *priv,int cmd,any_t* arg, ...) +static MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - sh_audio_t* sh_audio = priv->sh; + admo_private_t& priv=static_cast<admo_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; int skip; UNUSED(arg); switch(cmd) { @@ -85,42 +89,43 @@ skip=(sh_audio->wf->nAvgBytesPerSec/16)&(~7); if(skip<16) skip=16; } - demux_read_data_r(sh_audio->ds,NULL,skip,&pts); + demux_read_data_r(*sh_audio->ds,NULL,skip,pts); return MPXP_True; } } return MPXP_Unknown; } -static unsigned decode(ad_private_t *priv,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +static unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh_audio = priv->sh; + admo_private_t& priv=static_cast<admo_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; unsigned len=0; UNUSED(minlen); { unsigned size_in=0; unsigned size_out=0; - unsigned srcsize=DMO_AudioDecoder_GetSrcSize(priv->ds_adec, maxlen); + unsigned srcsize=DMO_AudioDecoder_GetSrcSize(priv.ds_adec, maxlen); MSG_DBG2("DMO says: srcsize=%d (buffsize=%d) out_size=%d\n",srcsize,sh_audio->a_in_buffer_size,maxlen); if(srcsize>sh_audio->a_in_buffer_size) srcsize=sh_audio->a_in_buffer_size; // !!!!!! if((unsigned)sh_audio->a_in_buffer_len<srcsize){ unsigned l; - l=demux_read_data_r(sh_audio->ds,reinterpret_cast<unsigned char*>(&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len]), + l=demux_read_data_r(*sh_audio->ds,reinterpret_cast<unsigned char*>(&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len]), srcsize-sh_audio->a_in_buffer_len,pts); sh_audio->a_in_buffer_len+=l; - priv->pts=*pts; + priv.pts=pts; } - else *pts=priv->pts; - DMO_AudioDecoder_Convert(priv->ds_adec, sh_audio->a_in_buffer,sh_audio->a_in_buffer_len, + else pts=priv.pts; + DMO_AudioDecoder_Convert(priv.ds_adec, sh_audio->a_in_buffer,sh_audio->a_in_buffer_len, buf,maxlen, &size_in,&size_out); MSG_DBG2("DMO: audio %d -> %d converted (in_buf_len=%d of %d) %f\n" - ,size_in,size_out,sh_audio->a_in_buffer_len,sh_audio->a_in_buffer_size,*pts); + ,size_in,size_out,sh_audio->a_in_buffer_len,sh_audio->a_in_buffer_size,pts); if(size_in>=(unsigned)sh_audio->a_in_buffer_len){ sh_audio->a_in_buffer_len=0; } else { sh_audio->a_in_buffer_len-=size_in; memcpy(sh_audio->a_in_buffer,&sh_audio->a_in_buffer[size_in],sh_audio->a_in_buffer_len); - priv->pts=FIX_APTS(sh_audio,priv->pts,size_in); + priv.pts=FIX_APTS(sh_audio,priv.pts,size_in); } len=size_out; } Modified: mplayerxp/libmpcodecs/ad_dshow.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_dshow.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_dshow.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -23,26 +23,33 @@ LIBAD_EXTERN(dshow) -struct ad_private_t { +struct adshow_private_t : public Opaque { + adshow_private_t(); + virtual ~adshow_private_t(); + float pts; DS_AudioDecoder* ds_adec; sh_audio_t* sh; }; +adshow_private_t::adshow_private_t() {} +adshow_private_t::~adshow_private_t() { + DS_AudioDecoder_Destroy(ds_adec); +} static const audio_probe_t* __FASTCALL__ probe(uint32_t wtag) { return NULL; } -MPXP_Rc init(ad_private_t *p) +MPXP_Rc init(Opaque& ctx) { - UNUSED(p); + UNUSED(ctx); return MPXP_Ok; } -ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh_audio,audio_filter_info_t* afi) +Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh_audio,audio_filter_info_t& afi) { UNUSED(probe); UNUSED(afi); - ad_private_t *priv; - if(!(priv=new(zeromem) ad_private_t)) return NULL; + adshow_private_t *priv; + if(!(priv=new(zeromem) adshow_private_t)) return NULL; priv->sh = sh_audio; if(!(priv->ds_adec=DS_AudioDecoder_Open(sh_audio->codec->dll_name,&sh_audio->codec->guid,sh_audio->wf))) { MSG_ERR(MSGTR_MissingDLLcodec,sh_audio->codec->dll_name); @@ -59,15 +66,13 @@ return priv; } -void uninit(ad_private_t *priv) -{ - DS_AudioDecoder_Destroy(priv->ds_adec); - delete priv; -} +void uninit(Opaque& ctx) { UNUSED(ctx); } -MPXP_Rc control_ad(ad_private_t *p,int cmd,any_t* arg, ...) + +MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - sh_audio_t* sh_audio = p->sh; + adshow_private_t& priv=static_cast<adshow_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; int skip; UNUSED(arg); switch(cmd) { @@ -81,7 +86,7 @@ skip=(sh_audio->wf->nAvgBytesPerSec/16)&(~7); if(skip<16) skip=16; } - demux_read_data_r(sh_audio->ds,NULL,skip,&pts); + demux_read_data_r(*sh_audio->ds,NULL,skip,pts); } return MPXP_True; default: @@ -90,34 +95,35 @@ return MPXP_Unknown; } -unsigned decode(ad_private_t *priv,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh_audio = priv->sh; + adshow_private_t& priv=static_cast<adshow_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; unsigned len=0; UNUSED(minlen); { unsigned size_in=0; unsigned size_out=0; - unsigned srcsize=DS_AudioDecoder_GetSrcSize(priv->ds_adec, maxlen); + unsigned srcsize=DS_AudioDecoder_GetSrcSize(priv.ds_adec, maxlen); MSG_DBG3("DShow says: srcsize=%d (buffsize=%d) out_size=%d\n",srcsize,sh_audio->a_in_buffer_size,maxlen); if(srcsize>sh_audio->a_in_buffer_size) srcsize=sh_audio->a_in_buffer_size; // !!!!!! if((unsigned)sh_audio->a_in_buffer_len<srcsize){ unsigned l; - l=demux_read_data_r(sh_audio->ds,reinterpret_cast<unsigned char*>(&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len]), + l=demux_read_data_r(*sh_audio->ds,reinterpret_cast<unsigned char*>(&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len]), srcsize-sh_audio->a_in_buffer_len,pts); sh_audio->a_in_buffer_len+=l; - priv->pts=*pts; + priv.pts=pts; } - else *pts=priv->pts; - DS_AudioDecoder_Convert(priv->ds_adec, reinterpret_cast<unsigned char*>(sh_audio->a_in_buffer),sh_audio->a_in_buffer_len, + else pts=priv.pts; + DS_AudioDecoder_Convert(priv.ds_adec, reinterpret_cast<unsigned char*>(sh_audio->a_in_buffer),sh_audio->a_in_buffer_len, buf,maxlen, &size_in,&size_out); MSG_DBG2("DShow: audio %d -> %d converted (in_buf_len=%d of %d) %f\n" - ,size_in,size_out,sh_audio->a_in_buffer_len,sh_audio->a_in_buffer_size,*pts); + ,size_in,size_out,sh_audio->a_in_buffer_len,sh_audio->a_in_buffer_size,pts); if(size_in>=(unsigned)sh_audio->a_in_buffer_len){ sh_audio->a_in_buffer_len=0; } else { sh_audio->a_in_buffer_len-=size_in; memcpy(sh_audio->a_in_buffer,&sh_audio->a_in_buffer[size_in],sh_audio->a_in_buffer_len); - priv->pts=FIX_APTS(sh_audio,priv->pts,size_in); + priv.pts=FIX_APTS(sh_audio,priv.pts,size_in); } len=size_out; } Modified: mplayerxp/libmpcodecs/ad_dvdpcm.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_dvdpcm.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_dvdpcm.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -8,9 +8,14 @@ #include "osdep/bswap.h" #include "libao3/afmt.h" -struct ad_private_t { +struct dvdpcm_private_t : public Opaque { + dvdpcm_private_t(); + virtual ~dvdpcm_private_t(); + sh_audio_t* sh; }; +dvdpcm_private_t::dvdpcm_private_t() {} +dvdpcm_private_t::~dvdpcm_private_t() {} static const ad_info_t info = { "Uncompressed DVD/VOB LPCM audio decoder", @@ -38,10 +43,11 @@ return NULL; } -MPXP_Rc init(ad_private_t *priv) +MPXP_Rc init(Opaque& ctx) { + dvdpcm_private_t& priv=static_cast<dvdpcm_private_t&>(ctx); /* DVD PCM Audio:*/ - sh_audio_t* sh = priv->sh; + sh_audio_t* sh = priv.sh; sh->i_bps = 0; if(sh->codecdata_len==3){ // we have LPCM header: @@ -77,24 +83,22 @@ return MPXP_Ok; } -ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh,audio_filter_info_t* afi) +Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh,audio_filter_info_t& afi) { UNUSED(probe); UNUSED(afi); sh->audio_out_minsize=2048; - ad_private_t* priv = new(zeromem) ad_private_t; + dvdpcm_private_t* priv = new(zeromem) dvdpcm_private_t; priv->sh = sh; return priv; } -void uninit(ad_private_t *priv) -{ - delete priv; -} +void uninit(Opaque& priv) { UNUSED(priv); } -MPXP_Rc control_ad(ad_private_t *priv,int cmd,any_t* arg, ...) +MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - sh_audio_t* sh = priv->sh; + dvdpcm_private_t& priv=static_cast<dvdpcm_private_t&>(ctx); + sh_audio_t* sh = priv.sh; int skip; UNUSED(arg); switch(cmd) { @@ -102,7 +106,7 @@ float pts; skip=sh->i_bps/16; skip=skip&(~3); - demux_read_data_r(sh->ds,NULL,skip,&pts); + demux_read_data_r(*sh->ds,NULL,skip,pts); return MPXP_True; } default: @@ -111,21 +115,22 @@ return MPXP_Unknown; } -unsigned decode(ad_private_t *priv,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +unsigned decode(Opaque &ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh_audio = priv->sh; - unsigned j; - unsigned len; - float null_pts; - UNUSED(maxlen); - if (afmt2bps(sh_audio->afmt) == 3) { - if (((sh_audio->codecdata[1] >> 6) & 3) == 1) { + dvdpcm_private_t& priv=static_cast<dvdpcm_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; + unsigned j; + unsigned len; + float null_pts; + UNUSED(maxlen); + if (afmt2bps(sh_audio->afmt) == 3) { + if (((sh_audio->codecdata[1] >> 6) & 3) == 1) { // 20 bit // not sure if the "& 0xf0" and "<< 4" are the right way around // can somebody clarify? for (j = 0; j < minlen; j += 12) { unsigned char tmp[10]; - len = demux_read_data_r(sh_audio->ds, tmp, 10,j?&null_pts:pts); + len = demux_read_data_r(*sh_audio->ds, tmp, 10,j?null_pts:pts); if (len < 10) break; // first sample buf[j + 0] = tmp[0]; @@ -149,7 +154,7 @@ // 24 bit for (j = 0; j < minlen; j += 12) { unsigned char tmp[12]; - len = demux_read_data_r(sh_audio->ds, tmp, 12, j?&null_pts:pts); + len = demux_read_data_r(*sh_audio->ds, tmp, 12, j?null_pts:pts); if (len < 12) break; // first sample buf[j + 0] = tmp[0]; @@ -171,6 +176,6 @@ len = j; } } else - len=demux_read_data_r(sh_audio->ds,buf,(minlen+3)&(~3),pts); + len=demux_read_data_r(*sh_audio->ds,buf,(minlen+3)&(~3),pts); return len; } Modified: mplayerxp/libmpcodecs/ad_faad.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_faad.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_faad.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -35,11 +35,16 @@ LIBAD_EXTERN(faad) -struct ad_private_t { +struct faad_private_t : public Opaque { + faad_private_t(); + virtual ~faad_private_t(); + float pts; sh_audio_t* sh; audio_filter_info_t* afi; }; +faad_private_t::faad_private_t() {} +faad_private_t::~faad_private_t() {} static const audio_probe_t probes[] = { { "faad", "libfaad"SLIBSUFFIX, 0xFF, ACodecStatus_Working, {AFMT_FLOAT32, AFMT_S24_LE, AFMT_S16_LE} }, @@ -103,11 +108,11 @@ /* PS: 0: off, 1: on */ unsigned char ps; } NeAACDecFrameInfo; -#define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */ +static const int 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) +static const int FAAD_MAX_CHANNELS=6; +static const int FAAD_BUFFLEN=(FAAD_MIN_STREAMSIZE*FAAD_MAX_CHANNELS); #ifdef _WIN32 #pragma pack(push, 8) #ifndef NEAACDECAPI @@ -179,23 +184,24 @@ } -static ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh,audio_filter_info_t* afi) +static Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh,audio_filter_info_t& afi) { sh->audio_out_minsize=8192*FAAD_MAX_CHANNELS; sh->audio_in_minsize=FAAD_BUFFLEN; - ad_private_t* priv = new(zeromem) ad_private_t; + faad_private_t* priv = new(zeromem) faad_private_t; priv->sh = sh; - priv->afi = afi; - if(load_dll(probe->codec_dll)!=MPXP_Ok) { + priv->afi = &afi; + if(load_dll(probe.codec_dll)!=MPXP_Ok) { delete priv; return NULL; } return priv; } -static MPXP_Rc init(ad_private_t *priv) +static MPXP_Rc init(Opaque& ctx) { - sh_audio_t* sh = priv->sh; + faad_private_t& priv=static_cast<faad_private_t&>(ctx); + sh_audio_t* sh = priv.sh; unsigned long NeAAC_samplerate; unsigned char NeAAC_channels; float pts; @@ -224,9 +230,9 @@ #endif /* Set the maximal quality */ /* This is useful for expesive audio cards */ - if(af_query_fmt(priv->afi->afilter,afmt2mpaf(AFMT_FLOAT32)) == MPXP_Ok || - af_query_fmt(priv->afi->afilter,afmt2mpaf(NeAAC_FMT32)) == MPXP_Ok || - af_query_fmt(priv->afi->afilter,afmt2mpaf(NeAAC_FMT24)) == MPXP_Ok) { + if(af_query_fmt(priv.afi->afilter,afmt2mpaf(AFMT_FLOAT32)) == MPXP_Ok || + af_query_fmt(priv.afi->afilter,afmt2mpaf(NeAAC_FMT32)) == MPXP_Ok || + af_query_fmt(priv.afi->afilter,afmt2mpaf(NeAAC_FMT24)) == MPXP_Ok) { sh->afmt=AFMT_FLOAT32; NeAAC_conf->outputFormat=FAAD_FMT_FLOAT; } else { @@ -236,7 +242,7 @@ /* 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); + 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, @@ -276,24 +282,25 @@ return MPXP_Ok; } -static void uninit(ad_private_t *priv) +static void uninit(Opaque& ctx) { + UNUSED(ctx); MSG_V("FAAD: Closing decoder!\n"); NeAACDecClose(NeAAC_hdec); - delete priv; } -static MPXP_Rc control_ad(ad_private_t *priv,int cmd,any_t* arg, ...) +static MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - UNUSED(priv); + UNUSED(ctx); UNUSED(cmd); UNUSED(arg); return MPXP_Unknown; } -static unsigned decode(ad_private_t *priv,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +static unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh = priv->sh; + faad_private_t& priv=static_cast<faad_private_t&>(ctx); + sh_audio_t* sh = priv.sh; int j = 0; unsigned len = 0; any_t*NeAAC_sample_buffer; @@ -305,12 +312,12 @@ { 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]), + 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; + pts=FIX_APTS(sh,pts,-sh->a_in_buffer_len); + priv.pts=pts; } - else *pts=priv->pts; + else pts=priv.pts; #ifdef DUMP_AAC_COMPRESSED {unsigned i; for (i = 0; i < 16; i++) @@ -329,7 +336,7 @@ } 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); + priv.pts=FIX_APTS(sh,priv.pts,NeAAC_finfo.bytesconsumed); } if(NeAAC_finfo.error > 0) { @@ -342,7 +349,7 @@ } else { // packetized (.mp4) aac stream: unsigned char* bufptr=NULL; - int buflen=ds_get_packet_r(sh->ds, &bufptr,pts); + 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); Modified: mplayerxp/libmpcodecs/ad_hwac3.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_hwac3.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_hwac3.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -16,9 +16,12 @@ #include "osdep/bswap.h" #include "libao3/afmt.h" -#define IEC61937_DATA_TYPE_AC3 1 +static const int IEC61937_DATA_TYPE_AC3=1; -struct ad_private_t { +struct a52_private_t : public Opaque { + a52_private_t(); + virtual ~a52_private_t(); + sh_audio_t* sh; float last_pts; }; @@ -143,7 +146,7 @@ extern a52_state_t *mpxp_a52_state; extern uint32_t mpxp_a52_accel; extern uint32_t mpxp_a52_flags; -int a52_fillbuff(ad_private_t *sh_audio,float *pts); +int a52_fillbuff(a52_private_t& sh_audio,float& pts); static const ad_info_t info = { "AC3/DTS pass-through S/PDIF", @@ -159,7 +162,7 @@ LIBAD_EXTERN(hwac3) extern ad_functions_t mpcodecs_ad_a52; -static a52_state_t * (*a52_init_ptr) (uint32_t mm_accel); +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[] = { @@ -180,11 +183,11 @@ } -ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh,audio_filter_info_t* afi) +Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh,audio_filter_info_t& afi) { UNUSED(probe); /* Dolby AC3 audio: */ - ad_private_t* ctx=mpcodecs_ad_a52.preinit(probe,sh,afi); + Opaque* ctx=mpcodecs_ad_a52.preinit(probe,sh,afi); sh->audio_out_minsize=4*256*6; sh->audio_in_minsize=3840; sh->nch=2; @@ -192,9 +195,10 @@ return ctx; } -MPXP_Rc init(ad_private_t *ctx) +MPXP_Rc init(Opaque& ctx) { - sh_audio_t* sh_audio = ctx->sh; + a52_private_t& priv=static_cast<a52_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; /* Dolby AC3 passthrough:*/ float pts; mpxp_a52_state=a52_init (mpxp_a52_accel); /* doesn't require mmx optimzation */ @@ -202,7 +206,7 @@ MSG_ERR("A52 init failed\n"); return MPXP_False; } - if(a52_fillbuff(ctx,&pts)<0) { + if(a52_fillbuff(priv,pts)<0) { MSG_ERR("A52 sync failed\n"); return MPXP_False; } @@ -220,14 +224,15 @@ return MPXP_Ok; } -void uninit(ad_private_t *ctx) +void uninit(Opaque& ctx) { mpcodecs_ad_a52.uninit(ctx); } -MPXP_Rc control_ad(ad_private_t *ctx,int cmd,any_t* arg, ...) +MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { - sh_audio_t* sh = ctx->sh; + a52_private_t& priv=static_cast<a52_private_t&>(ctx); + sh_audio_t* sh = priv.sh; UNUSED(arg); switch(cmd) { case ADCTRL_RESYNC_STREAM: @@ -235,7 +240,7 @@ return MPXP_True; case ADCTRL_SKIP_FRAME: { float pts; - a52_fillbuff(ctx,&pts); // skip AC3 frame + a52_fillbuff(priv,pts); // skip AC3 frame return MPXP_True; } default: @@ -244,15 +249,16 @@ return MPXP_Unknown; } -unsigned decode(ad_private_t *ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh_audio = ctx->sh; - unsigned len=0; - UNUSED(minlen); - UNUSED(maxlen); - if(!sh_audio->a_in_buffer_len) - if((int)(len=a52_fillbuff(ctx,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; + a52_private_t& priv=static_cast<a52_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; + unsigned len=0; + UNUSED(minlen); + UNUSED(maxlen); + if(!sh_audio->a_in_buffer_len) + if((int)(len=a52_fillbuff(priv,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-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_internal.h 2012-12-25 14:21:19 UTC (rev 600) @@ -9,11 +9,11 @@ #include "ad_msg.h" static const audio_probe_t* __FASTCALL__ probe(uint32_t wtag); -static MPXP_Rc __FASTCALL__ init(ad_private_t *ctx); -static ad_private_t* __FASTCALL__ preinit(const audio_probe_t* probe,sh_audio_t *ctx,audio_filter_info_t* afi); -static void __FASTCALL__ uninit(ad_private_t *ctx); -static MPXP_Rc control_ad(ad_private_t *ctx,int cmd,any_t* arg, ...); -static unsigned __FASTCALL__ decode(ad_private_t *ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts); +static MPXP_Rc __FASTCALL__ init(Opaque& ctx); +static Opaque* __FASTCALL__ preinit(const audio_probe_t& probe,sh_audio_t *ctx,audio_filter_info_t& afi); +static void __FASTCALL__ uninit(Opaque& ctx); +static MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...); +static unsigned __FASTCALL__ decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts); #define LIBAD_EXTERN(x) extern const ad_functions_t mpcodecs_ad_##x = {\ &info,\ Modified: mplayerxp/libmpcodecs/ad_lavc.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_lavc.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_lavc.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -18,11 +18,22 @@ #include "mpxp_conf_lavc.h" #include "codecs_ld.h" -struct ad_private_t { +struct alavc_private_t : public Opaque { + alavc_private_t(); + virtual ~alavc_private_t(); + AVCodecContext* lavc_ctx; sh_audio_t* sh; audio_filter_info_t* afi; }; +alavc_private_t::alavc_private_t() {} +alavc_private_t::~alavc_private_t() { + if(lavc_ctx) { + avcodec_close(lavc_ctx); + if (lavc_ctx->extradata) delete lavc_ctx->extradata; + delete lavc_ctx; + } +} static const audio_probe_t* __FASTCALL__ probe(uint32_t wtag) { unsigned i; @@ -53,8 +64,7 @@ return acodec; } -struct codecs_st* __FASTCALL__ find_lavc_audio(ad_private_t* priv) { - sh_audio_t* sh = priv->sh; +struct codecs_st* __FASTCALL__ find_lavc_audio(sh_audio_t* sh) { const audio_probe_t* aprobe=probe(sh->wtag); struct codecs_st* acodec = NULL; if(aprobe) { @@ -84,22 +94,23 @@ LIBAD_EXTERN(lavc) -ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh,audio_filter_info_t* afi) +Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh,audio_filter_info_t& afi) { UNUSED(probe); - ad_private_t* priv = new(zeromem) ad_private_t; + alavc_private_t* priv = new(zeromem) alavc_private_t; sh->audio_out_minsize=AVCODEC_MAX_AUDIO_FRAME_SIZE; priv->sh = sh; - priv->afi = afi; + priv->afi = &afi; return priv; } -MPXP_Rc init(ad_private_t *priv) +MPXP_Rc init(Opaque& ctx) { + alavc_private_t& priv=static_cast<alavc_private_t&>(ctx); int x; float pts; AVCodec *lavc_codec=NULL; - sh_audio_t* sh_audio = priv->sh; + sh_audio_t* sh_audio = priv.sh; MSG_V("LAVC audio codec\n"); // avcodec_init(); avcodec_register_all(); @@ -109,45 +120,45 @@ MSG_ERR(MSGTR_MissingLAVCcodec,sh_audio->codec->dll_name); return MPXP_False; } - priv->lavc_ctx = avcodec_alloc_context3(lavc_codec); + priv.lavc_ctx = avcodec_alloc_context3(lavc_codec); if(sh_audio->wf) { - priv->lavc_ctx->channels = sh_audio->wf->nChannels; - priv->lavc_ctx->sample_rate = sh_audio->wf->nSamplesPerSec; - priv->lavc_ctx->bit_rate = sh_audio->wf->nAvgBytesPerSec * 8; - priv->lavc_ctx->block_align = sh_audio->wf->nBlockAlign; - priv->lavc_ctx->bits_per_coded_sample = sh_audio->wf->wBitsPerSample; + priv.lavc_ctx->channels = sh_audio->wf->nChannels; + priv.lavc_ctx->sample_rate = sh_audio->wf->nSamplesPerSec; + priv.lavc_ctx->bit_rate = sh_audio->wf->nAvgBytesPerSec * 8; + priv.lavc_ctx->block_align = sh_audio->wf->nBlockAlign; + priv.lavc_ctx->bits_per_coded_sample = sh_audio->wf->wBitsPerSample; /* alloc extra data */ if (sh_audio->wf->cbSize > 0) { - priv->lavc_ctx->extradata = new uint8_t[sh_audio->wf->cbSize+FF_INPUT_BUFFER_PADDING_SIZE]; - priv->lavc_ctx->extradata_size = sh_audio->wf->cbSize; - memcpy(priv->lavc_ctx->extradata, (char *)sh_audio->wf + sizeof(WAVEFORMATEX), - priv->lavc_ctx->extradata_size); + priv.lavc_ctx->extradata = new uint8_t[sh_audio->wf->cbSize+FF_INPUT_BUFFER_PADDING_SIZE]; + priv.lavc_ctx->extradata_size = sh_audio->wf->cbSize; + memcpy(priv.lavc_ctx->extradata, (char *)sh_audio->wf + sizeof(WAVEFORMATEX), + priv.lavc_ctx->extradata_size); } } // for QDM2 - if (sh_audio->codecdata_len && sh_audio->codecdata && !priv->lavc_ctx->extradata) { - priv->lavc_ctx->extradata = new uint8_t[sh_audio->codecdata_len]; - priv->lavc_ctx->extradata_size = sh_audio->codecdata_len; - memcpy(priv->lavc_ctx->extradata, (char *)sh_audio->codecdata, - priv->lavc_ctx->extradata_size); + if (sh_audio->codecdata_len && sh_audio->codecdata && !priv.lavc_ctx->extradata) { + priv.lavc_ctx->extradata = new uint8_t[sh_audio->codecdata_len]; + priv.lavc_ctx->extradata_size = sh_audio->codecdata_len; + memcpy(priv.lavc_ctx->extradata, (char *)sh_audio->codecdata, + priv.lavc_ctx->extradata_size); } - priv->lavc_ctx->codec_tag = sh_audio->wtag; - priv->lavc_ctx->codec_type = lavc_codec->type; - priv->lavc_ctx->codec_id = lavc_codec->id; + priv.lavc_ctx->codec_tag = sh_audio->wtag; + priv.lavc_ctx->codec_type = lavc_codec->type; + priv.lavc_ctx->codec_id = lavc_codec->id; /* open it */ - if (avcodec_open2(priv->lavc_ctx, lavc_codec, NULL) < 0) { + if (avcodec_open2(priv.lavc_ctx, lavc_codec, NULL) < 0) { MSG_ERR( MSGTR_CantOpenCodec); return MPXP_False; } MSG_V("INFO: libavcodec init OK!\n"); // Decode at least 1 byte: (to get header filled) - x=decode(priv,reinterpret_cast<unsigned char*>(sh_audio->a_buffer),1,sh_audio->a_buffer_size,&pts); + x=decode(priv,reinterpret_cast<unsigned char*>(sh_audio->a_buffer),1,sh_audio->a_buffer_size,pts); if(x>0) sh_audio->a_buffer_len=x; - sh_audio->nch=priv->lavc_ctx->channels; - sh_audio->rate=priv->lavc_ctx->sample_rate; - switch(priv->lavc_ctx->sample_fmt) { + sh_audio->nch=priv.lavc_ctx->channels; + sh_audio->rate=priv.lavc_ctx->sample_rate; + switch(priv.lavc_ctx->sample_fmt) { case AV_SAMPLE_FMT_U8: ///< unsigned 8 bits sh_audio->afmt=AFMT_U8; break; @@ -162,33 +173,29 @@ sh_audio->afmt=AFMT_FLOAT32; break; } - sh_audio->i_bps=priv->lavc_ctx->bit_rate/8; + sh_audio->i_bps=priv.lavc_ctx->bit_rate/8; return MPXP_Ok; } -void uninit(ad_private_t *priv) -{ - avcodec_close(priv->lavc_ctx); - if (priv->lavc_ctx->extradata) delete priv->lavc_ctx->extradata; - delete priv->lavc_ctx; - delete priv; -} +void uninit(Opaque& ctx) { UNUSED(ctx); } -MPXP_Rc control_ad(ad_private_t *priv,int cmd,any_t* arg, ...) +MPXP_Rc control_ad(Opaque& ctx,int cmd,any_t* arg, ...) { + alavc_private_t& priv=static_cast<alavc_private_t&>(ctx); UNUSED(arg); switch(cmd){ case ADCTRL_RESYNC_STREAM: - avcodec_flush_buffers(priv->lavc_ctx); + avcodec_flush_buffers(priv.lavc_ctx); return MPXP_True; default: break; } return MPXP_Unknown; } -unsigned decode(ad_private_t *priv,unsigned char *buf,unsigned minlen,unsigned maxlen,float *pts) +unsigned decode(Opaque& ctx,unsigned char *buf,unsigned minlen,unsigned maxlen,float& pts) { - sh_audio_t* sh_audio = priv->sh; + alavc_private_t& priv=static_cast<alavc_private_t&>(ctx); + sh_audio_t* sh_audio = priv.sh; unsigned char *start=NULL; int y; unsigned len=0; @@ -196,13 +203,13 @@ while(len<minlen){ AVPacket pkt; int len2=maxlen; - int x=ds_get_packet_r(sh_audio->ds,&start,apts?&null_pts:&apts); + int x=ds_get_packet_r(*sh_audio->ds,&start,apts?null_pts:apts); if(x<=0) break; // error if(sh_audio->wtag==mmioFOURCC('d','n','e','t')) swab(start,start,x&(~1)); av_init_packet(&pkt); pkt.data = start; pkt.size = x; - y=avcodec_decode_audio3(priv->lavc_ctx,(int16_t*)buf,&len2,&pkt); + y=avcodec_decode_audio3(priv.lavc_ctx,(int16_t*)buf,&len2,&pkt); if(y<0){ MSG_V("lavc_audio: error\n");break; } if(y<x) { @@ -217,6 +224,6 @@ } MSG_DBG2("Decoded %d -> %d \n",y,len2); } - *pts=apts; + pts=apts; return len; } Modified: mplayerxp/libmpcodecs/ad_libdv.cpp =================================================================== --- mplayerxp/libmpcodecs/ad_libdv.cpp 2012-12-22 14:32:53 UTC (rev 599) +++ mplayerxp/libmpcodecs/ad_libdv.cpp 2012-12-25 14:21:19 UTC (rev 600) @@ -20,11 +20,19 @@ #include "osdep/bswap.h" #include "ad_internal.h" -struct ad_private_t { +struct libadv_private_t : public Opaque { + libadv_private_t(); + virtual ~libadv_private_t(); + dv_decoder_t* decoder; int16_t* audioBuffers[4]; sh_audio_t* sh; }; +libadv_private_t::libadv_private_t() {} +libadv_private_t::~libadv_private_t() { + unsigned i; + for (i=0; i < 4; i++) delete audioBuffers[i]; +} static const ad_info_t info = { "Raw DV Audio Decoder", @@ -55,20 +63,21 @@ // defined in vd_libdv.c: dv_decoder_t* init_global_rawdv_decoder(void); -static ad_private_t* preinit(const audio_probe_t* probe,sh_audio_t *sh_audio,audio_filter_info_t* afi) +static Opaque* preinit(const audio_probe_t& probe,sh_audio_t *sh_audio,audio_filter_info_t& afi) { UNUSED(probe); UNUSED(afi); sh_audio->audio_out_minsize=4*DV_AUDIO_MAX_SAMPLES*2; - ad_private_t* priv = new(zeromem)... [truncated message content] |