diff options
author | Uoti Urpala <uau@mplayer2.org> | 2011-08-19 04:59:01 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2011-08-19 21:32:47 +0300 |
commit | 6e8d420a419329d95ac35d520c7a26588f7a51cc (patch) | |
tree | fa56028f11f839101ee3f8a8a9a64848655588fb /libmpdemux/demuxer.c | |
parent | 6ec60c976f6fa990ed1c7efa0ceb7e7634d163c7 (diff) | |
download | mpv-6e8d420a419329d95ac35d520c7a26588f7a51cc.tar.bz2 mpv-6e8d420a419329d95ac35d520c7a26588f7a51cc.tar.xz |
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).
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r-- | libmpdemux/demuxer.c | 22 |
1 files changed, 20 insertions, 2 deletions
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; |