diff options
author | Måns Rullgård <mans@mansr.com> | 2009-01-17 21:44:58 +0000 |
---|---|---|
committer | Måns Rullgård <mans@mansr.com> | 2009-01-17 21:44:58 +0000 |
commit | 9dbd3ed6c37d6df1a8846c558c504aa4578d92ae (patch) | |
tree | 9b78859361524a2f866cb8876c2fcf93d3a0986a /libavcodec/alpha/mpegvideo_alpha.c | |
parent | 16172207990ce98a0d397d94463825011a61809c (diff) | |
download | ffmpeg-9dbd3ed6c37d6df1a8846c558c504aa4578d92ae.tar.gz |
Alpha: factor common parts from dct_unquantize_h263_intra/inter_axp
Originally committed as revision 16661 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/alpha/mpegvideo_alpha.c')
-rw-r--r-- | libavcodec/alpha/mpegvideo_alpha.c | 101 |
1 files changed, 31 insertions, 70 deletions
diff --git a/libavcodec/alpha/mpegvideo_alpha.c b/libavcodec/alpha/mpegvideo_alpha.c index 4dd37690fd..de32545ade 100644 --- a/libavcodec/alpha/mpegvideo_alpha.c +++ b/libavcodec/alpha/mpegvideo_alpha.c @@ -23,33 +23,14 @@ #include "libavcodec/mpegvideo.h" #include "asm.h" -static void dct_unquantize_h263_intra_axp(MpegEncContext *s, DCTELEM *block, - int n, int qscale) +static void dct_unquantize_h263_axp(DCTELEM *block, int n_coeffs, + uint64_t qscale, uint64_t qadd) { - int i, n_coeffs; - uint64_t qmul, qadd; - uint64_t correction; - DCTELEM *orig_block = block; - DCTELEM block0 = block[0]; + uint64_t qmul = qscale << 1; + uint64_t correction = WORD_VEC(qmul * 255 >> 8); + int i; - qmul = qscale << 1; - /* This mask kills spill from negative subwords to the next subword. */ - correction = WORD_VEC(qmul * 255 >> 8); - - if (!s->h263_aic) { - if (n < 4) - block0 *= s->y_dc_scale; - else - block0 *= s->c_dc_scale; - qadd = WORD_VEC((qscale - 1) | 1); - } else { - qadd = 0; - } - - if(s->ac_pred) - n_coeffs = 63; - else - n_coeffs = s->inter_scantable.raster_end[s->block_last_index[n]]; + qadd = WORD_VEC(qadd); for(i = 0; i <= n_coeffs; block += 4, i += 4) { uint64_t levels, negmask, zeros, add, sub; @@ -86,60 +67,40 @@ static void dct_unquantize_h263_intra_axp(MpegEncContext *s, DCTELEM *block, stq(levels, block); } - - orig_block[0] = block0; } -static void dct_unquantize_h263_inter_axp(MpegEncContext *s, DCTELEM *block, +static void dct_unquantize_h263_intra_axp(MpegEncContext *s, DCTELEM *block, int n, int qscale) { - int i, n_coeffs; - uint64_t qmul, qadd; - uint64_t correction; - - qadd = WORD_VEC((qscale - 1) | 1); - qmul = qscale << 1; - /* This mask kills spill from negative subwords to the next subword. */ - correction = WORD_VEC((qmul - 1) + 1); /* multiplication / addition */ - - n_coeffs = s->inter_scantable.raster_end[s->block_last_index[n]]; - - for(i = 0; i <= n_coeffs; block += 4, i += 4) { - uint64_t levels, negmask, zeros, add; - - levels = ldq(block); - if (levels == 0) - continue; - -#ifdef __alpha_max__ - /* I don't think the speed difference justifies runtime - detection. */ - negmask = maxsw4(levels, -1); /* negative -> ffff (-1) */ - negmask = minsw4(negmask, 0); /* positive -> 0000 (0) */ -#else - negmask = cmpbge(WORD_VEC(0x7fff), levels); - negmask &= (negmask >> 1) | (1 << 7); - negmask = zap(-1, negmask); -#endif + int n_coeffs; + uint64_t qadd; + DCTELEM block0 = block[0]; - zeros = cmpbge(0, levels); - zeros &= zeros >> 1; - /* zeros |= zeros << 1 is not needed since qadd <= 255, so - zapping the lower byte suffices. */ + if (!s->h263_aic) { + if (n < 4) + block0 *= s->y_dc_scale; + else + block0 *= s->c_dc_scale; + qadd = (qscale - 1) | 1; + } else { + qadd = 0; + } - levels *= qmul; - levels -= correction & (negmask << 16); + if(s->ac_pred) + n_coeffs = 63; + else + n_coeffs = s->inter_scantable.raster_end[s->block_last_index[n]]; - /* Negate qadd for negative levels. */ - add = qadd ^ negmask; - add += WORD_VEC(0x0001) & negmask; - /* Set qadd to 0 for levels == 0. */ - add = zap(add, zeros); + dct_unquantize_h263_axp(block, n_coeffs, qscale, qadd); - levels += add; + block[0] = block0; +} - stq(levels, block); - } +static void dct_unquantize_h263_inter_axp(MpegEncContext *s, DCTELEM *block, + int n, int qscale) +{ + int n_coeffs = s->inter_scantable.raster_end[s->block_last_index[n]]; + dct_unquantize_h263_axp(block, n_coeffs, qscale, (qscale - 1) | 1); } void MPV_common_init_axp(MpegEncContext *s) |