[FFmpeg-devel] [PATCH 1/4] ffv1dec: Avoid unnecessarily large stack usage and copies.
Reimar Döffinger
Reimar.Doeffinger at gmx.de
Wed Sep 3 00:01:52 CEST 2014
Ideally the compiler could figure this out on its own,
but it seems it can't.
An alternative that would avoid the messy explicit memcpy
would be to use a sub-struct for the parts that should
be preserved, which can then simply be assigned.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
---
libavcodec/ffv1dec.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
index c408f16..5fbe51c 100644
--- a/libavcodec/ffv1dec.c
+++ b/libavcodec/ffv1dec.c
@@ -1051,12 +1051,17 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
return 0;
{
- FFV1Context bak = *fdst;
+ ThreadFrame picture = fdst->picture, last_picture = fdst->last_picture;
+ uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
+ struct FFV1Context *slice_context[MAX_SLICES];
+ memcpy(initial_states, fdst->initial_states, sizeof(fdst->initial_states));
+ memcpy(slice_context, fdst->slice_context , sizeof(fdst->slice_context));
+
memcpy(fdst, fsrc, sizeof(*fdst));
- memcpy(fdst->initial_states, bak.initial_states, sizeof(fdst->initial_states));
- memcpy(fdst->slice_context, bak.slice_context , sizeof(fdst->slice_context));
- fdst->picture = bak.picture;
- fdst->last_picture = bak.last_picture;
+ memcpy(fdst->initial_states, initial_states, sizeof(fdst->initial_states));
+ memcpy(fdst->slice_context, slice_context , sizeof(fdst->slice_context));
+ fdst->picture = picture;
+ fdst->last_picture = last_picture;
for (i = 0; i<fdst->num_h_slices * fdst->num_v_slices; i++) {
FFV1Context *fssrc = fsrc->slice_context[i];
FFV1Context *fsdst = fdst->slice_context[i];
--
2.1.0
More information about the ffmpeg-devel
mailing list