aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/mpegvideo.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2025-06-14 01:48:55 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2025-06-21 22:08:52 +0200
commit5cdce56a79510284271f6b2eeb2231ff6a2bc7fd (patch)
treea3d2e7c895af6b34e09b7458181d2bb1d412fe1c /libavcodec/mpegvideo.c
parentf8c0ac9984e38b2f7221cb8838cddde35d0181de (diff)
downloadffmpeg-5cdce56a79510284271f6b2eeb2231ff6a2bc7fd.tar.gz
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@outlook.com>
Diffstat (limited to 'libavcodec/mpegvideo.c')
-rw-r--r--libavcodec/mpegvideo.c29
1 files 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) {