diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index 6494131c01..9903fde530 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -1214,11 +1214,12 @@ static bool demux_lavf_read_packet(struct demuxer *demux, { lavf_priv_t *priv = demux->priv; - AVPacket *pkt = &(AVPacket){0}; + AVPacket *pkt = av_packet_alloc(); + MP_HANDLE_OOM(pkt); int r = av_read_frame(priv->avfc, pkt); update_read_stats(demux); if (r < 0) { - av_packet_unref(pkt); + av_packet_free(&pkt); if (r == AVERROR_EOF) return false; MP_WARN(demux, "error reading packet: %s.\n", av_err2str(r)); @@ -1240,19 +1241,19 @@ static bool demux_lavf_read_packet(struct demuxer *demux, AVStream *st = priv->avfc->streams[pkt->stream_index]; if (!demux_stream_is_selected(stream)) { - av_packet_unref(pkt); + av_packet_free(&pkt); return true; // don't signal EOF if skipping a packet } // Never send additional frames for streams that are a single frame. if (stream->image && priv->format_hack.first_frame_only && pkt->pos != 0) { - av_packet_unref(pkt); + av_packet_free(&pkt); return true; } struct demux_packet *dp = new_demux_packet_from_avpacket(demux->packet_pool, pkt); if (!dp) { - av_packet_unref(pkt); + av_packet_free(&pkt); return true; } @@ -1265,7 +1266,7 @@ static bool demux_lavf_read_packet(struct demuxer *demux, dp->pos = pkt->pos; dp->keyframe = pkt->flags & AV_PKT_FLAG_KEY; dp->is_wrapped_avframe = st->codecpar->codec_id == AV_CODEC_ID_WRAPPED_AVFRAME; - av_packet_unref(pkt); + av_packet_free(&pkt); if (priv->format_hack.clear_filepos) dp->pos = -1;