Mercurial > libavcodec.hg
changeset 34:2733a4c1c693 libavcodec
added block permutation functions
author | glantau |
---|---|
date | Tue, 07 Aug 2001 22:43:19 +0000 |
parents | 7cf705a32d1c |
children | c77207dc78f4 |
files | dsputil.c dsputil.h |
diffstat | 2 files changed, 85 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/dsputil.c Tue Aug 07 22:42:45 2001 +0000 +++ b/dsputil.c Tue Aug 07 22:43:19 2001 +0000 @@ -34,6 +34,42 @@ static UINT8 cropTbl[256 + 2 * MAX_NEG_CROP]; UINT32 squareTbl[512]; +extern UINT16 default_intra_matrix[64]; +extern UINT16 default_non_intra_matrix[64]; + +UINT8 zigzag_direct[64] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63 +}; + +UINT8 ff_alternate_horizontal_scan[64] = { + 0, 1, 2, 3, 8, 9, 16, 17, + 10, 11, 4, 5, 6, 7, 15, 14, + 13, 12, 19, 18, 24, 25, 32, 33, + 26, 27, 20, 21, 22, 23, 28, 29, + 30, 31, 34, 35, 40, 41, 48, 49, + 42, 43, 36, 37, 38, 39, 44, 45, + 46, 47, 50, 51, 56, 57, 58, 59, + 52, 53, 54, 55, 60, 61, 62, 63, +}; + +UINT8 ff_alternate_vertical_scan[64] = { + 0, 8, 16, 24, 1, 9, 2, 10, + 17, 25, 32, 40, 48, 56, 57, 49, + 41, 33, 26, 18, 3, 11, 4, 12, + 19, 27, 34, 42, 50, 58, 35, 43, + 51, 59, 20, 28, 5, 13, 6, 14, + 21, 29, 36, 44, 52, 60, 37, 45, + 53, 61, 22, 30, 7, 15, 23, 31, + 38, 46, 54, 62, 39, 47, 55, 63, +}; + void get_pixels_c(DCTELEM *block, const UINT8 *pixels, int line_size) { DCTELEM *p; @@ -350,9 +386,33 @@ return s; } +/* permute block according so that it corresponds to the MMX idct + order */ +void block_permute(INT16 *block) +{ + int tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + int i; + + for(i=0;i<8;i++) { + tmp1 = block[1]; + tmp2 = block[2]; + tmp3 = block[3]; + tmp4 = block[4]; + tmp5 = block[5]; + tmp6 = block[6]; + block[1] = tmp2; + block[2] = tmp4; + block[3] = tmp6; + block[4] = tmp1; + block[5] = tmp3; + block[6] = tmp5; + block += 8; + } +} + void dsputil_init(void) { - int i; + int i, j; for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i; for(i=0;i<MAX_NEG_CROP;i++) { @@ -375,6 +435,18 @@ pix_abs16x16_xy2 = pix_abs16x16_xy2_c; av_fdct = jpeg_fdct_ifast; + /* permute for IDCT */ + for(i=0;i<64;i++) { + j = zigzag_direct[i]; + zigzag_direct[i] = block_permute_op(j); + j = ff_alternate_horizontal_scan[i]; + ff_alternate_horizontal_scan[i] = block_permute_op(j); + j = ff_alternate_vertical_scan[i]; + ff_alternate_vertical_scan[i] = block_permute_op(j); + } + block_permute(default_intra_matrix); + block_permute(default_non_intra_matrix); + #ifdef HAVE_MMX dsputil_init_mmx(); #endif
--- a/dsputil.h Tue Aug 07 22:42:45 2001 +0000 +++ b/dsputil.h Tue Aug 07 22:43:19 2001 +0000 @@ -15,6 +15,11 @@ void (*av_fdct)(DCTELEM *block); +/* encoding scans */ +extern UINT8 ff_alternate_horizontal_scan[64]; +extern UINT8 ff_alternate_vertical_scan[64]; +extern UINT8 zigzag_direct[64]; + /* pixel operations */ #define MAX_NEG_CROP 384 @@ -62,6 +67,13 @@ int pix_abs16x16_y2_c(UINT8 *blk1, UINT8 *blk2, int lx, int h); int pix_abs16x16_xy2_c(UINT8 *blk1, UINT8 *blk2, int lx, int h); +static inline int block_permute_op(int j) +{ + return (j & 0x38) | ((j & 6) >> 1) | ((j & 1) << 2); +} + +void block_permute(INT16 *block); + #ifdef HAVE_MMX #define MM_MMX 0x0001 /* standard MMX */