mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-02 14:07:23 +08:00
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>
This commit is contained in:
@ -171,27 +171,24 @@ static av_cold void free_duplicate_contexts(MpegEncContext *s)
|
|||||||
free_duplicate_context(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)
|
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;
|
int ret;
|
||||||
// FIXME copy only needed parts
|
// 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));
|
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);
|
ret = ff_mpv_framesize_alloc(dst->avctx, &dst->sc, dst->linesize);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
Reference in New Issue
Block a user