Browse Source

mpeg/h264: update thread context even if it is not initialized.

Fixes decoding of Ticket952

Tested-by: Nicolas George <nicolas.george@normalesup.org>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
tags/n0.11
Michael Niedermayer 13 years ago
parent
commit
05ebe51e00
2 changed files with 14 additions and 9 deletions
  1. +8
    -5
      libavcodec/h264.c
  2. +6
    -4
      libavcodec/mpegvideo.c

+ 8
- 5
libavcodec/h264.c View File

@@ -1224,7 +1224,7 @@ static int decode_update_thread_context(AVCodecContext *dst, const AVCodecContex
int inited = s->context_initialized, err; int inited = s->context_initialized, err;
int i; int i;


if(dst == src || !s1->context_initialized) return 0;
if(dst == src) return 0;


err = ff_mpeg_update_thread_context(dst, src); err = ff_mpeg_update_thread_context(dst, src);
if(err) return err; 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 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->sps_buffers, 0, sizeof(h->sps_buffers));
memset(h->pps_buffers, 0, sizeof(h->pps_buffers)); memset(h->pps_buffers, 0, sizeof(h->pps_buffers));

if (s1->context_initialized) {
if (ff_h264_alloc_tables(h) < 0) { if (ff_h264_alloc_tables(h) < 0) {
av_log(dst, AV_LOG_ERROR, "Could not allocate memory for h264\n"); av_log(dst, AV_LOG_ERROR, "Could not allocate memory for h264\n");
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
context_init(h); 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++){ for(i=0; i<2; i++){
h->rbsp_buffer[i] = NULL; h->rbsp_buffer[i] = NULL;
h->rbsp_buffer_size[i] = 0; 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; 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);
s->dsp.clear_blocks(h->mb+(24*16<<h->pixel_shift)); s->dsp.clear_blocks(h->mb+(24*16<<h->pixel_shift));
} }


+ 6
- 4
libavcodec/mpegvideo.c View File

@@ -531,7 +531,7 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst,
{ {
MpegEncContext *s = dst->priv_data, *s1 = src->priv_data; MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;


if (dst == src || !s1->context_initialized)
if (dst == src)
return 0; return 0;


// FIXME can parameters change on I-frames? // FIXME can parameters change on I-frames?
@@ -540,12 +540,14 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst,
memcpy(s, s1, sizeof(MpegEncContext)); memcpy(s, s1, sizeof(MpegEncContext));


s->avctx = dst; s->avctx = dst;
s->picture_range_start += MAX_PICTURE_COUNT;
s->picture_range_end += MAX_PICTURE_COUNT;
s->bitstream_buffer = NULL; s->bitstream_buffer = NULL;
s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0; 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; s->avctx->coded_height = s1->avctx->coded_height;


Loading…
Cancel
Save