[FFmpeg-cvslog] avformat/webpenc: Don't use sizeof(AVPacket)
Andreas Rheinhardt
git at videolan.org
Sun Oct 3 23:49:08 EEST 2021
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Thu Mar 18 23:44:07 2021 +0100| [029df555f80952acf953322e0ee22903bf862e81] | committer: Andreas Rheinhardt
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 <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=029df555f80952acf953322e0ee22903bf862e81
---
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,
};
More information about the ffmpeg-cvslog
mailing list