diff options
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r-- | libmpdemux/demuxer.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 098c631631..6607f2399f 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -175,6 +175,84 @@ const demuxer_desc_t *const demuxer_list[] = { NULL }; +struct demux_packet *new_demux_packet(size_t len) +{ + if (len > 1000000000) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Attempt to allocate demux packet " + "over 1 GB!\n"); + abort(); + } + struct demux_packet *dp = malloc(sizeof(struct demux_packet)); + dp->len = len; + dp->next = NULL; + dp->pts = MP_NOPTS_VALUE; + dp->duration = -1; + dp->stream_pts = MP_NOPTS_VALUE; + dp->pos = 0; + dp->flags = 0; + dp->refcount = 1; + dp->master = NULL; + dp->buffer = NULL; + if (len > 0) { + dp->buffer = malloc(len + MP_INPUT_BUFFER_PADDING_SIZE); + if (!dp->buffer) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Memory allocation failure!\n"); + abort(); + } + memset(dp->buffer + len, 0, 8); + } + return dp; +} + +void resize_demux_packet(struct demux_packet *dp, size_t len) +{ + if (len > 1000000000) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Attempt to realloc demux packet " + "over 1 GB!\n"); + abort(); + } + if (len > 0) { + dp->buffer = realloc(dp->buffer, len + 8); + if (!dp->buffer) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Memory allocation failure!\n"); + abort(); + } + memset(dp->buffer + len, 0, 8); + } else { + free(dp->buffer); + dp->buffer = NULL; + } + dp->len = len; +} + +struct demux_packet *clone_demux_packet(struct demux_packet *pack) +{ + struct demux_packet *dp = malloc(sizeof(struct demux_packet)); + while (pack->master) + pack = pack->master; // find the master + memcpy(dp, pack, sizeof(struct demux_packet)); + dp->next = NULL; + dp->refcount = 0; + dp->master = pack; + pack->refcount++; + return dp; +} + +void free_demux_packet(struct demux_packet *dp) +{ + if (dp->master == NULL) { //dp is a master packet + dp->refcount--; + if (dp->refcount == 0) { + free(dp->buffer); + free(dp); + } + return; + } + // dp is a clone: + free_demux_packet(dp->master); + free(dp); +} + void free_demuxer_stream(demux_stream_t *ds) { ds_free_packs(ds); |