summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r--libmpdemux/demuxer.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index dc5d8858bc..85f8e875ee 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -177,6 +177,69 @@ const demuxer_desc_t *const demuxer_list[] = {
NULL
};
+struct demux_packet *new_demux_packet(int len)
+{
+ struct demux_packet *dp = malloc(sizeof(struct demux_packet));
+ dp->len = len;
+ dp->next = NULL;
+ dp->pts = MP_NOPTS_VALUE;
+ dp->endpts = MP_NOPTS_VALUE;
+ 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)))
+ memset(dp->buffer + len, 0, 8);
+ else
+ dp->len = 0;
+ return dp;
+}
+
+void resize_demux_packet(struct demux_packet *dp, int len)
+{
+ if (len > 0) {
+ dp->buffer = realloc(dp->buffer, len + 8);
+ } else {
+ free(dp->buffer);
+ dp->buffer = NULL;
+ }
+ dp->len = len;
+ if (dp->buffer)
+ memset(dp->buffer + len, 0, 8);
+ else
+ dp->len = 0;
+}
+
+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);