From 591766a3a9c88614b9cb0ed90e25dc6e7d883752 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Fri, 27 Jul 2012 17:00:38 +0100 Subject: eamad: remove use of MpegEncContext There is no sense in pulling in this monster struct just for a handful of fields. The code does not call any functions expecting an MpegEncContext. Signed-off-by: Mans Rullgard --- libavcodec/eamad.c | 92 +++++++++++++++++++++++++++--------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) (limited to 'libavcodec/eamad.c') diff --git a/libavcodec/eamad.c b/libavcodec/eamad.c index 1daef7e673..b738f9458c 100644 --- a/libavcodec/eamad.c +++ b/libavcodec/eamad.c @@ -42,12 +42,18 @@ #define MADe_TAG MKTAG('M', 'A', 'D', 'e') /* MAD lqp-frame */ typedef struct MadContext { - MpegEncContext s; + AVCodecContext *avctx; + DSPContext dsp; AVFrame frame; AVFrame last_frame; + GetBitContext gb; void *bitstream_buf; unsigned int bitstream_buf_size; DECLARE_ALIGNED(16, DCTELEM, block)[64]; + ScanTable scantable; + uint16_t quant_matrix[64]; + int mb_x; + int mb_y; } MadContext; static void bswap16_buf(uint16_t *dst, const uint16_t *src, int count) @@ -59,14 +65,13 @@ static void bswap16_buf(uint16_t *dst, const uint16_t *src, int count) static av_cold int decode_init(AVCodecContext *avctx) { - MadContext *t = avctx->priv_data; - MpegEncContext *s = &t->s; + MadContext *s = avctx->priv_data; s->avctx = avctx; avctx->pix_fmt = PIX_FMT_YUV420P; if (avctx->idct_algo == FF_IDCT_AUTO) avctx->idct_algo = FF_IDCT_EA; ff_dsputil_init(&s->dsp, avctx); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct); + ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct); ff_mpeg12_init_vlcs(); return 0; } @@ -83,13 +88,12 @@ static inline void comp(unsigned char *dst, int dst_stride, static inline void comp_block(MadContext *t, int mb_x, int mb_y, int j, int mv_x, int mv_y, int add) { - MpegEncContext *s = &t->s; if (j < 4) { comp(t->frame.data[0] + (mb_y*16 + ((j&2)<<2))*t->frame.linesize[0] + mb_x*16 + ((j&1)<<3), t->frame.linesize[0], t->last_frame.data[0] + (mb_y*16 + ((j&2)<<2) + mv_y)*t->last_frame.linesize[0] + mb_x*16 + ((j&1)<<3) + mv_x, t->last_frame.linesize[0], add); - } else if (!(s->avctx->flags & CODEC_FLAG_GRAY)) { + } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) { int index = j - 3; comp(t->frame.data[index] + (mb_y*8)*t->frame.linesize[index] + mb_x * 8, t->frame.linesize[index], @@ -100,26 +104,24 @@ static inline void comp_block(MadContext *t, int mb_x, int mb_y, static inline void idct_put(MadContext *t, DCTELEM *block, int mb_x, int mb_y, int j) { - MpegEncContext *s = &t->s; if (j < 4) { - s->dsp.idct_put( + t->dsp.idct_put( t->frame.data[0] + (mb_y*16 + ((j&2)<<2))*t->frame.linesize[0] + mb_x*16 + ((j&1)<<3), t->frame.linesize[0], block); - } else if (!(s->avctx->flags & CODEC_FLAG_GRAY)) { + } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) { int index = j - 3; - s->dsp.idct_put( + t->dsp.idct_put( t->frame.data[index] + (mb_y*8)*t->frame.linesize[index] + mb_x*8, t->frame.linesize[index], block); } } -static inline void decode_block_intra(MadContext * t, DCTELEM * block) +static inline void decode_block_intra(MadContext *s, DCTELEM * block) { - MpegEncContext *s = &t->s; int level, i, j, run; RLTable *rl = &ff_rl_mpeg1; - const uint8_t *scantable = s->intra_scantable.permutated; - int16_t *quant_matrix = s->intra_matrix; + const uint8_t *scantable = s->scantable.permutated; + int16_t *quant_matrix = s->quant_matrix; block[0] = (128 + get_sbits(&s->gb, 8)) * quant_matrix[0]; @@ -184,9 +186,8 @@ static int decode_motion(GetBitContext *gb) return value; } -static void decode_mb(MadContext *t, int inter) +static void decode_mb(MadContext *s, int inter) { - MpegEncContext *s = &t->s; int mv_map = 0; int mv_x, mv_y; int j; @@ -205,28 +206,27 @@ static void decode_mb(MadContext *t, int inter) for (j=0; j<6; j++) { if (mv_map & (1<gb); - comp_block(t, s->mb_x, s->mb_y, j, mv_x, mv_y, add); + comp_block(s, s->mb_x, s->mb_y, j, mv_x, mv_y, add); } else { - s->dsp.clear_block(t->block); - decode_block_intra(t, t->block); - idct_put(t, t->block, s->mb_x, s->mb_y, j); + s->dsp.clear_block(s->block); + decode_block_intra(s, s->block); + idct_put(s, s->block, s->mb_x, s->mb_y, j); } } } -static void calc_intra_matrix(MadContext *t, int qscale) +static void calc_quant_matrix(MadContext *s, int qscale) { - MpegEncContext *s = &t->s; int i; if (s->avctx->idct_algo == FF_IDCT_EA) { - s->intra_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0]) >> 11; + s->quant_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0]) >> 11; for (i=1; i<64; i++) - s->intra_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32) >> 10; + s->quant_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32) >> 10; } else { - s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0]; + s->quant_matrix[0] = ff_mpeg1_default_intra_matrix[0]; for (i=1; i<64; i++) - s->intra_matrix[i] = (ff_mpeg1_default_intra_matrix[i]*qscale) << 1; + s->quant_matrix[i] = (ff_mpeg1_default_intra_matrix[i]*qscale) << 1; } } @@ -237,8 +237,8 @@ static int decode_frame(AVCodecContext *avctx, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; const uint8_t *buf_end = buf+buf_size; - MadContext *t = avctx->priv_data; - MpegEncContext *s = &t->s; + MadContext *s = avctx->priv_data; + int width, height; int chunk_type; int inter; @@ -255,42 +255,42 @@ static int decode_frame(AVCodecContext *avctx, av_reduce(&avctx->time_base.num, &avctx->time_base.den, AV_RL16(&buf[6]), 1000, 1<<30); - s->width = AV_RL16(&buf[8]); - s->height = AV_RL16(&buf[10]); - calc_intra_matrix(t, buf[13]); + width = AV_RL16(&buf[8]); + height = AV_RL16(&buf[10]); + calc_quant_matrix(s, buf[13]); buf += 16; - if (avctx->width != s->width || avctx->height != s->height) { - if (av_image_check_size(s->width, s->height, 0, avctx) < 0) + if (avctx->width != width || avctx->height != height) { + if (av_image_check_size(width, height, 0, avctx) < 0) return -1; - avcodec_set_dimensions(avctx, s->width, s->height); - if (t->frame.data[0]) - avctx->release_buffer(avctx, &t->frame); + avcodec_set_dimensions(avctx, width, height); + if (s->frame.data[0]) + avctx->release_buffer(avctx, &s->frame); } - t->frame.reference = 1; - if (!t->frame.data[0]) { - if (avctx->get_buffer(avctx, &t->frame) < 0) { + s->frame.reference = 1; + if (!s->frame.data[0]) { + if (avctx->get_buffer(avctx, &s->frame) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } } - av_fast_malloc(&t->bitstream_buf, &t->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE); - if (!t->bitstream_buf) + av_fast_malloc(&s->bitstream_buf, &s->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE); + if (!s->bitstream_buf) return AVERROR(ENOMEM); - bswap16_buf(t->bitstream_buf, (const uint16_t*)buf, (buf_end-buf)/2); - init_get_bits(&s->gb, t->bitstream_buf, 8*(buf_end-buf)); + bswap16_buf(s->bitstream_buf, (const uint16_t*)buf, (buf_end-buf)/2); + init_get_bits(&s->gb, s->bitstream_buf, 8*(buf_end-buf)); for (s->mb_y=0; s->mb_y < (avctx->height+15)/16; s->mb_y++) for (s->mb_x=0; s->mb_x < (avctx->width +15)/16; s->mb_x++) - decode_mb(t, inter); + decode_mb(s, inter); *data_size = sizeof(AVFrame); - *(AVFrame*)data = t->frame; + *(AVFrame*)data = s->frame; if (chunk_type != MADe_TAG) - FFSWAP(AVFrame, t->frame, t->last_frame); + FFSWAP(AVFrame, s->frame, s->last_frame); return buf_size; } -- cgit v1.2.3 From f3eb00834362273dcb1fd3320faa5f8f5a00fb22 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 29 Jul 2012 13:09:10 +0100 Subject: eamad/eatgq/eatqi: call special EA IDCT directly These decoders use a special non-MPEG2 IDCT. Call it directly instead of going through dsputil. There is never any reason to use a regular IDCT with these decoders or to use the EA IDCT with other codecs. This also fixes the bizarre situation of eamad and eatqi decoding incorrectly if eatgq is disabled. Signed-off-by: Mans Rullgard --- libavcodec/eamad.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'libavcodec/eamad.c') diff --git a/libavcodec/eamad.c b/libavcodec/eamad.c index b738f9458c..ca7439397f 100644 --- a/libavcodec/eamad.c +++ b/libavcodec/eamad.c @@ -32,6 +32,7 @@ #include "get_bits.h" #include "dsputil.h" #include "aandcttab.h" +#include "eaidct.h" #include "mpeg12.h" #include "mpeg12data.h" #include "libavutil/imgutils.h" @@ -68,9 +69,8 @@ static av_cold int decode_init(AVCodecContext *avctx) MadContext *s = avctx->priv_data; s->avctx = avctx; avctx->pix_fmt = PIX_FMT_YUV420P; - if (avctx->idct_algo == FF_IDCT_AUTO) - avctx->idct_algo = FF_IDCT_EA; ff_dsputil_init(&s->dsp, avctx); + ff_init_scantable_permutation(s->dsp.idct_permutation, FF_NO_IDCT_PERM); ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct); ff_mpeg12_init_vlcs(); return 0; @@ -105,12 +105,12 @@ static inline void comp_block(MadContext *t, int mb_x, int mb_y, static inline void idct_put(MadContext *t, DCTELEM *block, int mb_x, int mb_y, int j) { if (j < 4) { - t->dsp.idct_put( + ff_ea_idct_put_c( t->frame.data[0] + (mb_y*16 + ((j&2)<<2))*t->frame.linesize[0] + mb_x*16 + ((j&1)<<3), t->frame.linesize[0], block); } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) { int index = j - 3; - t->dsp.idct_put( + ff_ea_idct_put_c( t->frame.data[index] + (mb_y*8)*t->frame.linesize[index] + mb_x*8, t->frame.linesize[index], block); } @@ -219,15 +219,9 @@ static void calc_quant_matrix(MadContext *s, int qscale) { int i; - if (s->avctx->idct_algo == FF_IDCT_EA) { - s->quant_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0]) >> 11; - for (i=1; i<64; i++) - s->quant_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32) >> 10; - } else { - s->quant_matrix[0] = ff_mpeg1_default_intra_matrix[0]; - for (i=1; i<64; i++) - s->quant_matrix[i] = (ff_mpeg1_default_intra_matrix[i]*qscale) << 1; - } + s->quant_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0]) >> 11; + for (i=1; i<64; i++) + s->quant_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32) >> 10; } static int decode_frame(AVCodecContext *avctx, -- cgit v1.2.3