From 2cbd734a384377f664945fe43c2d44b79f6020d2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?M=C3=A5ns=20Rullg=C3=A5rd?= Date: Thu, 1 Jul 2010 11:51:01 +0000 Subject: [PATCH] Maybe fix threaded mpeg*video encoding This allocates per-thread copies of some MpegEncContext.ac_val which is used concurrently from the encoding threads. Originally committed as revision 23933 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpegvideo.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 624419a059..8699f82638 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -356,6 +356,9 @@ static void free_picture(MpegEncContext *s, Picture *pic){ } static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){ + int y_size = s->b8_stride * (2 * s->mb_height + 1); + int c_size = s->mb_stride * (s->mb_height + 1); + int yc_size = y_size + 2 * c_size; int i; // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264) @@ -381,6 +384,14 @@ static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){ for(i=0;i<12;i++){ s->pblocks[i] = &s->block[i]; } + + if (s->ac_val_base) { + FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail); + s->ac_val[0] = s->ac_val_base + s->b8_stride + 1; + s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1; + s->ac_val[2] = s->ac_val[1] + c_size; + } + return 0; fail: return -1; //free() through MPV_common_end() @@ -400,6 +411,7 @@ static void free_duplicate_context(MpegEncContext *s){ av_freep(&s->me.map); av_freep(&s->me.score_map); av_freep(&s->blocks); + av_freep(&s->ac_val_base); s->block= NULL; } @@ -423,6 +435,10 @@ static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){ COPY(dct_error_sum); COPY(dct_count[0]); COPY(dct_count[1]); + COPY(ac_val_base); + COPY(ac_val[0]); + COPY(ac_val[1]); + COPY(ac_val[2]); #undef COPY } -- 2.11.0