[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