From 005e19664820f24891131c566fef253adeec4ce1 Mon Sep 17 00:00:00 2001 From: albeu Date: Wed, 20 Feb 2002 16:59:25 +0000 Subject: Demuxers demuxer support for using external audiofile (or muxed subtitles). Options registration for libmpdemux. Demuxer info query. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4766 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_demuxers.c | 83 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 libmpdemux/demux_demuxers.c (limited to 'libmpdemux/demux_demuxers.c') diff --git a/libmpdemux/demux_demuxers.c b/libmpdemux/demux_demuxers.c new file mode 100644 index 0000000000..90118f802e --- /dev/null +++ b/libmpdemux/demux_demuxers.c @@ -0,0 +1,83 @@ + +#include "config.h" + +#include +#include +#include "stream.h" +#include "demuxer.h" +#include "stheader.h" + +typedef struct dd_priv { + demuxer_t* vd; + demuxer_t* ad; + demuxer_t* sd; +} dd_priv_t; + + +demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) { + demuxer_t* ret; + dd_priv_t* priv; + + ret = (demuxer_t*)calloc(1,sizeof(demuxer_t)); + + priv = (dd_priv_t*)malloc(sizeof(dd_priv_t)); + priv->vd = vd; + priv->ad = ad; + priv->sd = sd; + ret->priv = priv; + + ret->type = ret->file_format = DEMUXER_TYPE_DEMUXERS; + // Video is the most important :-) + ret->stream = vd->stream; + ret->seekable = vd->seekable && ad->seekable && sd->seekable; + + ret->video = vd->video; + ret->audio = ad->audio; + ret->sub = sd->sub; + + return ret; +} + +int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) { + dd_priv_t* priv; + + priv=demux->priv; + + if(ds->demuxer == priv->vd) + return demux_fill_buffer(priv->vd,ds); + else if(ds->demuxer == priv->ad) + return demux_fill_buffer(priv->ad,ds); + else if(ds->demuxer == priv->sd) + return demux_fill_buffer(priv->sd,ds); + + printf("Demux demuxers fill_buffer error : bad demuxer : not vd, ad nor sd\n"); + return 0; +} + +void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) { + dd_priv_t* priv; + float pos; + priv=demuxer->priv; + + priv->ad->stream->eof = 0; + priv->sd->stream->eof = 0; + + // Seek video + demux_seek(priv->vd,rel_seek_secs,flags); + // Get the new pos + pos = demuxer->video->pts; + + if(priv->ad != priv->vd) { + sh_audio_t* sh = (sh_audio_t*)demuxer->audio->sh; + demux_seek(priv->ad,pos,1); + // In case the demuxer don't set pts + if(!demuxer->audio->pts) + demuxer->audio->pts = pos-((ds_tell_pts(demuxer->audio)-sh->a_in_buffer_len)/(float)sh->i_bps); + if(sh->timer) + sh->timer = 0; + } + + if(priv->sd != priv->vd) + demux_seek(priv->sd,pos,1); + +} -- cgit v1.2.3