[FFmpeg-devel] [PATCH 46/47] avcodec/mpegvideo: Reduce stack usage when copying MpegEncContext
Andreas Rheinhardt
ffmpegagent at gmail.com
Sun Jun 15 19:54:37 EEST 2025
From: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
(GCC did not perform this on its own; Clang did.)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
libavcodec/mpegvideo.c | 29 +++++++++++++----------------
1 file changed, 13 insertions(+), 16 deletions(-)
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 4701267d81..ff2703f487 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -171,27 +171,24 @@ static av_cold void free_duplicate_contexts(MpegEncContext *s)
free_duplicate_context(s);
}
-static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src)
-{
-#define COPY(a) bak->a = src->a
- COPY(sc);
- COPY(blocks);
- COPY(block);
- COPY(start_mb_y);
- COPY(end_mb_y);
- COPY(dc_val);
- COPY(ac_val);
-#undef COPY
-}
-
int ff_update_duplicate_context(MpegEncContext *dst, const MpegEncContext *src)
{
- MpegEncContext bak;
+#define COPY(M) \
+ M(ScratchpadContext, sc) \
+ M(void*, blocks) \
+ M(void*, block) \
+ M(int, start_mb_y) \
+ M(int, end_mb_y) \
+ M(int16_t*, dc_val) \
+ M(void*, ac_val)
+
int ret;
// FIXME copy only needed parts
- backup_duplicate_context(&bak, dst);
+#define BACKUP(T, member) T member = dst->member;
+ COPY(BACKUP)
memcpy(dst, src, sizeof(MpegEncContext));
- backup_duplicate_context(dst, &bak);
+#define RESTORE(T, member) dst->member = member;
+ COPY(RESTORE)
ret = ff_mpv_framesize_alloc(dst->avctx, &dst->sc, dst->linesize);
if (ret < 0) {
--
ffmpeg-codebot
More information about the ffmpeg-devel
mailing list