Mercurial > mplayer.hg
diff libmpdemux/demuxer.c @ 6192:f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
based on (sligtly simplified) patch by Alexander Neundorf <neundorf@dellingsoft.de>
author | arpi |
---|---|
date | Sat, 25 May 2002 22:13:23 +0000 |
parents | 68cac7ecaf05 |
children | f0b933918a22 |
line wrap: on
line diff
--- a/libmpdemux/demuxer.c Sat May 25 21:43:02 2002 +0000 +++ b/libmpdemux/demuxer.c Sat May 25 22:13:23 2002 +0000 @@ -38,7 +38,7 @@ //--------------- ds->packs=0; ds->bytes=0; - ds->first=ds->last=NULL; + ds->first=ds->last=ds->current=NULL; ds->id=id; ds->demuxer=demuxer; //---------------- @@ -296,7 +296,7 @@ // 1 = succesfull int ds_fill_buffer(demux_stream_t *ds){ demuxer_t *demux=ds->demuxer; - if(ds->buffer) free(ds->buffer); + if(ds->current) free_demux_packet(ds->current); if(verbose>2){ if(ds==demux->audio) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_audio) called\n");else if(ds==demux->video) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_video) called\n");else @@ -319,11 +319,11 @@ } ds->pts_bytes+=p->len; // !!! ds->flags=p->flags; - // free packet: + // unlink packet: ds->bytes-=p->len; + ds->current=p; ds->first=p->next; if(!ds->first) ds->last=NULL; - free(p); --ds->packs; return 1; //ds->buffer_size; } @@ -344,6 +344,7 @@ } ds->buffer_pos=ds->buffer_size=0; ds->buffer=NULL; + ds->current=NULL; mp_msg(MSGT_DEMUXER,MSGL_V,"ds_fill_buffer: EOF reached (stream: %s) \n",ds==demux->audio?"audio":"video"); ds->eof=1; return 0; @@ -387,8 +388,7 @@ demux_packet_t *dp=ds->first; while(dp){ demux_packet_t *dn=dp->next; - if(dp->buffer) free(dp->buffer); - free(dp); + free_demux_packet(dp); dp=dn; } if(ds->asf_packet){ @@ -400,7 +400,8 @@ ds->first=ds->last=NULL; ds->packs=0; // !!!!! ds->bytes=0; - if(ds->buffer) free(ds->buffer); + if(ds->current) free_demux_packet(ds->current); + ds->current=NULL; ds->buffer=NULL; ds->buffer_pos=ds->buffer_size; ds->pts=0; ds->pts_bytes=0;