From f71142496931d264ceeedfaac399eba07b7c5def Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Thu, 24 Mar 2011 12:16:22 -0400 Subject: [PATCH] mpeg12.c: fix slice threading for mpeg2 field picture mode. Fixes "make THREADS=2 fate-mpeg2-field-enc". --- libavcodec/mpeg12.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index c60826b91b..c47b6e2877 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -1882,7 +1882,9 @@ static int slice_decode_thread(AVCodecContext *c, void *arg){ start_code= -1; buf = ff_find_start_code(buf, s->gb.buffer_end, &start_code); - mb_y= start_code - SLICE_MIN_START_CODE; + mb_y= (start_code - SLICE_MIN_START_CODE) << field_pic; + if (s->picture_structure == PICT_BOTTOM_FIELD) + mb_y++; if(mb_y < 0 || mb_y >= s->end_mb_y) return -1; } @@ -2299,6 +2301,16 @@ static int decode_chunks(AVCodecContext *avctx, break; case PICTURE_START_CODE: + if (avctx->thread_count > 1 && s->slice_count) { + int i; + + avctx->execute(avctx, slice_decode_thread, + s2->thread_context, NULL, + s->slice_count, sizeof(void*)); + for (i = 0; i < s->slice_count; i++) + s2->error_count += s2->thread_context[i]->error_count; + s->slice_count = 0; + } if(last_code == 0 || last_code == SLICE_MIN_START_CODE){ if(mpeg_decode_postinit(avctx) < 0){ av_log(avctx, AV_LOG_ERROR, "mpeg_decode_postinit() failure\n");