X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Feamad.c;h=d7e65db927a590cde54f03a7d45c310ebfa374d3;hb=98d0d19208959766a58f13dd6a678d1f765a26ac;hp=1daef7e673c35a09c648a54360436bed3f04a39c;hpb=00c3b67b8ac6bfdc5a01535173dc537824a53d6e;p=ffmpeg diff --git a/libavcodec/eamad.c b/libavcodec/eamad.c index 1daef7e673c..d7e65db927a 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" @@ -42,31 +43,28 @@ #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) -{ - int i; - for (i=0; ipriv_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_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; } @@ -83,13 +81,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 +97,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( + 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 (!(s->avctx->flags & CODEC_FLAG_GRAY)) { + } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) { int index = j - 3; - s->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); } } -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 +179,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,29 +199,22 @@ 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; - for (i=1; i<64; i++) - s->intra_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]; - for (i=1; i<64; i++) - s->intra_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, @@ -237,8 +224,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 +242,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)); + s->dsp.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; }