aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-01-29 22:37:37 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-01-31 21:43:04 +0100
commit05ebe51e00e900bcef7d3e9bcd6b91d4aab34de7 (patch)
tree298f50517b2fec6d7570a27e05487b95c8e4a9e5 /libavcodec/h264.c
parente4a714f65a0c9e03d6e5dd57a3d4a0451e193f55 (diff)
downloadffmpeg-05ebe51e00e900bcef7d3e9bcd6b91d4aab34de7.tar.gz
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>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c13
1 files changed, 8 insertions, 5 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<<h->pixel_shift));
}