diff options
Diffstat (limited to 'libmpdemux/demux_demuxers.c')
-rw-r--r-- | libmpdemux/demux_demuxers.c | 175 |
1 files changed, 0 insertions, 175 deletions
diff --git a/libmpdemux/demux_demuxers.c b/libmpdemux/demux_demuxers.c deleted file mode 100644 index b66bf57bdb..0000000000 --- a/libmpdemux/demux_demuxers.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" -#include "mp_msg.h" - -#include <stdlib.h> -#include <stdio.h> -#include "stream/stream.h" -#include "demuxer.h" -#include "stheader.h" -#include "talloc.h" - -typedef struct dd_priv { - demuxer_t* vd; - demuxer_t* ad; - demuxer_t* sd; -} dd_priv_t; - -extern const demuxer_desc_t demuxer_desc_demuxers; - -demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) { - demuxer_t* ret; - dd_priv_t* priv; - - ret = talloc_zero(NULL, struct demuxer); - - priv = 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->stream_pts = MP_NOPTS_VALUE; - - ret->video = vd->video; - ret->audio = ad->audio; - ret->sub = sd->sub; - if (sd && sd != vd && sd != ad) sd->sub->non_interleaved = 1; - - // without these, demux_demuxers_fill_buffer will never be called, - // but they break the demuxer-specific code in video.c -#if 0 - if (vd) vd->video->demuxer = ret; - if (ad) ad->audio->demuxer = ret; - if (sd) sd->sub->demuxer = ret; - - // HACK?, necessary for subtitle (and audio and video when implemented) switching - memcpy(ret->v_streams, vd->v_streams, sizeof(ret->v_streams)); - memcpy(ret->a_streams, ad->a_streams, sizeof(ret->a_streams)); - memcpy(ret->s_streams, sd->s_streams, sizeof(ret->s_streams)); -#endif - - ret->desc = &demuxer_desc_demuxers; - - return ret; -} - -static int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) { - dd_priv_t* priv; - - priv=demux->priv; - - // HACK: make sure the subtitles get properly interleaved if with -subfile - if (priv->sd && priv->sd->sub != ds && - priv->sd != priv->vd && priv->sd != priv->ad) - ds_get_next_pts(priv->sd->sub); - if(priv->vd && priv->vd->video == ds) - return demux_fill_buffer(priv->vd,ds); - else if(priv->ad && priv->ad->audio == ds) - return demux_fill_buffer(priv->ad,ds); - else if(priv->sd && priv->sd->sub == ds) - return demux_fill_buffer(priv->sd,ds); - - mp_tmsg(MSGT_DEMUX,MSGL_WARN,"fill_buffer error: bad demuxer: not vd, ad or sd.\n"); - return 0; -} - -static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,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,audio_delay,flags); - // Get the new pos - pos = demuxer->video->pts; - if (pos == MP_NOPTS_VALUE) { - demux_fill_buffer(priv->vd, demuxer->video); - if (demuxer->video->first) - pos = demuxer->video->first->pts; - } - - if(priv->ad != priv->vd && demuxer->audio->sh) { - sh_audio_t* sh = demuxer->audio->sh; - demux_seek(priv->ad,pos,audio_delay,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(priv->sd != priv->vd) - demux_seek(priv->sd,pos,audio_delay,1); - -} - -static void demux_close_demuxers(demuxer_t* demuxer) { - dd_priv_t* priv = demuxer->priv; - stream_t *s; - - if(priv->vd) - free_demuxer(priv->vd); - if(priv->ad && priv->ad != priv->vd) { - // That's a hack to free the audio file stream - // It's ok atm but we shouldn't free that here - s = priv->ad->stream; - free_demuxer(priv->ad); - free_stream(s); - } if(priv->sd && priv->sd != priv->vd && priv->sd != priv->ad) { - s = priv->sd->stream; - free_demuxer(priv->sd); - free_stream(s); - } - - free(priv); -} - - -static int demux_demuxers_control(demuxer_t *demuxer,int cmd, void *arg){ - dd_priv_t* priv = demuxer->priv; - switch (cmd) { - case DEMUXER_CTRL_GET_TIME_LENGTH: - case DEMUXER_CTRL_GET_PERCENT_POS: - return demux_control(priv->vd, cmd, arg); - } - return DEMUXER_CTRL_NOTIMPL; -} - -const demuxer_desc_t demuxer_desc_demuxers = { - "Demuxers demuxer", - "", // Not selectable - "", - "?", - "internal use only", - DEMUXER_TYPE_DEMUXERS, - 0, // no autodetect - NULL, - demux_demuxers_fill_buffer, - NULL, - demux_close_demuxers, - demux_demuxers_seek, - demux_demuxers_control -}; |