summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.h
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-25 22:13:23 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-25 22:13:23 +0000
commitd8c7608ac85e5c38b16129f04cdeff2c958d4aed (patch)
tree3be7ea54e24a01cfd25181a6c29466aabc0687ea /libmpdemux/demuxer.h
parent37e42a149bf3686a8f0ca7505c656ae2029cca4d (diff)
downloadmpv-d8c7608ac85e5c38b16129f04cdeff2c958d4aed.tar.bz2
mpv-d8c7608ac85e5c38b16129f04cdeff2c958d4aed.tar.xz
clone_demux_packet(), using refcounting to avoid memcpy()
based on (sligtly simplified) patch by Alexander Neundorf <neundorf@dellingsoft.de> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6193 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demuxer.h')
-rw-r--r--libmpdemux/demuxer.h29
1 files changed, 27 insertions, 2 deletions
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 1004b2f018..417c43e546 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -51,13 +51,15 @@ typedef struct demux_packet_st {
off_t pos; // position in index (AVI) or file (MPG)
unsigned char* buffer;
int flags; // keyframe, etc
+ int refcount; //refcounter for the master packet, if 0, buffer can be free()d
+ struct demux_packet_st* master; //pointer to the master packet if this one is a cloned one
struct demux_packet_st* next;
} demux_packet_t;
typedef struct {
int buffer_pos; // current buffer position
int buffer_size; // current buffer size
- unsigned char* buffer; // current buffer
+ unsigned char* buffer; // current buffer, never free() it, always use free_demux_packet(buffer_ref);
float pts; // current buffer's pts
int pts_bytes; // number of bytes read after last pts stamp
int eof; // end of demuxed stream? (true if all buffer empty)
@@ -70,6 +72,7 @@ typedef struct {
int bytes; // total bytes of packets in buffer
demux_packet_t *first; // read to current buffer from here
demux_packet_t *last; // append new packets from input stream to here
+ demux_packet_t *current;// needed for refcounting of the buffer
int id; // stream ID (for multiple audio/video streams)
struct demuxer_st *demuxer; // parent demuxer structure (stream handler)
// ---- asf -----
@@ -123,11 +126,33 @@ inline static demux_packet_t* new_demux_packet(int len){
dp->pts=0;
dp->pos=0;
dp->flags=0;
+ dp->refcount=1;
+ dp->master=NULL;
+ return dp;
+}
+
+inline static demux_packet_t* clone_demux_packet(demux_packet_t* pack){
+ demux_packet_t* dp=malloc(sizeof(demux_packet_t));
+ while(pack->master) pack=pack->master; // find the master
+ memcpy(dp,pack,sizeof(demux_packet_t));
+ dp->next=NULL;
+ dp->refcount=0;
+ dp->master=pack;
+ pack->refcount++;
return dp;
}
inline static void free_demux_packet(demux_packet_t* dp){
- free(dp->buffer);
+ if (dp->master==NULL){ //dp is a master packet
+ dp->refcount--;
+ if (dp->refcount==0){
+ if (dp->buffer) free(dp->buffer);
+ free(dp);
+ }
+ return;
+ }
+ // dp is a clone:
+ free_demux_packet(dp->master);
free(dp);
}