summaryrefslogtreecommitdiffstats
path: root/demux/demux_lavf.c
diff options
context:
space:
mode:
Diffstat (limited to 'demux/demux_lavf.c')
-rw-r--r--demux/demux_lavf.c23
1 files changed, 5 insertions, 18 deletions
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index d8d177e27e..16a06829d4 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -780,23 +780,16 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
return 0;
}
-static void destroy_avpacket(void *pkt)
-{
- av_free_packet(pkt);
-}
-
static int demux_lavf_fill_buffer(demuxer_t *demux)
{
lavf_priv_t *priv = demux->priv;
- demux_packet_t *dp;
- AVPacket *pkt = talloc(NULL, AVPacket);
+ AVPacket *pkt = &(AVPacket){0};
int r = av_read_frame(priv->avfc, pkt);
if (r < 0) {
- talloc_free(pkt);
+ av_free_packet(pkt);
return r == AVERROR(EAGAIN) ? 1 : -1; // eof
}
- talloc_set_destructor(pkt, destroy_avpacket);
add_new_streams(demux);
update_metadata(demux, pkt);
@@ -806,18 +799,11 @@ static int demux_lavf_fill_buffer(demuxer_t *demux)
AVStream *st = priv->avfc->streams[pkt->stream_index];
if (!demux_stream_is_selected(stream)) {
- talloc_free(pkt);
+ av_free_packet(pkt);
return 1; // don't signal EOF if skipping a packet
}
- // If the packet has pointers to temporary fields that could be
- // overwritten/freed by next av_read_frame(), copy them to persistent
- // allocations so we can safely queue the packet for any length of time.
- if (av_dup_packet(pkt) < 0)
- abort();
-
- dp = new_demux_packet_fromdata(pkt->data, pkt->size);
- dp->avpacket = talloc_steal(dp, pkt);
+ struct demux_packet *dp = new_demux_packet_from_avpacket(pkt);
if (pkt->pts != AV_NOPTS_VALUE)
dp->pts = pkt->pts * av_q2d(st->time_base);
@@ -833,6 +819,7 @@ static int demux_lavf_fill_buffer(demuxer_t *demux)
} else if (dp->dts != MP_NOPTS_VALUE) {
priv->last_pts = dp->dts * AV_TIME_BASE;
}
+ av_free_packet(pkt);
demux_add_packet(stream, dp);
return 1;
}