diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c index 3acca16f3c..ae8e223349 100644 --- a/libavcodec/vp6.c +++ b/libavcodec/vp6.c @@ -637,36 +637,15 @@ static void vp6_filter(VP56Context *s, uint8_t *dst, uint8_t *src, } } -static av_cold void vp6_decode_init_context(VP56Context *s); - -static av_cold int vp6_decode_init(AVCodecContext *avctx) +static av_cold int vp6_decode_init_context(AVCodecContext *avctx, + VP56Context *s, int flip, int has_alpha) { - VP56Context *s = avctx->priv_data; - int ret; - - if ((ret = ff_vp56_init(avctx, avctx->codec->id == AV_CODEC_ID_VP6, - avctx->codec->id == AV_CODEC_ID_VP6A)) < 0) + int ret = ff_vp56_init_context(avctx, s, flip, has_alpha); + if (ret < 0) return ret; + ff_vp6dsp_init(&s->vp56dsp); - vp6_decode_init_context(s); - - if (s->has_alpha) { - /* Can only happen for ff_vp6a_decoder */ - s->alpha_context = &s[1]; - ret = ff_vp56_init_context(avctx, s->alpha_context, - s->flip == -1, s->has_alpha); - if (ret < 0) - return ret; - ff_vp6dsp_init(&s->alpha_context->vp56dsp); - vp6_decode_init_context(s->alpha_context); - } - - return 0; -} - -static av_cold void vp6_decode_init_context(VP56Context *s) -{ s->deblock_filtering = 0; s->vp56_coord_div = vp6_coord_div; s->parse_vector_adjustment = vp6_parse_vector_adjustment; @@ -675,6 +654,30 @@ static av_cold void vp6_decode_init_context(VP56Context *s) s->parse_vector_models = vp6_parse_vector_models; s->parse_coeff_models = vp6_parse_coeff_models; s->parse_header = vp6_parse_header; + + return 0; +} + +static av_cold int vp6_decode_init(AVCodecContext *avctx) +{ + VP56Context *s = avctx->priv_data; + int ret; + + ret = vp6_decode_init_context(avctx, s, avctx->codec_id == AV_CODEC_ID_VP6, + avctx->codec_id == AV_CODEC_ID_VP6A); + if (ret < 0) + return ret; + + if (s->has_alpha) { + /* Can only happen for ff_vp6a_decoder */ + s->alpha_context = &s[1]; + ret = vp6_decode_init_context(avctx, s->alpha_context, + s->flip == -1, s->has_alpha); + if (ret < 0) + return ret; + } + + return 0; } static av_cold void vp6_decode_free_context(VP56Context *s); @@ -683,11 +686,9 @@ static av_cold int vp6_decode_free(AVCodecContext *avctx) { VP56Context *s = avctx->priv_data; - ff_vp56_free(avctx); vp6_decode_free_context(s); if (s->alpha_context) { - ff_vp56_free_context(s->alpha_context); vp6_decode_free_context(s->alpha_context); s->alpha_context = NULL; } @@ -699,6 +700,8 @@ static av_cold void vp6_decode_free_context(VP56Context *s) { int pt, ct, cg; + ff_vp56_free_context(s); + for (pt=0; pt<2; pt++) { ff_free_vlc(&s->dccv_vlc[pt]); ff_free_vlc(&s->runv_vlc[pt]);