[FFmpeg-cvslog] avcodec/mpegvideo: Reduce stack usage when copying MpegEncContext

Andreas Rheinhardt git at videolan.org
Sat Jun 21 23:21:37 EEST 2025


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Sat Jun 14 01:48:55 2025 +0200| [5cdce56a79510284271f6b2eeb2231ff6a2bc7fd] | committer: Andreas Rheinhardt

avcodec/mpegvideo: Reduce stack usage when copying MpegEncContext

(GCC did not perform this on its own; Clang did.)

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5cdce56a79510284271f6b2eeb2231ff6a2bc7fd
---

 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) {



More information about the ffmpeg-cvslog mailing list