[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[510] mplayerxp
Brought to you by:
olov
From: <nic...@us...> - 2012-12-05 09:25:31
|
Revision: 510 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=510&view=rev Author: nickols_k Date: 2012-12-05 09:25:22 +0000 (Wed, 05 Dec 2012) Log Message: ----------- more private data About illegal patch: Thinking about substitution of g++ long-names of functions i guess that malefactor(s) substitute(d) content of glibc. Symbol resolving during program linking in memory performed by ld.so because libdl.so calls some functions (line: _dl_sym) directly from loader. But what us tells 'ldd --version' utility? ldd (GNU libc) 2.16 Copyright (C) 2012 Free Software Foundation, Inc. It tells us that ldd is part of GLIBC. Therefore, ld.so is part of GLIBC too. Thus obviously, that malefactor(s) substitute(d) part of glibc content. Modified Paths: -------------- mplayerxp/libmpdemux/demux_aiff.cpp mplayerxp/libmpdemux/demux_asf.cpp mplayerxp/libmpdemux/demux_audio.cpp mplayerxp/libmpdemux/demux_avi.cpp mplayerxp/libmpdemux/demux_bmp.cpp mplayerxp/libmpdemux/demux_dv.cpp mplayerxp/libmpdemux/demux_film.cpp mplayerxp/libmpdemux/demux_fli.cpp mplayerxp/libmpdemux/demux_lavf.cpp mplayerxp/libmpdemux/demux_mkv.cpp mplayerxp/libmpdemux/demux_mov.cpp mplayerxp/libmpdemux/demux_mpg.cpp mplayerxp/libmpdemux/demux_mpxp64.cpp mplayerxp/libmpdemux/demux_nsv.cpp mplayerxp/libmpdemux/demux_null.cpp mplayerxp/libmpdemux/demux_nuv.cpp mplayerxp/libmpdemux/demux_ogg.cpp mplayerxp/libmpdemux/demux_pva.cpp mplayerxp/libmpdemux/demux_rawaudio.cpp mplayerxp/libmpdemux/demux_rawvideo.cpp mplayerxp/libmpdemux/demux_real.cpp mplayerxp/libmpdemux/demux_realaud.cpp mplayerxp/libmpdemux/demux_roq.cpp mplayerxp/libmpdemux/demux_smjpeg.cpp mplayerxp/libmpdemux/demux_ts.cpp mplayerxp/libmpdemux/demux_ty.cpp mplayerxp/libmpdemux/demux_viv.cpp mplayerxp/libmpdemux/demux_vqf.cpp mplayerxp/libmpdemux/demux_y4m.cpp mplayerxp/libmpdemux/demuxer.cpp mplayerxp/libmpdemux/demuxer.h mplayerxp/libmpdemux/demuxer_internal.h mplayerxp/libmpdemux/demuxer_stream.cpp mplayerxp/mplayerxp.cpp mplayerxp/nls/help_mp-en.h Modified: mplayerxp/libmpdemux/demux_aiff.cpp =================================================================== --- mplayerxp/libmpdemux/demux_aiff.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_aiff.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -51,7 +51,7 @@ return MPXP_False; } -static Demuxer* aiff_open(Demuxer* demuxer) { +static Opaque* aiff_open(Demuxer* demuxer) { sh_audio_t* sh_audio; WAVEFORMATEX* w; stream_t *s; @@ -60,7 +60,7 @@ s = demuxer->stream; sh_audio = demuxer->new_sh_audio(); - demuxer->priv=priv=new(zeromem) priv_t; + priv=new(zeromem) priv_t; sh_audio->wf = w = new(zeromem) WAVEFORMATEX; w->wFormatTag = 0x1; sh_audio->wtag = mmioFOURCC('r','a','w',' '); /* S16BE */ w->nChannels = sh_audio->nch = @@ -181,7 +181,7 @@ demuxer->audio->sh = sh_audio; sh_audio->ds = demuxer->audio; stream_seek(s,demuxer->movi_start); - return demuxer; + return priv; } static int aiff_demux(Demuxer* demuxer, Demuxer_Stream *ds) { Modified: mplayerxp/libmpdemux/demux_asf.cpp =================================================================== --- mplayerxp/libmpdemux/demux_asf.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_asf.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -154,7 +154,7 @@ return MPXP_Ok; } -static Demuxer* asf_open(Demuxer *demuxer){ +static Opaque* asf_open(Demuxer *demuxer){ static unsigned char buffer[2048]; uint32_t* streams = NULL; int audio_streams=0; @@ -344,10 +344,10 @@ for(i = 0; i < stream_count; i++) { uint32_t id = streams[2*i]; uint32_t rate = streams[2*i+1]; - if(demuxer->v_streams[id] && rate > vr) { + if(demuxer->get_sh_video(id) && rate > vr) { vr = rate; best_video = id; - } else if(demuxer->a_streams[id] && rate > ar) { + } else if(demuxer->get_sh_audio(id) && rate > ar) { ar = rate; best_audio = id; } @@ -400,7 +400,7 @@ } } check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return apriv; } // based on asf file-wtag doc by Eugene [http://divx.euro.ru] @@ -429,18 +429,18 @@ MSG_DBG3("demux_asf.read_packet: id=%d seq=%d len=%d time=%u dur=%u offs=%i key=%i\n",id,seq,len,time,dur,offs,keyframe); if(demux->video->id==-1) - if(demux->v_streams[id]) + if(demux->get_sh_video(id)) demux->video->id=id; if(demux->audio->id==-1) - if(demux->a_streams[id]) + if(demux->get_sh_audio(id)) demux->audio->id=id; if(id==demux->audio->id){ // audio ds=demux->audio; if(!ds->sh){ - ds->sh=demux->a_streams[id]; + ds->sh=demux->get_sh_audio(id); MSG_V("Auto-selected ASF audio ID = %d\n",ds->id); } } else @@ -448,7 +448,7 @@ // video ds=demux->video; if(!ds->sh){ - ds->sh=demux->v_streams[id]; + ds->sh=demux->get_sh_video(id); MSG_V("Auto-selected ASF video ID = %d\n",ds->id); } } Modified: mplayerxp/libmpdemux/demux_audio.cpp =================================================================== --- mplayerxp/libmpdemux/demux_audio.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_audio.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -864,7 +864,7 @@ extern const demuxer_driver_t demux_audio; -static Demuxer* audio_open(Demuxer* demuxer) { +static Opaque* audio_open(Demuxer* demuxer) { stream_t *s; sh_audio_t* sh_audio; uint8_t hdr[HDR_SIZE]; @@ -1372,7 +1372,7 @@ if(demuxer->movi_length==UINT_MAX && sh_audio->i_bps) demuxer->movi_length=(unsigned)(((float)demuxer->movi_end-(float)demuxer->movi_start)/(float)sh_audio->i_bps); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static uint32_t mpc_get_bits(da_priv_t* priv, stream_t* s, int bits) { Modified: mplayerxp/libmpdemux/demux_avi.cpp =================================================================== --- mplayerxp/libmpdemux/demux_avi.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_avi.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -767,18 +767,18 @@ int stream_id=avi_stream_id(id); if(demux->video->id==-1) - if(demux->v_streams[stream_id]) + if(demux->get_sh_video(stream_id)) demux->video->id=stream_id; if(demux->audio->id==-1) - if(demux->a_streams[stream_id]) + if(demux->get_sh_audio(stream_id)) demux->audio->id=stream_id; if(stream_id==demux->audio->id){ if(!demux->audio->sh){ sh_audio_t* sh; avi_priv_t *priv=static_cast<avi_priv_t*>(demux->priv); - demux->audio->sh=sh=reinterpret_cast<sh_audio_t*>(demux->a_streams[stream_id]); + demux->audio->sh=sh=demux->get_sh_audio(stream_id); MSG_V("Auto-selected AVI audio ID = %d\n",demux->audio->id); if(sh->wf){ priv->audio_block_size=sh->wf->nBlockAlign; @@ -804,7 +804,7 @@ } if(stream_id==demux->video->id){ if(!demux->video->sh){ - demux->video->sh=demux->v_streams[stream_id]; + demux->video->sh=demux->get_sh_video(stream_id); MSG_V("Auto-selected AVI video ID = %d\n",demux->video->id); } return demux->video; @@ -1130,7 +1130,7 @@ int index_mode=-1; // -1=untouched 0=don't use index 1=use (geneate) index extern demuxer_driver_t demux_ogg; -static Demuxer* avi_open(Demuxer* demuxer){ +static Opaque* avi_open(Demuxer* demuxer){ Demuxer_Stream *d_audio=demuxer->audio; Demuxer_Stream *d_video=demuxer->video; sh_audio_t *sh_audio=NULL; @@ -1143,11 +1143,11 @@ //---- AVI header: read_avi_header(demuxer,(demuxer->stream->type&STREAMTYPE_SEEKABLE)?index_mode:-2); - if(demuxer->audio->id>=0 && !demuxer->a_streams[demuxer->audio->id]){ + if(demuxer->audio->id>=0 && !demuxer->get_sh_audio(demuxer->audio->id)){ MSG_WARN("AVI: invalid audio stream ID: %d - ignoring (nosound)\n",demuxer->audio->id); demuxer->audio->id=-2; // disabled } - if(demuxer->video->id>=0 && !demuxer->v_streams[demuxer->video->id]){ + if(demuxer->video->id>=0 && !demuxer->get_sh_video(demuxer->video->id)){ MSG_WARN("AVI: invalid video stream ID: %d - ignoring (using default)\n",demuxer->video->id); demuxer->video->id=-1; // autodetect } @@ -1281,7 +1281,7 @@ sh_video->bih->biBitCount, sh_video->fps); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static void avi_seek(Demuxer *demuxer,const seek_args_t* seeka){ Modified: mplayerxp/libmpdemux/demux_bmp.cpp =================================================================== --- mplayerxp/libmpdemux/demux_bmp.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_bmp.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -142,7 +142,7 @@ return 1; } -static Demuxer* bmp_open(Demuxer* demuxer) +static Opaque* bmp_open(Demuxer* demuxer) { sh_video_t *sh_video = NULL; unsigned npal_colors; @@ -188,7 +188,7 @@ // demuxer->priv = bmp_image; check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return NULL; } static void bmp_close(Demuxer* demuxer) @@ -232,7 +232,7 @@ return 1; } -static Demuxer* bmp_open(Demuxer* demuxer) +static Opaque* bmp_open(Demuxer* demuxer) { sh_video_t *sh_video = NULL; unsigned int filesize; @@ -290,9 +290,7 @@ sh_video->is_static = 1; sh_video->fps = 1; - demuxer->priv = bmp_image; - - return demuxer; + return bmp_image; } static void bmp_close(Demuxer* demuxer) { Modified: mplayerxp/libmpdemux/demux_dv.cpp =================================================================== --- mplayerxp/libmpdemux/demux_dv.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_dv.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -135,7 +135,7 @@ return 1; } -static Demuxer* dv_open(Demuxer* demuxer) +static Opaque* dv_open(Demuxer* demuxer) { unsigned char dv_frame[DV_PAL_FRAME_SIZE]; sh_video_t *sh_video = NULL; @@ -223,9 +223,8 @@ stream_reset(demuxer->stream); stream_seek(demuxer->stream, 0); dv_decoder_free(dv_decoder); //we keep this in the context of both stream headers - demuxer->priv=frames; check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return frames; } static void dv_close(Demuxer* demuxer) Modified: mplayerxp/libmpdemux/demux_film.cpp =================================================================== --- mplayerxp/libmpdemux/demux_film.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_film.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -205,7 +205,7 @@ return MPXP_Ok; } -static Demuxer* film_open(Demuxer* demuxer) +static Opaque* film_open(Demuxer* demuxer) { sh_video_t *sh_video = NULL; sh_audio_t *sh_audio = NULL; @@ -432,7 +432,7 @@ demuxer->priv = film_data; check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return film_data; } static void film_close(Demuxer* demuxer) { Modified: mplayerxp/libmpdemux/demux_fli.cpp =================================================================== --- mplayerxp/libmpdemux/demux_fli.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_fli.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -84,7 +84,7 @@ return MPXP_Ok; } -static Demuxer* fli_open(Demuxer* demuxer){ +static Opaque* fli_open(Demuxer* demuxer){ sh_video_t *sh_video = NULL; fli_frames_t *frames = new(zeromem) fli_frames_t; int frame_number; @@ -182,9 +182,8 @@ // save the actual number of frames indexed frames->num_frames = frame_number; - demuxer->priv = frames; check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return frames; } static void fli_close(Demuxer* demuxer) { Modified: mplayerxp/libmpdemux/demux_lavf.cpp =================================================================== --- mplayerxp/libmpdemux/demux_lavf.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_lavf.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -227,7 +227,7 @@ return MPXP_Ok; } -static Demuxer* lavf_open(Demuxer *demuxer){ +static Opaque* lavf_open(Demuxer *demuxer){ AVFormatContext *avfc; lavf_priv_t *priv= static_cast<lavf_priv_t*>(demuxer->priv); unsigned j; @@ -341,7 +341,7 @@ st->discard= AVDISCARD_ALL; else{ demuxer->audio->id = i; - demuxer->audio->sh= demuxer->a_streams[i]; + demuxer->audio->sh= demuxer->get_sh_audio(i); } break;} case AVMEDIA_TYPE_VIDEO:{ @@ -390,7 +390,7 @@ st->discard= AVDISCARD_ALL; else{ demuxer->video->id = i; - demuxer->video->sh= demuxer->v_streams[i]; + demuxer->video->sh= demuxer->get_sh_video(i); } break;} default: @@ -410,7 +410,7 @@ demuxer->video->id=-2; // audio-only } //else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video; check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static int lavf_demux(Demuxer *demux, Demuxer_Stream *dsds){ @@ -438,14 +438,14 @@ // audio ds=demux->audio; if(!ds->sh){ - ds->sh=demux->a_streams[id]; + ds->sh=demux->get_sh_audio(id); MSG_V("Auto-selected LAVF audio ID = %d\n",ds->id); } } else if(id==demux->video->id){ // video ds=demux->video; if(!ds->sh){ - ds->sh=demux->v_streams[id]; + ds->sh=demux->get_sh_video(id); MSG_V("Auto-selected LAVF video ID = %d\n",ds->id); } } else { Modified: mplayerxp/libmpdemux/demux_mkv.cpp =================================================================== --- mplayerxp/libmpdemux/demux_mkv.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_mkv.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -2437,9 +2437,6 @@ { MSG_WARN("[mkv] Unknown/unsupported audio codec ID '%s' for track %u or missing/faulty\n[mkv] private codec data.\n", track->codec_id, track->tnum); - - delete demuxer->a_streams[track->tnum]; - demuxer->a_streams[track->tnum]=0; return 1; } } @@ -2655,8 +2652,6 @@ { /* do nothing, still works */ } else if (!track->ms_compat || (track->private_size < sizeof(WAVEFORMATEX))) { - delete demuxer->a_streams[track->tnum]; - demuxer->a_streams[track->tnum]=0; return 1; } @@ -2806,7 +2801,7 @@ return MPXP_Ok; } -static Demuxer* mkv_open (Demuxer *demuxer) +static Opaque* mkv_open(Demuxer *demuxer) { stream_t *s = demuxer->stream; mkv_demuxer_t *mkv_d; @@ -2938,11 +2933,11 @@ track = demux_mkv_find_track_by_num (mkv_d, demuxer->video->id, MATROSKA_TRACK_VIDEO); - if (track && demuxer->v_streams[track->tnum]) + if (track && demuxer->get_sh_video(track->tnum)) { MSG_V("[mkv] Will play video track %u.\n", track->tnum); demuxer->video->id = track->tnum; - demuxer->video->sh = demuxer->v_streams[track->tnum]; + demuxer->video->sh = demuxer->get_sh_video(track->tnum); } else { @@ -2982,10 +2977,10 @@ else if (demuxer->audio->id != -2) /* -2 = no audio at all */ track = demux_mkv_find_track_by_num (mkv_d, demuxer->audio->id, MATROSKA_TRACK_AUDIO); - if (track && demuxer->a_streams[track->tnum]) + if (track && demuxer->get_sh_audio(track->tnum)) { demuxer->audio->id = track->tnum; - demuxer->audio->sh = demuxer->a_streams[track->tnum]; + demuxer->audio->sh = demuxer->get_sh_audio(track->tnum); } else { @@ -2999,7 +2994,7 @@ { if(mkv_d->tracks[i]->type != MATROSKA_TRACK_AUDIO) continue; - if(demuxer->a_streams[track->tnum]) + if(demuxer->get_sh_audio(track->tnum)) { mkv_d->last_aid++; if(mkv_d->last_aid == MAX_A_STREAMS) @@ -3071,7 +3066,7 @@ } } check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return mkv_d; } static void mkv_close (Demuxer *demuxer) @@ -3999,14 +3994,14 @@ #endif case Demuxer::Switch_Audio: if (demuxer->audio && demuxer->audio->sh) { - sh_audio_t *sh = reinterpret_cast<sh_audio_t*>(demuxer->a_streams[demuxer->audio->id]); + sh_audio_t *sh = demuxer->get_sh_audio(demuxer->audio->id); int aid = *(int*)arg; if (aid < 0) aid = (sh->id + 1) % mkv_d->last_aid; if (aid != sh->id) { mkv_track_t *track = demux_mkv_find_track_by_num (mkv_d, aid, MATROSKA_TRACK_AUDIO); if (track) { demuxer->audio->id = track->tnum; - sh = reinterpret_cast<sh_audio_t*>(demuxer->a_streams[demuxer->audio->id]); + sh = demuxer->get_sh_audio(demuxer->audio->id); demuxer->audio->free_packs(); } } Modified: mplayerxp/libmpdemux/demux_mov.cpp =================================================================== --- mplayerxp/libmpdemux/demux_mov.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_mov.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -1794,7 +1794,7 @@ return 0; } -static Demuxer* mov_open(Demuxer* demuxer){ +static Opaque* mov_open(Demuxer* demuxer){ mov_priv_t* priv=static_cast<mov_priv_t*>(demuxer->priv); int t_no; int best_a_id=-1, best_a_len=0; @@ -1817,10 +1817,10 @@ for(t_no=0;t_no<priv->track_db;t_no++){ mov_track_t* trak=priv->tracks[t_no]; int len=(trak->samplesize) ? trak->chunks_size : trak->samples_size; - if(demuxer->a_streams[t_no]){ // need audio + if(demuxer->get_sh_audio(t_no)){ // need audio if(len>best_a_len){ best_a_len=len; best_a_id=t_no; } } - if(demuxer->v_streams[t_no]){ // need video + if(demuxer->get_sh_video(t_no)){ // need video if(len>best_v_len){ best_v_len=len; best_v_id=t_no; } } } @@ -1831,7 +1831,7 @@ // setup sh pointers: if(demuxer->audio->id>=0){ - sh_audio_t* sh=reinterpret_cast<sh_audio_t*>(demuxer->a_streams[demuxer->audio->id]); + sh_audio_t* sh=demuxer->get_sh_audio(demuxer->audio->id); if(sh){ demuxer->audio->sh=sh; sh->ds=demuxer->audio; } else { @@ -1840,7 +1840,7 @@ } } if(demuxer->video->id>=0){ - sh_video_t* sh=reinterpret_cast<sh_video_t*>(demuxer->v_streams[demuxer->video->id]); + sh_video_t* sh=demuxer->get_sh_video(demuxer->video->id); if(sh){ demuxer->video->sh=sh; sh->ds=demuxer->video; } else { @@ -1912,7 +1912,7 @@ } #endif check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } /** Modified: mplayerxp/libmpdemux/demux_mpg.cpp =================================================================== --- mplayerxp/libmpdemux/demux_mpg.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_mpg.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -156,11 +156,11 @@ } static void new_audio_stream(Demuxer *demux, int aid){ - if(!demux->a_streams[aid]){ + if(!demux->get_sh_audio(aid)){ mpg_demuxer_t *mpg_d=static_cast<mpg_demuxer_t*>(demux->priv); sh_audio_t* sh_a; demux->new_sh_audio(aid); - sh_a = (sh_audio_t*)demux->a_streams[aid]; + sh_a = demux->get_sh_audio(aid); switch(aid & 0xE0){ // 1110 0000 b (high 3 bit: type low 5: id) case 0x00: sh_a->wtag=AUDIO_MP2;break; case 0xA0: sh_a->wtag=AUDIO_LPCM_BE;break; @@ -289,9 +289,9 @@ // subtitle: aid&=0x1F; - if(!demux->s_streams[aid]){ + if(!demux->get_sh_sub(aid)){ MSG_V("==> Found subtitle: %d\n",aid); - demux->s_streams[aid]=1; + demux->new_sh_sub(aid); } if(demux->sub->id==aid){ @@ -308,7 +308,7 @@ if(demux->audio->id==aid){ int type; ds=demux->audio; - if(!ds->sh) ds->sh=demux->a_streams[aid]; + if(!ds->sh) ds->sh=demux->get_sh_audio(aid); // READ Packet: Skip additional audio header data: c=stream_read_char(demux->stream);//num of frames type=stream_read_char(demux->stream);//startpos hi @@ -361,7 +361,7 @@ new_audio_stream(demux, aid); if(demux->audio->id==aid){ ds=demux->audio; - if(!ds->sh) ds->sh=demux->a_streams[aid]; + if(!ds->sh) ds->sh=demux->get_sh_audio(aid); if(priv && ds->sh) { sh_audio_t *sh = (sh_audio_t *)ds->sh; if(priv->es_map[id - 0x1B0]) { @@ -374,11 +374,11 @@ if(id>=0x1E0 && id<=0x1EF){ // mpeg video int aid=id-0x1E0; - if(!demux->v_streams[aid]) demux->new_sh_video(aid); + if(!demux->get_sh_video(aid)) demux->new_sh_video(aid); if(demux->video->id==-1) demux->video->id=aid; if(demux->video->id==aid){ ds=demux->video; - if(!ds->sh) ds->sh=demux->v_streams[aid]; + if(!ds->sh) ds->sh=demux->get_sh_video(aid); if(priv && ds->sh) { sh_video_t *sh = (sh_video_t *)ds->sh; if(priv->es_map[id - 0x1B0]) { @@ -760,9 +760,9 @@ demuxer->file_format==Demuxer::Type_MPEG4_ES || demuxer->file_format==Demuxer::Type_H264_ES){ /* little hack, see above! */ mpg_d->alt_demuxer=mpges_demux; - if(!demuxer->v_streams[0]) demuxer->new_sh_video(); + if(!demuxer->get_sh_video()) demuxer->new_sh_video(); if(demuxer->video->id==-1) demuxer->video->id=0; - demuxer->video->sh=demuxer->v_streams[0]; + demuxer->video->sh=demuxer->get_sh_video(); stream_seek(demuxer->stream,demuxer->stream->start_pos); return mpges_demux(demuxer,demuxer->video)?MPXP_Ok:MPXP_False; } else { @@ -785,7 +785,7 @@ return MPXP_False; } -static Demuxer* mpgps_open(Demuxer*demuxer) +static Opaque* mpgps_open(Demuxer*demuxer) { sh_video_t *sh_video=reinterpret_cast<sh_video_t*>(demuxer->video->sh); mpg_demuxer_t* mpg_d=static_cast<mpg_demuxer_t*>(demuxer->priv); @@ -806,7 +806,7 @@ } } check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return mpg_d; } static void mpgps_close(Demuxer*demuxer) @@ -831,13 +831,13 @@ } do { i = (i+1) % mpg_d->num_a_streams; - sh_a = (sh_audio_t*)demuxer->a_streams[mpg_d->a_stream_ids[i]]; + sh_a = demuxer->get_sh_audio(mpg_d->a_stream_ids[i]); } while (sh_a->wtag != sh_audio->wtag); } else { for (i = 0; i < mpg_d->num_a_streams; i++) if (*((int*)arg) == mpg_d->a_stream_ids[i]) break; if (i < mpg_d->num_a_streams) - sh_a = (sh_audio_t*)demuxer->a_streams[*((int*)arg)]; + sh_a = demuxer->get_sh_audio(*((int*)arg)); if (sh_a->wtag != sh_audio->wtag) i = mpg_d->num_a_streams; } Modified: mplayerxp/libmpdemux/demux_mpxp64.cpp =================================================================== --- mplayerxp/libmpdemux/demux_mpxp64.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_mpxp64.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -433,7 +433,7 @@ priv->prev_id=0xFFFFFFFFUL; } -static Demuxer* mpxpav64_open(Demuxer* demuxer){ +static Opaque* mpxpav64_open(Demuxer* demuxer){ stream_t *s=demuxer->stream; uint64_t id,hsize,t; uint32_t fourcc; @@ -523,7 +523,7 @@ demuxer->movi_end=demuxer->movi_start+hsize; MSG_V("Found AVDATA64 at offset %016llX bytes\n",t); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static int mpxpav64_read_packet(Demuxer *demux,unsigned id,uint64_t len,float pts,int keyframe) @@ -532,18 +532,18 @@ stream_t* s=demux->stream; if(demux->video->id==-1) - if(demux->v_streams[id]) + if(demux->get_sh_video(id)) demux->video->id=id; if(demux->audio->id==-1) - if(demux->a_streams[id]) + if(demux->get_sh_audio(id)) demux->audio->id=id; if(id==(unsigned)demux->audio->id){ // audio ds=demux->audio; if(!ds->sh){ - ds->sh=demux->a_streams[id]; + ds->sh=demux->get_sh_audio(id); MSG_V("Auto-selected MPXPAV64 audio ID = %d\n",ds->id); } } else @@ -551,7 +551,7 @@ // video ds=demux->video; if(!ds->sh){ - ds->sh=demux->v_streams[id]; + ds->sh=demux->get_sh_video(id); MSG_V("Auto-selected MPXPAV64 video ID = %d\n",ds->id); } } Modified: mplayerxp/libmpdemux/demux_nsv.cpp =================================================================== --- mplayerxp/libmpdemux/demux_nsv.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_nsv.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -142,7 +142,7 @@ } -static Demuxer* nsv_open ( Demuxer* demuxer ) +static Opaque* nsv_open( Demuxer* demuxer ) { // last 2 bytes 17 and 18 are unknown but right after that comes the length unsigned char hdr[17]; @@ -316,7 +316,7 @@ // seek to start of NSV header stream_seek(demuxer->stream,stream_tell(demuxer->stream)-17); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static MPXP_Rc nsv_probe ( Demuxer* demuxer ) Modified: mplayerxp/libmpdemux/demux_null.cpp =================================================================== --- mplayerxp/libmpdemux/demux_null.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_null.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -24,7 +24,7 @@ return MPXP_False; } -static Demuxer* null_open(Demuxer* demuxer) { +static Opaque* null_open(Demuxer* demuxer) { return NULL; } Modified: mplayerxp/libmpdemux/demux_nuv.cpp =================================================================== --- mplayerxp/libmpdemux/demux_nuv.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_nuv.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -212,8 +212,7 @@ return 1; } - -static Demuxer* nuv_open ( Demuxer* demuxer ) +static Opaque* nuv_open ( Demuxer* demuxer ) { sh_video_t *sh_video = NULL; sh_audio_t *sh_audio = NULL; @@ -296,7 +295,7 @@ priv->index_list->next = NULL; priv->current_position = priv->index_list; check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static MPXP_Rc nuv_probe ( Demuxer* demuxer ) Modified: mplayerxp/libmpdemux/demux_ogg.cpp =================================================================== --- mplayerxp/libmpdemux/demux_ogg.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_ogg.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -741,7 +741,7 @@ static void ogg_close(Demuxer* demuxer); /// Open an ogg physical stream -static Demuxer * ogg_open(Demuxer* demuxer) { +static Opaque* ogg_open(Demuxer* demuxer) { ogg_demuxer_t* ogg_d; stream_t *s; char* buf; @@ -1079,11 +1079,11 @@ } MSG_V("Ogg demuxer : found %d audio stream%s, %d video stream%s and %d text stream%s\n",n_audio,n_audio>1?"s":"",n_video,n_video>1?"s":"",ogg_d->n_text,ogg_d->n_text>1?"s":""); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return ogg_d; err_out: ogg_close(demuxer); - return 0; + return NULL; } Modified: mplayerxp/libmpdemux/demux_pva.cpp =================================================================== --- mplayerxp/libmpdemux/demux_pva.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_pva.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -128,7 +128,7 @@ } } -static Demuxer* pva_open (Demuxer * demuxer) +static Opaque* pva_open (Demuxer * demuxer) { sh_video_t* sh_video = demuxer->new_sh_video(); sh_audio_t* sh_audio = demuxer->new_sh_audio(); @@ -179,7 +179,7 @@ priv->last_video_pts=-1; priv->last_audio_pts=-1; check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static int pva_get_payload(Demuxer * d,pva_payload_t * payload); Modified: mplayerxp/libmpdemux/demux_rawaudio.cpp =================================================================== --- mplayerxp/libmpdemux/demux_rawaudio.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_rawaudio.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -43,7 +43,7 @@ return MPXP_False; } -static Demuxer* rawaudio_open(Demuxer* demuxer) { +static Opaque* rawaudio_open(Demuxer* demuxer) { unsigned samplesize; sh_audio_t* sh_audio; WAVEFORMATEX* w; Modified: mplayerxp/libmpdemux/demux_rawvideo.cpp =================================================================== --- mplayerxp/libmpdemux/demux_rawvideo.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_rawvideo.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -68,7 +68,7 @@ return MPXP_False; } -static Demuxer* rawvideo_open(Demuxer* demuxer) { +static Opaque* rawvideo_open(Demuxer* demuxer) { sh_video_t* sh_video; switch(priv.size_id){ Modified: mplayerxp/libmpdemux/demux_real.cpp =================================================================== --- mplayerxp/libmpdemux/demux_real.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_real.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -775,8 +775,8 @@ if(stream_id<256){ - if(demuxer->audio->id==-1 && demuxer->a_streams[stream_id]){ - sh_audio_t *sh = reinterpret_cast<sh_audio_t*>(demuxer->a_streams[stream_id]); + if(demuxer->audio->id==-1 && demuxer->get_sh_audio(stream_id)){ + sh_audio_t *sh = demuxer->get_sh_audio(stream_id); demuxer->audio->id=stream_id; sh->ds=demuxer->audio; demuxer->audio->sh=sh; @@ -784,8 +784,8 @@ goto got_audio; } - if(demuxer->video->id==-1 && demuxer->v_streams[stream_id]){ - sh_video_t *sh = reinterpret_cast<sh_video_t*>(demuxer->v_streams[stream_id]); + if(demuxer->video->id==-1 && demuxer->get_sh_video(stream_id)){ + sh_video_t *sh = demuxer->get_sh_video(stream_id); demuxer->video->id=stream_id; sh->ds=demuxer->video; demuxer->video->sh=sh; @@ -801,7 +801,7 @@ }// goto loop; } -static Demuxer* real_open(Demuxer* demuxer) +static Opaque* real_open(Demuxer* demuxer) { real_priv_t* priv = static_cast<real_priv_t*>(demuxer->priv); int num_of_headers; @@ -1488,7 +1488,7 @@ sh->src_w,sh->src_h,sh->aspect,sh->fps); } check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static void real_close(Demuxer *demuxer) Modified: mplayerxp/libmpdemux/demux_realaud.cpp =================================================================== --- mplayerxp/libmpdemux/demux_realaud.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_realaud.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -95,7 +95,7 @@ return 1; } -static Demuxer * realaud_open(Demuxer* demuxer) +static Opaque* realaud_open(Demuxer* demuxer) { realaud_priv_t* realaud_priv = static_cast<realaud_priv_t*>(demuxer->priv); sh_audio_t *sh; @@ -271,7 +271,7 @@ if(!demuxer->audio->fill_buffer()) MSG_WARN("[RealAudio] No data.\n"); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return realaud_priv; } Modified: mplayerxp/libmpdemux/demux_roq.cpp =================================================================== --- mplayerxp/libmpdemux/demux_roq.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_roq.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -99,7 +99,7 @@ return 1; } -static Demuxer* roq_open(Demuxer* demuxer) +static Opaque* roq_open(Demuxer* demuxer) { sh_video_t *sh_video = NULL; sh_audio_t *sh_audio = NULL; @@ -243,10 +243,9 @@ sh_audio->wf->nBlockAlign = largest_audio_chunk * 2; roq_data->current_chunk = 0; - demuxer->priv = roq_data; stream_reset(demuxer->stream); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return roq_data; } static void roq_close(Demuxer* demuxer) { Modified: mplayerxp/libmpdemux/demux_smjpeg.cpp =================================================================== --- mplayerxp/libmpdemux/demux_smjpeg.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_smjpeg.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -93,7 +93,7 @@ return 1; } -static Demuxer* smjpeg_open(Demuxer* demuxer){ +static Opaque* smjpeg_open(Demuxer* demuxer){ sh_video_t* sh_video; sh_audio_t* sh_audio; unsigned int htype = 0, hleng; Modified: mplayerxp/libmpdemux/demux_ts.cpp =================================================================== --- mplayerxp/libmpdemux/demux_ts.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_ts.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -928,7 +928,7 @@ return 1; } -static Demuxer *ts_open(Demuxer * demuxer) +static Opaque* ts_open(Demuxer* demuxer) { int i; uint8_t packet_size; @@ -1057,7 +1057,7 @@ demuxer->filepos = stream_tell(demuxer->stream); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static void ts_close(Demuxer * demuxer) Modified: mplayerxp/libmpdemux/demux_ty.cpp =================================================================== --- mplayerxp/libmpdemux/demux_ty.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_ty.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -505,12 +505,12 @@ // Let's make a Video Demux Stream for MPlayer aid = 0x0; - if( !demux->v_streams[ aid ] ) demux->new_sh_video( aid ); + if( !demux->get_sh_video(aid)) demux->new_sh_video(aid); if( demux->video->id == -1 ) demux->video->id = aid; if( demux->video->id == aid ) { Demuxer_Stream *ds = demux->video; - if( !ds->sh ) ds->sh = demux->v_streams[ aid ]; + if( !ds->sh ) ds->sh = demux->get_sh_video(aid); } // ====================================================================== @@ -576,13 +576,13 @@ } demux->audio->id = aid; - if( !demux->a_streams[ aid ] ) demux->new_sh_audio( aid ); + if( !demux->get_sh_audio(aid) ) demux->new_sh_audio( aid ); if( demux->audio->id == aid ) { Demuxer_Stream *ds = demux->audio; if( !ds->sh ) { sh_audio_t* sh_a; - ds->sh = demux->a_streams[ aid ]; + ds->sh = demux->get_sh_audio(aid); sh_a = (sh_audio_t*)ds->sh; switch(aid & 0xE0){ // 1110 0000 b (high 3 bit: type low 5: id) case 0x00: sh_a->wtag=0x50;break; // mpeg @@ -851,7 +851,7 @@ } -static Demuxer* ty_open(Demuxer* demuxer) +static Opaque* ty_open(Demuxer* demuxer) { sh_audio_t *sh_audio=NULL; sh_video_t *sh_video=NULL; Modified: mplayerxp/libmpdemux/demux_viv.cpp =================================================================== --- mplayerxp/libmpdemux/demux_viv.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_viv.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -572,7 +572,7 @@ return 0; } -static Demuxer* vivo_open(Demuxer* demuxer){ +static Opaque* vivo_open(Demuxer* demuxer){ vivo_priv_t* priv=static_cast<vivo_priv_t*>(demuxer->priv); if(!demuxer->video->fill_buffer()){ @@ -749,7 +749,7 @@ } } check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static void vivo_close(Demuxer *demuxer) Modified: mplayerxp/libmpdemux/demux_vqf.cpp =================================================================== --- mplayerxp/libmpdemux/demux_vqf.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_vqf.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -49,7 +49,7 @@ return MPXP_False; } -static Demuxer* vqf_open(Demuxer* demuxer) { +static Opaque* vqf_open(Demuxer* demuxer) { sh_audio_t* sh_audio; WAVEFORMATEX* w; stream_t *s; Modified: mplayerxp/libmpdemux/demux_y4m.cpp =================================================================== --- mplayerxp/libmpdemux/demux_y4m.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demux_y4m.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -130,7 +130,7 @@ return 1; } -static Demuxer* y4m_open(Demuxer* demuxer){ +static Opaque* y4m_open(Demuxer* demuxer){ y4m_priv_t* priv = static_cast<y4m_priv_t*>(demuxer->priv); y4m_ratio_t ratio; sh_video_t* sh=demuxer->new_sh_video(); @@ -236,7 +236,7 @@ demuxer->video->id, sh->src_w, sh->src_h, sh->bih->biWidth, sh->bih->biHeight); check_pin("demuxer",demuxer->pin,DEMUX_PIN); - return demuxer; + return priv; } static void y4m_seek(Demuxer *demuxer,const seek_args_t* seeka) { Modified: mplayerxp/libmpdemux/demuxer.cpp =================================================================== --- mplayerxp/libmpdemux/demuxer.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demuxer.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -91,6 +91,18 @@ NULL }; + +struct demuxer_priv_t : public Opaque { + public: + demuxer_priv_t() {} + virtual ~demuxer_priv_t() {} + + sh_audio_t* a_streams[MAX_A_STREAMS]; /**< audio streams (sh_audio_t) for multilanguage movies */ + sh_video_t* v_streams[MAX_V_STREAMS]; /**< video streams (sh_video_t) for multipicture movies */ + char s_streams[MAX_S_STREAMS]; /**< DVD's subtitles (flag) streams for multilanguage movies */ + const demuxer_driver_t* driver; /**< driver associated with this demuxer */ +}; + void libmpdemux_register_options(m_config_t* cfg) { unsigned i; @@ -101,16 +113,8 @@ } } -Demuxer::Demuxer() - :_info(new(zeromem) Demuxer_Info) +void Demuxer::_init(stream_t *_stream,int a_id,int v_id,int s_id) { -} - -Demuxer::Demuxer(stream_t *_stream,int a_id,int v_id,int s_id) - :_info(new(zeromem) Demuxer_Info) -{ - fill_false_pointers(antiviral_hole,reinterpret_cast<long>(&pin)-reinterpret_cast<long>(&antiviral_hole)); - pin=DEMUX_PIN; stream=_stream; movi_start=_stream->start_pos; movi_end=_stream->end_pos; @@ -125,15 +129,33 @@ stream_seek(_stream,stream->start_pos); } +Demuxer::Demuxer() + :demuxer_priv(new(zeromem) demuxer_priv_t), + _info(new(zeromem) Demuxer_Info) +{ + fill_false_pointers(antiviral_hole,reinterpret_cast<long>(&pin)-reinterpret_cast<long>(&antiviral_hole)); + pin=DEMUX_PIN; +} + +Demuxer::Demuxer(stream_t *_stream,int a_id,int v_id,int s_id) + :demuxer_priv(new(zeromem) demuxer_priv_t), + _info(new(zeromem) Demuxer_Info) +{ + fill_false_pointers(antiviral_hole,reinterpret_cast<long>(&pin)-reinterpret_cast<long>(&antiviral_hole)); + pin=DEMUX_PIN; + _init(_stream,a_id,v_id,s_id); +} + Demuxer::~Demuxer() { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); unsigned i; MSG_V("DEMUXER: freeing demuxer at %p \n",this); - if(driver) driver->close(this); + if(dpriv.driver) dpriv.driver->close(this); // free streams: - for(i=0;i<MAX_A_STREAMS;i++) if(a_streams[i]) delete a_streams[i]; - for(i=0;i<MAX_V_STREAMS;i++) if(v_streams[i]) delete v_streams[i]; + for(i=0;i<MAX_A_STREAMS;i++) if(dpriv.a_streams[i]) delete dpriv.a_streams[i]; + for(i=0;i<MAX_V_STREAMS;i++) if(dpriv.v_streams[i]) delete dpriv.v_streams[i]; // free demuxers: delete audio; audio=NULL; delete video; video=NULL; @@ -142,70 +164,104 @@ sh_audio_t* Demuxer::get_sh_audio(int id) const { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); if(id > MAX_A_STREAMS-1 || id < 0) { MSG_WARN("Requested audio stream id overflow (%d > %d)\n", id, MAX_A_STREAMS); return NULL; } check_pin("demuxer",pin,DEMUX_PIN); - return a_streams[id]; + return dpriv.a_streams[id]; } sh_audio_t* Demuxer::new_sh_audio_aid(int id,int aid) { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); if(id > MAX_A_STREAMS-1 || id < 0) { MSG_WARN("Requested audio stream id overflow (%d > %d)\n", id, MAX_A_STREAMS); return NULL; } - if(a_streams[id]) { + if(dpriv.a_streams[id]) { MSG_WARN(MSGTR_AudioStreamRedefined,id); } else { sh_audio_t *sh; MSG_V("==> Found audio stream: %d\n",id); - a_streams[id]=new(zeromem) sh_audio_t; - sh = a_streams[id]; + dpriv.a_streams[id]=new(zeromem) sh_audio_t; + sh = dpriv.a_streams[id]; // set some defaults sh->afmt=bps2afmt(2); /* PCM */ sh->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ MSG_V("ID_AUDIO_ID=%d\n", aid); } - a_streams[id]->id = aid; + dpriv.a_streams[id]->id = aid; check_pin("demuxer",pin,DEMUX_PIN); - return a_streams[id]; + return dpriv.a_streams[id]; } sh_video_t* Demuxer::get_sh_video(int id) const { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); if(id > MAX_V_STREAMS-1 || id < 0) { MSG_WARN("Requested video stream id overflow (%d > %d)\n", id, MAX_V_STREAMS); return NULL; } check_pin("demuxer",pin,DEMUX_PIN); - return v_streams[id]; + return dpriv.v_streams[id]; } sh_video_t* Demuxer::new_sh_video_vid(int id,int vid) { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); if(id > MAX_V_STREAMS-1 || id < 0) { MSG_WARN("Requested video stream id overflow (%d > %d)\n", id, MAX_V_STREAMS); return NULL; } - if(v_streams[id]) { + if(dpriv.v_streams[id]) { MSG_WARN(MSGTR_VideoStreamRedefined,id); } else { MSG_V("==> Found video stream: %d\n",id); - v_streams[id]=new(zeromem) sh_video_t; + dpriv.v_streams[id]=new(zeromem) sh_video_t; MSG_V("ID_VIDEO_ID=%d\n", vid); } - v_streams[id]->id = vid; + dpriv.v_streams[id]->id = vid; check_pin("demuxer",pin,DEMUX_PIN); - return v_streams[id]; + return dpriv.v_streams[id]; } +char Demuxer::get_sh_sub(int id) const +{ + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); + if(id > MAX_A_STREAMS-1 || id < 0) { + MSG_WARN("Requested sub stream id overflow (%d > %d)\n", + id, MAX_A_STREAMS); + return NULL; + } + check_pin("demuxer",pin,DEMUX_PIN); + return dpriv.s_streams[id]; +} + +char Demuxer::new_sh_sub(int id) { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); + if(id > MAX_V_STREAMS-1 || id < 0) { + MSG_WARN("Requested video stream id overflow (%d > %d)\n", + id, MAX_V_STREAMS); + return NULL; + } + if(dpriv.s_streams[id]) { + MSG_WARN(MSGTR_SubStreamRedefined,id); + } else { + MSG_V("==> Found video stream: %d\n",id); + dpriv.s_streams[id]=1; + } + check_pin("demuxer",pin,DEMUX_PIN); + return dpriv.s_streams[id]; +} + int Demuxer::fill_buffer(Demuxer_Stream *ds){ + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); /* Note: parameter 'ds' can be NULL! */ - return driver->demux(this,ds); + return dpriv.driver->demux(this,ds); } // ==================================================================== @@ -245,10 +301,10 @@ return NULL; } -Demuxer* demux_open_stream(stream_t *stream,int audio_id,int video_id,int dvdsub_id) +MPXP_Rc Demuxer::open() { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); unsigned i; - Demuxer *demuxer=NULL,*new_demux=NULL; i=0; if(demux_conf.type) { @@ -260,59 +316,54 @@ } MSG_V("Forcing %s ... ",drv->name); /* don't remove it from loop!!! (for initializing) */ - demuxer = new(zeromem) Demuxer(stream,audio_id,video_id,dvdsub_id); - stream_reset(demuxer->stream); - stream_seek(demuxer->stream,demuxer->stream->start_pos); - if(drv->probe(demuxer)!=MPXP_Ok) { + stream_reset(stream); + stream_seek(stream,stream->start_pos); + if(drv->probe(this)!=MPXP_Ok) { MSG_ERR("Can't probe stream with driver: '%s'\n",demux_conf.type); goto err_exit; } - demuxer->driver = drv; + dpriv.driver = drv; goto force_driver; } again: for(;ddrivers[i]!=&demux_null;i++) { MSG_V("Probing %s ... ",ddrivers[i]->name); /* don't remove it from loop!!! (for initializing) */ - demuxer = new(zeromem) Demuxer(stream,audio_id,video_id,dvdsub_id); - stream_reset(demuxer->stream); - stream_seek(demuxer->stream,demuxer->stream->start_pos); - if(ddrivers[i]->probe(demuxer)==MPXP_Ok) { + stream_reset(stream); + stream_seek(stream,stream->start_pos); + if(ddrivers[i]->probe(this)==MPXP_Ok) { MSG_V("OK\n"); - demuxer->driver = ddrivers[i]; + dpriv.driver = ddrivers[i]; break; } MSG_V("False\n"); - delete demuxer; demuxer=NULL; } - if(!demuxer || !demuxer->driver) { + if(!dpriv.driver) { err_exit: MSG_ERR(MSGTR_FormatNotRecognized); - if(demuxer) { delete demuxer; demuxer=NULL; } - return NULL; + return MPXP_False; } force_driver: - if(!(new_demux=demuxer->driver->open(demuxer))) { - MSG_ERR("Can't open stream with '%s'\n", demuxer->driver->name); - demuxer->driver=NULL; + if(!(priv=dpriv.driver->open(this))) { + MSG_ERR("Can't open stream with '%s'\n", dpriv.driver->name); + dpriv.driver=NULL; i++; if(demux_conf.type) goto err_exit; else goto again; } - demuxer=new_demux; - MSG_OK("Using: %s\n",demuxer->driver->name); + MSG_OK("Using: %s\n",dpriv.driver->name); for(i=0;i<sizeof(stream_txt_ids)/sizeof(struct s_stream_txt_ids);i++) - if(!demuxer->info().get(stream_txt_ids[i].demuxer_id)) { + if(!info().get(stream_txt_ids[i].demuxer_id)) { char stream_name[256]; - if(stream_control(demuxer->stream,stream_txt_ids[i].stream_id,stream_name) == MPXP_Ok) { - demuxer->info().add(stream_txt_ids[i].demuxer_id,stream_name); + if(stream_control(stream,stream_txt_ids[i].stream_id,stream_name) == MPXP_Ok) { + info().add(stream_txt_ids[i].demuxer_id,stream_name); } } - stream->demuxer=demuxer; - return demuxer; + stream->demuxer=this; + return MPXP_Ok; } -Demuxer* demux_open(stream_t *vs,int audio_id,int video_id,int dvdsub_id){ +Demuxer* Demuxer::open(stream_t *vs,int audio_id,int video_id,int dvdsub_id){ stream_t *as = NULL,*ss = NULL; Demuxer *vd,*ad = NULL,*sd = NULL; int afmt = 0,sfmt = 0; @@ -336,20 +387,26 @@ } } - vd = demux_open_stream(vs,audio_id,video_id,dvdsub_id); - if(!vd) + vd = new(zeromem) Demuxer(vs,audio_id,video_id,dvdsub_id); + if(vd->open()!=MPXP_Ok) { + delete vd; return NULL; + } if(as) { - ad = demux_open_stream(as,audio_id,-2,-2); - if(!ad) + ad = new(zeromem) Demuxer(as,audio_id,-2,-2); + if(ad->open()!=MPXP_Ok) { MSG_WARN("Failed to open audio demuxer: %s\n",demux_conf.audio_stream); + delete ad; ad = NULL; + } else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->wtag == 0x55) // MP3 m_config_set_flag(mpxp_context().mconfig,"mp3.hr-seek",1); // Enable high res seeking } if(ss) { - sd = demux_open_stream(ss,-2,-2,dvdsub_id); - if(!sd) + sd = new(zeromem) Demuxer(ss,-2,-2,dvdsub_id); + if(sd->open()!=MPXP_Ok) { MSG_WARN("Failed to open subtitles demuxer: %s\n",demux_conf.sub_stream); + delete sd; sd = NULL; + } } if(ad && sd) @@ -362,6 +419,7 @@ } int Demuxer::seek(const seek_args_t* seeka){ + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); sh_audio_t *sh_audio=reinterpret_cast<sh_audio_t*>(audio->sh); if(!(stream->type&STREAMTYPE_SEEKABLE)) @@ -386,7 +444,7 @@ audio->prev_pts=0; if(sh_audio) sh_audio->timer=0; - if(driver->seek) driver->seek(this,seeka); + if(dpriv.driver->seek) dpriv.driver->seek(this,seeka); else MSG_WARN("Demuxer seek error\n"); check_pin("demuxer",pin,DEMUX_PIN); return 1; @@ -410,10 +468,17 @@ m_config_register_options(cfg,demuxer_opts); } +int Demuxer::demux(Demuxer_Stream* ds) { + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); + if(dpriv.driver) return dpriv.driver->demux(this,ds); + return 0; +} + MPXP_Rc Demuxer::ctrl(int cmd, any_t*arg) const { - if(driver) - return driver->control(this,cmd,arg); + demuxer_priv_t& dpriv = static_cast<demuxer_priv_t&>(*demuxer_priv); + if(dpriv.driver) + return dpriv.driver->control(this,cmd,arg); check_pin("demuxer",pin,DEMUX_PIN); return MPXP_Unknown; } Modified: mplayerxp/libmpdemux/demuxer.h =================================================================== --- mplayerxp/libmpdemux/demuxer.h 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demuxer.h 2012-12-05 09:25:22 UTC (rev 510) @@ -101,16 +101,23 @@ Switch_Subs =3 }; + static Demuxer* open(stream_t *stream,int aid,int vid,int sid); + + virtual MPXP_Rc open(); + virtual int demux(Demuxer_Stream* ds); + virtual Demuxer_Info& info() const { return *_info; } virtual int fill_buffer(Demuxer_Stream *ds); virtual int seek(const seek_args_t* seeka); - virtual sh_audio_t* get_sh_audio(int id) const; - virtual sh_video_t* get_sh_video(int id) const; + virtual sh_audio_t* get_sh_audio(int id=0) const; + virtual sh_video_t* get_sh_video(int id=0) const; + virtual char get_sh_sub(int id=0) const; virtual sh_audio_t* new_sh_audio_aid(int id,int aid); sh_audio_t* new_sh_audio(int i=0) { return new_sh_audio_aid(i, i); } virtual sh_video_t* new_sh_video_vid(int id,int vid); sh_video_t* new_sh_video(int i=0) { return new_sh_video_vid(i, i); } + virtual char new_sh_sub(int i=0); virtual int switch_audio(int id) const; virtual int switch_video(int id) const; @@ -123,9 +130,6 @@ Demuxer_Stream* audio; /**< audio buffer/demuxer */ Demuxer_Stream* video; /**< video buffer/demuxer */ Demuxer_Stream* sub; /**< DVD's subtitle buffer/demuxer */ - sh_audio_t* a_streams[MAX_A_STREAMS]; /**< audio streams (sh_audio_t) for multilanguage movies */ - sh_video_t* v_streams[MAX_V_STREAMS]; /**< video streams (sh_video_t) for multipicture movies */ - char s_streams[MAX_S_STREAMS]; /**< DVD's subtitles (flag) streams for multilanguage movies */ off_t filepos; /**< current pos. of input stream */ off_t movi_start; /**< real start of movie within of stream */ off_t movi_end; /**< real end of movie within of stream */ @@ -133,10 +137,11 @@ demuxer_flags_e flags; /**< set of DEMUXF_* bits */ demuxer_type_e file_format; /**< file format: Type_*(mpeg/avi/asf). Will be replaced with properties in the further versions */ int synced; /**< indicates stream synchronisation. TODO: mpg->priv */ - Opaque* priv; /**< private data of demuxer's driver.*/ - const demuxer_driver_t* driver; /**< driver associated with this demuxer */ private: + void _init(stream_t *_stream,int a_id,int v_id,int s_id); + + LocalPtr<Opaque> demuxer_priv; LocalPtr<Demuxer_Info> _info; /**< human-readable info from stream/movie (like movie name,author,duration)*/ }; inline Demuxer::demuxer_flags_e operator~(Demuxer::demuxer_flags_e a) { return static_cast<Demuxer::demuxer_flags_e>(~static_cast<unsigned>(a)); } @@ -147,11 +152,8 @@ inline Demuxer::demuxer_flags_e operator&=(Demuxer::demuxer_flags_e a, Demuxer::demuxer_flags_e b) { return (a=static_cast<Demuxer::demuxer_flags_e>(static_cast<unsigned>(a)&static_cast<unsigned>(b))); } inline Demuxer::demuxer_flags_e operator^=(Demuxer::demuxer_flags_e a, Demuxer::demuxer_flags_e b) { return (a=static_cast<Demuxer::demuxer_flags_e>(static_cast<unsigned>(a)^static_cast<unsigned>(b))); } - Demuxer* demux_open(stream_t *stream,int aid,int vid,int sid); - // This is defined here because demux_stream_t ins't defined in stream.h - stream_t* __FASTCALL__ new_ds_stream(Demuxer_Stream *ds); - - Demuxer* new_demuxers_demuxer(Demuxer* vd, Demuxer* ad, Demuxer* sd); + stream_t* __FASTCALL__ new_ds_stream(Demuxer_Stream *ds); + Demuxer* new_demuxers_demuxer(Demuxer* vd, Demuxer* ad, Demuxer* sd); }// namespace mpxp #endif Modified: mplayerxp/libmpdemux/demuxer_internal.h =================================================================== --- mplayerxp/libmpdemux/demuxer_internal.h 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demuxer_internal.h 2012-12-05 09:25:22 UTC (rev 510) @@ -13,9 +13,10 @@ **/ MPXP_Rc (*probe)(Demuxer *d); /** Opens stream. - * @param d _this demxuer + * @param d _this demuxer + * @return priv_t* **/ - Demuxer* (*open)(Demuxer *d); + Opaque* (*open)(Demuxer *d); /** Reads and demuxes stream. * @param d _this demuxer * @param ds pointer to stream associated with demuxer Modified: mplayerxp/libmpdemux/demuxer_stream.cpp =================================================================== --- mplayerxp/libmpdemux/demuxer_stream.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/libmpdemux/demuxer_stream.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -136,14 +136,10 @@ MSG_HINT(MSGTR_MaybeNI); break; } - if(!demuxer->driver){ - MSG_DBG2("ds_fill_buffer: demux->driver==NULL failed\n"); + if(!demuxer->demux(this)){ + MSG_DBG2("ds_fill_buffer: demuxer->demux() failed\n"); break; // EOF } - if(!demuxer->driver->demux(demuxer,this)){ - MSG_DBG2("ds_fill_buffer: demux->driver->demux() failed\n"); - break; // EOF - } } _buffer_pos=_buffer_size=0; _buffer=NULL; Modified: mplayerxp/mplayerxp.cpp =================================================================== --- mplayerxp/mplayerxp.cpp 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/mplayerxp.cpp 2012-12-05 09:25:22 UTC (rev 510) @@ -1841,7 +1841,7 @@ MP_UNIT("demux_open"); - if(!input_state.after_dvdmenu) MPXPSys.assign_demuxer(demux_open(stream,mp_conf.audio_id,mp_conf.video_id,mp_conf.dvdsub_id)); + if(!input_state.after_dvdmenu) MPXPSys.assign_demuxer(Demuxer::open(stream,mp_conf.audio_id,mp_conf.video_id,mp_conf.dvdsub_id)); if(!MPXPSys.demuxer()) goto goto_next_file; // exit_player(MSGTR_Exit_error); // ERROR input_state.after_dvdmenu=0; Modified: mplayerxp/nls/help_mp-en.h =================================================================== --- mplayerxp/nls/help_mp-en.h 2012-12-04 17:04:36 UTC (rev 509) +++ mplayerxp/nls/help_mp-en.h 2012-12-05 09:25:22 UTC (rev 510) @@ -298,6 +298,9 @@ #ifndef MSGTR_VideoStreamRedefined #define MSGTR_VideoStreamRedefined "Warning! video stream header %d redefined!\n" #endif +#ifndef MSGTR_SubStreamRedefined +#define MSGTR_SubStreamRedefined "Warning! subtitle stream id: %d redefined!\n" +#endif #ifndef MSGTR_TooManyAudioInBuffer #define MSGTR_TooManyAudioInBuffer "\nDEMUXER: Too many (%d in %d bytes) audio packets in the buffer!\n" #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |