From 6e8d420a419329d95ac35d520c7a26588f7a51cc Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Fri, 19 Aug 2011 04:59:01 +0300 Subject: demux: avoid a copy of demux packets with lavf, reduce padding When demux_lavf read a new packet it used to copy the data from libavformat's struct AVPacket to struct demux_packet and then free the lavf packet. Change it to instead keep the AVPacket allocated and point demux_packet fields to the buffer in that. Also change MP_INPUT_BUFFER_PADDING_SIZE to 8 which matches FF_INPUT_BUFFER_PADDING SIZE; demux_lavf packets won't have more padding now anyway (it was increased from 8 earlier when FF_INPUT_BUFFER_PADDING_SIZE was increased in libavcodec, but that change was reverted). --- libmpdemux/demuxer.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'libmpdemux/demuxer.c') diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index c59fd3fdc7..d4c43ad657 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -176,7 +176,7 @@ const demuxer_desc_t *const demuxer_list[] = { NULL }; -struct demux_packet *new_demux_packet(size_t len) +static struct demux_packet *create_packet(size_t len) { if (len > 1000000000) { mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Attempt to allocate demux packet " @@ -194,6 +194,13 @@ struct demux_packet *new_demux_packet(size_t len) dp->refcount = 1; dp->master = NULL; dp->buffer = NULL; + dp->avpacket = NULL; + return dp; +} + +struct demux_packet *new_demux_packet(size_t len) +{ + struct demux_packet *dp = create_packet(len); dp->buffer = malloc(len + MP_INPUT_BUFFER_PADDING_SIZE); if (!dp->buffer) { mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Memory allocation failure!\n"); @@ -203,6 +210,14 @@ struct demux_packet *new_demux_packet(size_t len) return dp; } +// data must already have suitable padding +struct demux_packet *new_demux_packet_fromdata(void *data, size_t len) +{ + struct demux_packet *dp = create_packet(len); + dp->buffer = data; + return dp; +} + void resize_demux_packet(struct demux_packet *dp, size_t len) { if (len > 1000000000) { @@ -237,7 +252,10 @@ 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); + if (dp->avpacket) + talloc_free(dp->avpacket); + else + free(dp->buffer); free(dp); } return; -- cgit v1.2.3