⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dctfix.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的各种滤波器源码
💻 C
字号:
#if	!defined(HOSTED)
#include "ops/custom_defs.h"
#else
#define	restrict
#endif


#include "coeffs.h"

#define	HROUND(x)	(((x) + (x)) + 0x8000)
#define	VROUND(x)	((x) + 0x8000)

#if	defined(__LITTLE_ENDIAN__)
#define PACK16_MSB(a, b)       PACK16MSB(b, a)
#define	READ_NORM(a)		ROLI(16, (a))
#define	READ_REV(a)		(a)
#else
#define PACK16_MSB(a, b)       PACK16MSB(a, b)
#define	READ_NORM(a)		(a)
#define	READ_REV(a)		ROLI(16, (a))
#endif




#define horiz_dct(tab, o0, o1, o2, o3, o4, o5, o6, o7)		\
	tmp0 =  READ_NORM((tab)[0]);				\
	tmp1 =  READ_REV ((tab)[1]);				\
	tmp2 =  READ_NORM((tab)[2]);				\
	tmp3 =  READ_REV ((tab)[3]);				\
		 						\
	tmp101 = DSPIDUALADD(tmp0,tmp3);			\
	tmp132 = DSPIDUALADD(tmp1,tmp2);			\
	tmp176 = DSPIDUALSUB(tmp0,tmp3);			\
	tmp145 = DSPIDUALSUB(tmp1,tmp2);			\
								\
	tmp201 = DSPIDUALADD(tmp101,tmp132);			\
	tmp232 = DSPIDUALSUB(tmp101,tmp132);			\
								\
	o0 = IFIR16(tmp201,C8);					\
	o4 = IFIR16(tmp201,C9);					\
	o2 = IFIR16(tmp232,C10);				\
								\
	o6 = IFIR16(tmp232,C11);				\
	o7 = IFIR16(tmp145,C0) + IFIR16(tmp176,C1);		\
	o3 = IFIR16(tmp145,C2) + IFIR16(tmp176,C3);		\
	o5 = IFIR16(tmp145,C4) + IFIR16(tmp176,C5);		\
	o1 = IFIR16(tmp145,C6) + IFIR16(tmp176,C7);

#define	packltor(o0, o1, o2, o3, o4, o5, o6, o7)		\
	o0 = PACK16MSB(HROUND(s0), HROUND(t0));		\
	o1 = PACK16MSB(HROUND(s1), HROUND(t1));		\
	o2 = PACK16MSB(HROUND(s2), HROUND(t2));		\
	o3 = PACK16MSB(HROUND(s3), HROUND(t3));		\
	o4 = PACK16MSB(HROUND(s4), HROUND(t4));		\
	o5 = PACK16MSB(HROUND(s5), HROUND(t5));		\
	o6 = PACK16MSB(HROUND(s6), HROUND(t6));		\
	o7 = PACK16MSB(HROUND(s7), HROUND(t7));

#define	packrtol(o0, o1, o2, o3, o4, o5, o6, o7)		\
	o0 = PACK16MSB(HROUND(t0), HROUND(s0));		\
	o1 = PACK16MSB(HROUND(t1), HROUND(s1));		\
	o2 = PACK16MSB(HROUND(t2), HROUND(s2));		\
	o3 = PACK16MSB(HROUND(t3), HROUND(s3));		\
	o4 = PACK16MSB(HROUND(t4), HROUND(s4));		\
	o5 = PACK16MSB(HROUND(t5), HROUND(s5));		\
	o6 = PACK16MSB(HROUND(t6), HROUND(s6));		\
	o7 = PACK16MSB(HROUND(t7), HROUND(s7));

#define vertical_dct(tmp0, tmp1, tmp2, tmp3, o0, o1, o2, o3, o4, o5, o6, o7) 	\
								\
	tmp101 = DSPIDUALADD(tmp0,tmp3);			\
	tmp132 = DSPIDUALADD(tmp1,tmp2);			\
	tmp176 = DSPIDUALSUB(tmp0,tmp3);			\
	tmp145 = DSPIDUALSUB(tmp1,tmp2);			\
							\
	tmp201 = DSPIDUALADD(tmp101,tmp132);			\
	tmp232 = DSPIDUALSUB(tmp101,tmp132);			\
							\
	o0 = IFIR16(tmp201,C8);				\
	o4 = IFIR16(tmp201,C9);				\
	o2 = IFIR16(tmp232,C10);				\
	o6 = IFIR16(tmp232,C11);				\
							\
	o7 = IFIR16(tmp145,C0) + IFIR16(tmp176,C1);		\
	o3 = IFIR16(tmp145,C2) + IFIR16(tmp176,C3);		\
	o5 = IFIR16(tmp145,C4) + IFIR16(tmp176,C5);		\
	o1 = IFIR16(tmp145,C6) + IFIR16(tmp176,C7);

#define	vertical_flush(res)					\
	(res)[0] =  PACK16_MSB(VROUND(s0), VROUND(t0));		\
	(res)[4] =  PACK16_MSB(VROUND(s1), VROUND(t1));		\
	(res)[8]  = PACK16_MSB(VROUND(s2), VROUND(t2));		\
	(res)[12] = PACK16_MSB(VROUND(s3), VROUND(t3));		\
	(res)[16] = PACK16_MSB(VROUND(s4), VROUND(t4));		\
	(res)[20] = PACK16_MSB(VROUND(s5), VROUND(t5));		\
	(res)[24] = PACK16_MSB(VROUND(s6), VROUND(t6));		\
	(res)[28] = PACK16_MSB(VROUND(s7), VROUND(t7));

void
dct8x8fix(short * restrict stab, short * restrict sres)
{
#pragma	TCS_no_caller_save

	int tmp0, tmp1, tmp2, tmp3, tmp101, tmp132, tmp176, tmp145, tmp201, tmp232; 

	int s0, s1, s2, s3, s4, s5, s6, s7;
	int t0, t1, t2, t3, t4, t5, t6, t7;

	int  r00, r02, r04, r06, r10, r12, r14, r16;
	int  r20, r22, r24, r26, r30, r32, r34, r36;
	int  r40, r42, r44, r46, r50, r52, r54, r56;
	int  r60, r62, r64, r66, r70, r72, r74, r76;
	long *restrict tab;
	long *restrict res;

	tab = (long*)stab;
	res = (long*)sres; 

	horiz_dct(&tab[0], s0, s1, s2, s3, s4, s5, s6, s7); 
	horiz_dct(&tab[4], t0, t1, t2, t3, t4, t5, t6, t7);
	packltor(r00, r02, r04, r06, r10, r12, r14, r16);

	horiz_dct(&tab[8],  s0, s1, s2, s3, s4, s5, s6, s7); 
	horiz_dct(&tab[12], t0, t1, t2, t3, t4, t5, t6, t7);
	packrtol(r20, r22, r24, r26, r30, r32, r34, r36);

	horiz_dct(&tab[16], s0, s1, s2, s3, s4, s5, s6, s7); 
	horiz_dct(&tab[20], t0, t1, t2, t3, t4, t5, t6, t7);
	packltor(r40, r42, r44, r46, r50, r52, r54, r56);

	horiz_dct(&tab[24], s0, s1, s2, s3, s4, s5, s6, s7); 
	horiz_dct(&tab[28], t0, t1, t2, t3, t4, t5, t6, t7);
	packrtol(r60, r62, r64, r66, r70, r72, r74, r76);

	vertical_dct(r00, r20, r40, r60, s0, s1, s2, s3, s4, s5, s6, s7); 
	vertical_dct(r02, r22, r42, r62, t0, t1, t2, t3, t4, t5, t6, t7);
	vertical_flush(&res[0]);

	vertical_dct(r04, r24, r44, r64, s0, s1, s2, s3, s4, s5, s6, s7); 
	vertical_dct(r06, r26, r46, r66, t0, t1, t2, t3, t4, t5, t6, t7);
	vertical_flush(&res[1]);

	vertical_dct(r10, r30, r50, r70, s0, s1, s2, s3, s4, s5, s6, s7); 
	vertical_dct(r12, r32, r52, r72, t0, t1, t2, t3, t4, t5, t6, t7);
	vertical_flush(&res[2]);

	vertical_dct(r14, r34, r54, r74, s0, s1, s2, s3, s4, s5, s6, s7); 
	vertical_dct(r16, r36, r56, r76, t0, t1, t2, t3, t4, t5, t6, t7);
	vertical_flush(&res[3]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -