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;