From 029df555f80952acf953322e0ee22903bf862e81 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Thu, 18 Mar 2021 23:44:07 +0100 Subject: [PATCH] avformat/webpenc: Don't use sizeof(AVPacket) In this case it means replacing a packet in the muxer's context by a pointer to an AVPacket, namely AVFormatInternal.pkt. Because this packet is freed generically, one can remove the muxer's deinit function. Signed-off-by: Andreas Rheinhardt --- libavformat/webpenc.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/libavformat/webpenc.c b/libavformat/webpenc.c index 9599fe7b85..8a5c29201a 100644 --- a/libavformat/webpenc.c +++ b/libavformat/webpenc.c @@ -27,7 +27,7 @@ typedef struct WebpContext{ AVClass *class; int frame_count; - AVPacket last_pkt; + AVPacket *last_pkt; /* Not owned by us */ int loop; int wrote_webp_header; int using_webp_anim_encoder; @@ -35,8 +35,11 @@ typedef struct WebpContext{ static int webp_init(AVFormatContext *s) { + WebpContext *const w = s->priv_data; AVStream *st; + w->last_pkt = ffformatcontext(s)->pkt; + if (s->nb_streams != 1) { av_log(s, AV_LOG_ERROR, "Only exactly 1 stream is supported\n"); return AVERROR(EINVAL); @@ -77,18 +80,18 @@ static int flush(AVFormatContext *s, int trailer, int64_t pts) WebpContext *w = s->priv_data; AVStream *st = s->streams[0]; - if (w->last_pkt.size) { + if (w->last_pkt->size) { int skip = 0; unsigned flags = 0; int vp8x = 0; - if (AV_RL32(w->last_pkt.data) == AV_RL32("RIFF")) + if (AV_RL32(w->last_pkt->data) == AV_RL32("RIFF")) skip = 12; - if (AV_RL32(w->last_pkt.data + skip) == AV_RL32("VP8X")) { - flags |= w->last_pkt.data[skip + 4 + 4]; + if (AV_RL32(w->last_pkt->data + skip) == AV_RL32("VP8X")) { + flags |= w->last_pkt->data[skip + 4 + 4]; vp8x = 1; - skip += AV_RL32(w->last_pkt.data + skip + 4) + 8; + skip += AV_RL32(w->last_pkt->data + skip + 4) + 8; } if (!w->wrote_webp_header) { @@ -122,19 +125,19 @@ static int flush(AVFormatContext *s, int trailer, int64_t pts) if (w->frame_count > trailer) { avio_write(s->pb, "ANMF", 4); - avio_wl32(s->pb, 16 + w->last_pkt.size - skip); + avio_wl32(s->pb, 16 + w->last_pkt->size - skip); avio_wl24(s->pb, 0); avio_wl24(s->pb, 0); avio_wl24(s->pb, st->codecpar->width - 1); avio_wl24(s->pb, st->codecpar->height - 1); - if (w->last_pkt.pts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE) { - avio_wl24(s->pb, pts - w->last_pkt.pts); + if (w->last_pkt->pts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE) { + avio_wl24(s->pb, pts - w->last_pkt->pts); } else - avio_wl24(s->pb, w->last_pkt.duration); + avio_wl24(s->pb, w->last_pkt->duration); avio_w8(s->pb, 0); } - avio_write(s->pb, w->last_pkt.data + skip, w->last_pkt.size - skip); - av_packet_unref(&w->last_pkt); + avio_write(s->pb, w->last_pkt->data + skip, w->last_pkt->size - skip); + av_packet_unref(w->last_pkt); } return 0; @@ -159,7 +162,7 @@ static int webp_write_packet(AVFormatContext *s, AVPacket *pkt) int ret; if ((ret = flush(s, 0, pkt->pts)) < 0) return ret; - av_packet_ref(&w->last_pkt, pkt); + av_packet_ref(w->last_pkt, pkt); } ++w->frame_count; @@ -191,13 +194,6 @@ static int webp_write_trailer(AVFormatContext *s) return 0; } -static void webp_deinit(AVFormatContext *s) -{ - WebpContext *w = s->priv_data; - - av_packet_unref(&w->last_pkt); -} - #define OFFSET(x) offsetof(WebpContext, x) #define ENC AV_OPT_FLAG_ENCODING_PARAM static const AVOption options[] = { @@ -221,7 +217,6 @@ const AVOutputFormat ff_webp_muxer = { .init = webp_init, .write_packet = webp_write_packet, .write_trailer = webp_write_trailer, - .deinit = webp_deinit, .priv_class = &webp_muxer_class, .flags = AVFMT_VARIABLE_FPS, };