From e63b818dbe6060b606ae10eb184859f8b97d2353 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Fri, 7 Feb 2014 11:04:24 +0100 Subject: [PATCH] dv: Properly split decoder and encoder initialization --- libavcodec/dv.c | 18 ------------------ libavcodec/dvdec.c | 21 ++++++++++++++++++++- libavcodec/dvenc.c | 11 +++++++++++ 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/libavcodec/dv.c b/libavcodec/dv.c index e840f4858e..bb1a26970f 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -235,7 +235,6 @@ int ff_dv_init_dynamic_tables(DVVideoContext *ctx, const DVprofile *d) av_cold int ff_dvvideo_init(AVCodecContext *avctx) { DVVideoContext *s = avctx->priv_data; - DSPContext dsp; static int done = 0; int i, j; @@ -292,23 +291,6 @@ av_cold int ff_dvvideo_init(AVCodecContext *avctx) ff_free_vlc(&dv_vlc); } - /* Generic DSP setup */ - ff_dsputil_init(&dsp, avctx); - ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp); - s->get_pixels = dsp.get_pixels; - s->ildct_cmp = dsp.ildct_cmp[5]; - - /* 88DCT setup */ - s->fdct[0] = dsp.fdct; - s->idct_put[0] = dsp.idct_put; - for (i = 0; i < 64; i++) - s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]]; - - /* 248DCT setup */ - s->fdct[1] = dsp.fdct248; - s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP - memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1])); - s->avctx = avctx; avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c index 89f5821b00..9a559dbd45 100644 --- a/libavcodec/dvdec.c +++ b/libavcodec/dvdec.c @@ -58,6 +58,25 @@ typedef struct BlockInfo { static const int dv_iweight_bits = 14; +static av_cold int dvvideo_decode_init(AVCodecContext *avctx) +{ + DVVideoContext *s = avctx->priv_data; + DSPContext dsp; + int i; + + ff_dsputil_init(&dsp, avctx); + + for (i = 0; i < 64; i++) + s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]]; + + memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1])); + + s->idct_put[0] = dsp.idct_put; + s->idct_put[1] = ff_simple_idct248_put; + + return ff_dvvideo_init(avctx); +} + /* decode AC coefficients */ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block) { @@ -381,7 +400,7 @@ AVCodec ff_dvvideo_decoder = { .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_DVVIDEO, .priv_data_size = sizeof(DVVideoContext), - .init = ff_dvvideo_init, + .init = dvvideo_decode_init, .decode = dvvideo_decode_frame, .capabilities = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS, }; diff --git a/libavcodec/dvenc.c b/libavcodec/dvenc.c index 94fb7eaf6f..5b013adf51 100644 --- a/libavcodec/dvenc.c +++ b/libavcodec/dvenc.c @@ -28,6 +28,7 @@ #include "libavutil/pixdesc.h" #include "config.h" #include "avcodec.h" +#include "dsputil.h" #include "internal.h" #include "put_bits.h" #include "dv.h" @@ -36,6 +37,7 @@ static av_cold int dvvideo_encode_init(AVCodecContext *avctx) { DVVideoContext *s = avctx->priv_data; + DSPContext dsp; int ret; s->sys = avpriv_dv_codec_profile(avctx); @@ -58,6 +60,15 @@ static av_cold int dvvideo_encode_init(AVCodecContext *avctx) dv_vlc_map_tableinit(); + ff_dsputil_init(&dsp, avctx); + ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp); + + s->get_pixels = dsp.get_pixels; + s->ildct_cmp = dsp.ildct_cmp[5]; + + s->fdct[0] = dsp.fdct; + s->fdct[1] = dsp.fdct248; + return ff_dvvideo_init(avctx); }