demux_lavf: replace deprecated usage of stack allocated AVPackets

sizeof(AVPacket) being part of an ABI is deprecated. This was the last
remaining stack usage, missed in previous related change.

Note that we still use sizeof(AVPacket) and sizeof(AVBufferRef) in
demux_packet_estimate_total_size(). But it's safe, the worse that can
happen is that we underestimate the size on mismatch.

Fixes: cb15bc4324
This commit is contained in:
Kacper Michajłow
2025-04-27 16:53:57 +02:00
parent b72d6aa0e1
commit f8cef99033
+7 -6
View File
@@ -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;