idct.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 624 行 · 第 1/2 页
C
624 行
S32STD(xr5, blk, 0x50); S32STD(xr3, blk, 0x60); S32STD(xr11, blk, 0x70); } blk = block -8; dest -= stride; for (i=0; i< 8; i++) { S32LDI(xr1, blk, 0x10); S32LDD(xr2, blk, 0x4); S32LDD(xr3, blk, 0x8); S32LDD(xr4, blk, 0xc); S32STD(xr0, blk, 0x0); S32STD(xr0, blk, 0x4); S32STD(xr0, blk, 0x8); S32STD(xr0, blk, 0xc); Q16SAT(xr5, xr2, xr1); Q16SAT(xr6, xr4, xr3); S32SDIV(xr5, dest, stride, 0x0); S32STD(xr6, dest, 0x4); }}#elsestatic void mpeg2_idct_copy_c (int16_t * block, uint8_t * dest, const int stride){ int i; for (i = 0; i < 8; i++) idct_row (block + 8 * i); for (i = 0; i < 8; i++) idct_col (block + i); do { dest[0] = CLIP (block[0]); dest[1] = CLIP (block[1]); dest[2] = CLIP (block[2]); dest[3] = CLIP (block[3]); dest[4] = CLIP (block[4]); dest[5] = CLIP (block[5]); dest[6] = CLIP (block[6]); dest[7] = CLIP (block[7]); ((int32_t *)block)[0] = 0; ((int32_t *)block)[1] = 0; ((int32_t *)block)[2] = 0; ((int32_t *)block)[3] = 0; dest += stride; block += 8; } while (--i);}#endif#ifdef JZ4740_MXU_OPTstatic void mpeg2_idct_add_c (const int last, int16_t * block, uint8_t * dest, const int stride){ int i; int16_t *blk; int32_t wf = (int32_t)whirl_idct; S32LDD(xr5, wf, 0x0); // xr5(w7, w3) S32LDD(xr6, wf, 0x4); // xr6(w9, w8) S32LDD(xr7, wf, 0x8); // xr7(w11,w10) S32LDD(xr8, wf, 0xc); // xr8(w13,w12) S32LDD(xr9, wf, 0x10); // xr9(w6, w0) S32LDD(xr10,wf, 0x14); blk = block - 8; do { /* idct rows */ S32LDI(xr1, blk, 0x10); // xr1 (x4, x0) S32LDD(xr2, blk, 0x4); // xr2 (x7, x3) S32LDD(xr3, blk, 0x8); // xr3 (x6, x1) S32LDD(xr4, blk, 0xc); // xr4 (x5, x2) S32SFL(xr1,xr1,xr2,xr2, ptn3); S32SFL(xr3,xr3,xr4,xr4, ptn3); D16MUL_WW(xr11, xr2, xr5, xr12); D16MAC_AA_WW(xr11,xr4,xr6,xr12); D16MUL_WW(xr13, xr2, xr6, xr14); D16MAC_SS_WW(xr13,xr4,xr5,xr14); D16MUL_HW(xr2, xr1, xr7, xr4); D16MAC_AS_LW(xr2,xr1,xr9,xr4); D16MAC_AS_HW(xr2,xr3,xr10,xr4); D16MAC_AS_LW(xr2,xr3,xr8,xr4); D16MACF_AA_WW(xr2, xr0, xr0, xr4); D16MACF_AA_WW(xr11, xr0, xr0, xr13); D16MACF_AA_WW(xr12, xr0, xr0, xr14); D16MUL_HW(xr4, xr1, xr8, xr15); D16MAC_SS_LW(xr4,xr1,xr10,xr15); D16MAC_AA_HW(xr4,xr3,xr9,xr15); D16MAC_SA_LW(xr4,xr3,xr7,xr15); Q16ADD_AS_WW(xr11,xr11,xr12,xr12); D16MACF_AA_WW(xr15, xr0, xr0, xr4); Q16ADD_AS_WW(xr11, xr11, xr2, xr2); Q16ADD_AS_XW(xr12, xr12, xr15, xr15); S32SFL(xr11,xr11,xr12,xr12, ptn3); S32SFL(xr12,xr12,xr11,xr11, ptn3); S32STD(xr12, blk, 0x0); S32STD(xr11, blk, 0x4); S32STD(xr15, blk, 0x8); S32STD(xr2, blk, 0xc); } while (idct_row_max--); blk = block - 2; for (i = 0; i < 4; i++) /* idct columns */ { S32LDI(xr1, blk, 0x4); S32LDD(xr3, blk, 0x20); S32I2M(xr5,wxr5); S32LDD(xr11, blk, 0x40); S32LDD(xr13, blk, 0x60); D16MUL_HW(xr15, xr5, xr1, xr9); D16MAC_AA_HW(xr15,xr5,xr11,xr9); D16MACF_AA_WW(xr15, xr0, xr0, xr9); D16MUL_LW(xr10, xr5, xr3, xr9); D16MAC_AA_LW(xr10,xr6,xr13,xr9); D16MACF_AA_WW(xr10, xr0, xr0, xr9); S32LDD(xr2, blk, 0x10); S32LDD(xr4, blk, 0x30); Q16ADD_AS_WW(xr15,xr15,xr10,xr9); D16MUL_HW(xr10, xr5, xr1, xr1); D16MAC_SS_HW(xr10,xr5,xr11,xr1); D16MACF_AA_WW(xr10, xr0, xr0, xr1); D16MUL_LW(xr11, xr6, xr3, xr1); D16MAC_SS_LW(xr11,xr5,xr13,xr1); D16MACF_AA_WW(xr11, xr0, xr0, xr1); S32LDD(xr12, blk, 0x50); S32LDD(xr14, blk, 0x70); Q16ADD_AS_WW(xr10,xr10,xr11,xr1); D16MUL_HW(xr11, xr7, xr2, xr13); D16MAC_AA_LW(xr11,xr7,xr4,xr13); D16MAC_AA_LW(xr11,xr8,xr12,xr13); D16MAC_AA_HW(xr11,xr8,xr14,xr13); D16MACF_AA_WW(xr11, xr0, xr0, xr13); D16MUL_LW(xr3, xr7, xr2, xr13); D16MAC_SS_HW(xr3,xr8,xr4,xr13); D16MAC_SS_HW(xr3,xr7,xr12,xr13); D16MAC_SS_LW(xr3,xr8,xr14,xr13); D16MACF_AA_WW(xr3, xr0, xr0, xr13); D16MUL_LW(xr5, xr8, xr2, xr13); D16MAC_SS_HW(xr5,xr7,xr4,xr13); D16MAC_AA_HW(xr5,xr8,xr12,xr13); D16MAC_AA_LW(xr5,xr7,xr14,xr13); D16MACF_AA_WW(xr5, xr0, xr0, xr13); D16MUL_HW(xr2, xr8, xr2, xr13); D16MAC_SS_LW(xr2,xr8,xr4,xr13); D16MAC_AA_LW(xr2,xr7,xr12,xr13); D16MAC_SS_HW(xr2,xr7,xr14,xr13); D16MACF_AA_WW(xr2, xr0, xr0, xr13); Q16ADD_AS_WW(xr15,xr15,xr11,xr11); Q16ADD_AS_WW(xr10,xr10,xr3,xr3); Q16ADD_AS_WW(xr1,xr1,xr5,xr5); Q16ADD_AS_WW(xr9,xr9,xr2,xr2); S32STD(xr15, blk, 0x00); S32STD(xr10, blk, 0x10); S32STD(xr1, blk, 0x20); S32STD(xr9, blk, 0x30); S32STD(xr2, blk, 0x40); S32STD(xr5, blk, 0x50); S32STD(xr3, blk, 0x60); S32STD(xr11, blk, 0x70); } blk = block - 8; dest -= stride; for (i=0; i< 8; i++) { S32LDIV(xr5, dest, stride, 0x0); S32LDI(xr1, blk, 0x10); S32LDD(xr2, blk, 0x4); Q8ACCE_AA(xr2, xr5, xr0, xr1); S32LDD(xr6, dest, 0x4); S32LDD(xr3, blk, 0x8); S32LDD(xr4, blk, 0xc); Q8ACCE_AA(xr4, xr6, xr0, xr3); S32STD(xr0, blk, 0x0); S32STD(xr0, blk, 0x4); S32STD(xr0, blk, 0x8); S32STD(xr0, blk, 0xc); Q16SAT(xr5, xr2, xr1); S32STD(xr5, dest, 0x0); Q16SAT(xr6, xr4, xr3); S32STD(xr6, dest, 0x4); }}#elsestatic void mpeg2_idct_add_c (const int last, int16_t * block, uint8_t * dest, const int stride){ int i; if (last != 129 || (block[0] & (7 << 4)) == (4 << 4)) { for (i = 0; i < 8; i++) idct_row (block + 8 * i); for (i = 0; i < 8; i++) idct_col (block + i); do { dest[0] = CLIP (block[0] + dest[0]); dest[1] = CLIP (block[1] + dest[1]); dest[2] = CLIP (block[2] + dest[2]); dest[3] = CLIP (block[3] + dest[3]); dest[4] = CLIP (block[4] + dest[4]); dest[5] = CLIP (block[5] + dest[5]); dest[6] = CLIP (block[6] + dest[6]); dest[7] = CLIP (block[7] + dest[7]); ((int32_t *)block)[0] = 0; ((int32_t *)block)[1] = 0; ((int32_t *)block)[2] = 0; ((int32_t *)block)[3] = 0; dest += stride; block += 8; } while (--i); } else { int DC; DC = (block[0] + 64) >> 7; block[0] = block[63] = 0; i = 8; do { dest[0] = CLIP (DC + dest[0]); dest[1] = CLIP (DC + dest[1]); dest[2] = CLIP (DC + dest[2]); dest[3] = CLIP (DC + dest[3]); dest[4] = CLIP (DC + dest[4]); dest[5] = CLIP (DC + dest[5]); dest[6] = CLIP (DC + dest[6]); dest[7] = CLIP (DC + dest[7]); dest += stride; } while (--i); }}#endifvoid mpeg2_idct_init (uint32_t accel){ #ifdef HAVE_MMX2 if (accel & MPEG2_ACCEL_X86_MMXEXT) { mpeg2_idct_copy = mpeg2_idct_copy_mmxext; mpeg2_idct_add = mpeg2_idct_add_mmxext; mpeg2_idct_mmx_init (); } else#endif#ifdef HAVE_MMX if (accel & MPEG2_ACCEL_X86_MMX) { mpeg2_idct_copy = mpeg2_idct_copy_mmx; mpeg2_idct_add = mpeg2_idct_add_mmx; mpeg2_idct_mmx_init (); } else#endif#if defined(ARCH_PPC) && defined(HAVE_ALTIVEC) if (accel & MPEG2_ACCEL_PPC_ALTIVEC) { mpeg2_idct_copy = mpeg2_idct_copy_altivec; mpeg2_idct_add = mpeg2_idct_add_altivec; mpeg2_idct_altivec_init (); } else#endif#ifdef ARCH_ALPHA#ifdef CAN_COMPILE_ALPHA_MVI if (accel & MPEG2_ACCEL_ALPHA_MVI) { mpeg2_idct_copy = mpeg2_idct_copy_mvi; mpeg2_idct_add = mpeg2_idct_add_mvi; mpeg2_idct_alpha_init (); } else#endif if (accel & MPEG2_ACCEL_ALPHA) { int i; mpeg2_idct_copy = mpeg2_idct_copy_alpha; mpeg2_idct_add = mpeg2_idct_add_alpha; mpeg2_idct_alpha_init (); for (i = -3840; i < 3840 + 256; i++) CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i); } else#endif { extern uint8_t mpeg2_scan_norm[64]; extern uint8_t mpeg2_scan_alt[64]; int i, j; mpeg2_idct_copy = mpeg2_idct_copy_c; mpeg2_idct_add = mpeg2_idct_add_c; static int dInit = 0; if(dInit != 0) return ; dInit = 1;#ifdef JZ4740_MXU_OPT#else for (i = -3840; i < 3840 + 256; i++) CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i); for (i = 0; i < 64; i++) { j = mpeg2_scan_norm[i]; mpeg2_scan_norm[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); j = mpeg2_scan_alt[i]; mpeg2_scan_alt[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); }#endif }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?