Mercurial > mplayer.hg
view libmpdemux/demux_demuxers.c @ 14758:94456deb0624
finally the dreaded white-noise-with-floats bug is fixed!!!!
the problem is that lrintf was not prototyped on some systems, but
it's easier and faster just not to use it at all. looks like the cola
goes to our friends the glibc developers for forgetting to put lrintf
in math.h in some versions. :))) i'm sure there are other broken libcs
too though.
also fixed a minor bug in the int->float conversion where the range
for float samples was exceeded...
author | rfelker |
---|---|
date | Tue, 22 Feb 2005 02:12:58 +0000 |
parents | e3db09ae5154 |
children | 6b86089c2edd |
line wrap: on
line source
#include "config.h" #include <stdlib.h> #include <stdio.h> #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); sh->delay = 0; } if(priv->sd != priv->vd) demux_seek(priv->sd,pos,1); } void demux_close_demuxers(demuxer_t* demuxer) { int i; 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); if(demuxer->info) { for(i=0;demuxer->info[i] != NULL; i++) free(demuxer->info[i]); free(demuxer->info); } free(demuxer); }