From abea3749b32f3a25c271b80c0a673ffcf00b9636 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Sun, 18 Feb 2024 00:38:34 +0100 Subject: [PATCH] avcodec/webvttenc: Don't copy data around unnecessarily Using av_bprint_init_for_buffer() avoids copying data into the internal AVBPrint buffer (or worse: to allocate a temporary buffer in case the internal buffer does not suffice). It also ensures that the data is always 0-terminated. Signed-off-by: Andreas Rheinhardt --- libavcodec/webvttenc.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/libavcodec/webvttenc.c b/libavcodec/webvttenc.c index 4369aacb74..9922f33485 100644 --- a/libavcodec/webvttenc.c +++ b/libavcodec/webvttenc.c @@ -22,7 +22,6 @@ #include #include "avcodec.h" -#include "libavutil/avstring.h" #include "libavutil/bprint.h" #include "ass_split.h" #include "ass.h" @@ -162,7 +161,7 @@ static int webvtt_encode_frame(AVCodecContext *avctx, ASSDialog *dialog; int i; - av_bprint_clear(&s->buffer); + av_bprint_init_for_buffer(&s->buffer, buf, bufsize); for (i=0; inum_rects; i++) { const char *ass = sub->rects[i]->ass; @@ -180,16 +179,13 @@ static int webvtt_encode_frame(AVCodecContext *avctx, ff_ass_free_dialog(&dialog); } - if (!av_bprint_is_complete(&s->buffer)) - return AVERROR(ENOMEM); if (!s->buffer.len) return 0; - if (s->buffer.len > bufsize) { + if (!av_bprint_is_complete(&s->buffer)) { av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n"); return AVERROR_BUFFER_TOO_SMALL; } - memcpy(buf, s->buffer.str, s->buffer.len); return s->buffer.len; } @@ -198,7 +194,6 @@ static int webvtt_encode_close(AVCodecContext *avctx) { WebVTTContext *s = avctx->priv_data; ff_ass_split_free(s->ass_ctx); - av_bprint_finalize(&s->buffer, NULL); return 0; } @@ -207,7 +202,6 @@ static av_cold int webvtt_encode_init(AVCodecContext *avctx) WebVTTContext *s = avctx->priv_data; s->avctx = avctx; s->ass_ctx = ff_ass_split(avctx->subtitle_header); - av_bprint_init(&s->buffer, 0, AV_BPRINT_SIZE_UNLIMITED); return s->ass_ctx ? 0 : AVERROR_INVALIDDATA; }