summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2011-08-19 04:59:01 +0300
committerUoti Urpala <uau@mplayer2.org>2011-08-19 21:32:47 +0300
commit6e8d420a419329d95ac35d520c7a26588f7a51cc (patch)
treefa56028f11f839101ee3f8a8a9a64848655588fb /libmpdemux/demuxer.c
parent6ec60c976f6fa990ed1c7efa0ceb7e7634d163c7 (diff)
downloadmpv-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.c22
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;