From 05ebe51e00e900bcef7d3e9bcd6b91d4aab34de7 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 29 Jan 2012 22:37:37 +0100 Subject: [PATCH] mpeg/h264: update thread context even if it is not initialized. Fixes decoding of Ticket952 Tested-by: Nicolas George Signed-off-by: Michael Niedermayer --- libavcodec/h264.c | 13 ++++++++----- libavcodec/mpegvideo.c | 10 ++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index a4892ac902..a3343da6e4 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -1224,7 +1224,7 @@ static int decode_update_thread_context(AVCodecContext *dst, const AVCodecContex int inited = s->context_initialized, err; int i; - if(dst == src || !s1->context_initialized) return 0; + if(dst == src) return 0; err = ff_mpeg_update_thread_context(dst, src); if(err) return err; @@ -1240,12 +1240,19 @@ static int decode_update_thread_context(AVCodecContext *dst, const AVCodecContex memcpy(&h->s + 1, &h1->s + 1, sizeof(H264Context) - sizeof(MpegEncContext)); //copy all fields after MpegEnc memset(h->sps_buffers, 0, sizeof(h->sps_buffers)); memset(h->pps_buffers, 0, sizeof(h->pps_buffers)); + + if (s1->context_initialized) { if (ff_h264_alloc_tables(h) < 0) { av_log(dst, AV_LOG_ERROR, "Could not allocate memory for h264\n"); return AVERROR(ENOMEM); } context_init(h); + // frame_start may not be called for the next thread (if it's decoding a bottom field) + // so this has to be allocated here + h->s.obmc_scratchpad = av_malloc(16*6*s->linesize); + } + for(i=0; i<2; i++){ h->rbsp_buffer[i] = NULL; h->rbsp_buffer_size[i] = 0; @@ -1253,10 +1260,6 @@ static int decode_update_thread_context(AVCodecContext *dst, const AVCodecContex h->thread_context[0] = h; - // frame_start may not be called for the next thread (if it's decoding a bottom field) - // so this has to be allocated here - h->s.obmc_scratchpad = av_malloc(16*6*s->linesize); - s->dsp.clear_blocks(h->mb); s->dsp.clear_blocks(h->mb+(24*16<pixel_shift)); } diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 04c149a99b..f197bd78a2 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -531,7 +531,7 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, { MpegEncContext *s = dst->priv_data, *s1 = src->priv_data; - if (dst == src || !s1->context_initialized) + if (dst == src) return 0; // FIXME can parameters change on I-frames? @@ -540,12 +540,14 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, memcpy(s, s1, sizeof(MpegEncContext)); s->avctx = dst; - s->picture_range_start += MAX_PICTURE_COUNT; - s->picture_range_end += MAX_PICTURE_COUNT; s->bitstream_buffer = NULL; s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0; - MPV_common_init(s); + if (s1->context_initialized){ + s->picture_range_start += MAX_PICTURE_COUNT; + s->picture_range_end += MAX_PICTURE_COUNT; + MPV_common_init(s); + } } s->avctx->coded_height = s1->avctx->coded_height;