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

📄 cbp.c

📁 用MPEG-4对YUV视频文件编码压缩成divx视频文件
💻 C
字号:
#include "../portab.h"
#include "cbp.h"

cbpFuncPtr calc_cbp;


/*!
 ************************************************************************   
 * \brief
 *  Returns six bits that indicates non zero ac blocks
 *  for this macro block
 *
 ************************************************************************
 */
#ifndef _TRIMEDIA
uint32_t							 
calc_cbp_c ( const int16_t codes[6 * 64] )
{
	uint16_t i=0;
	uint32_t cbp = 0;

    const uint32_t  * restrict p1,  * restrict p2 ,  * restrict p3 ,  * restrict p4,  *restrict p5 ,  * restrict p6 ;

	uint32_t r1=0, r2=0, r3=0, r4=0, r5=0, r6=0 ;

	p1 = (uint32_t *) ( codes + 4)	;
	p2 = (uint32_t *) (codes + 68)	;
	p3 = (uint32_t *) (codes + 132)	;
	p4 = (uint32_t *) (codes + 196)	;
	p5 = (uint32_t *) (codes + 260)	;
	p6 = (uint32_t *) (codes + 324)	;

	for (i=0 ; i< 6 ; i++ )
	{	
		r1 |= ( *(p1) | *(p1+1) | *(p1+2) | *(p1+3) | *(p1+4) ) ; 
		r2 |= ( *(p2) | *(p2+1) | *(p2+2) | *(p2+3) | *(p2+4) ) ;  
		r3 |= ( *(p3) | *(p3+1) | *(p3+2) | *(p3+3) | *(p3+4) ) ; 
		r4 |= ( *(p4) | *(p4+1) | *(p4+2) | *(p4+3) | *(p4+4) ) ; 
		r5 |= ( *(p5) | *(p5+1) | *(p5+2) | *(p5+3) | *(p5+4) ) ;  
		r6 |= ( *(p6) | *(p6+1) | *(p6+2) | *(p6+3) | *(p6+4) ) ; 

		p1+=5;
		p2+=5;
		p3+=5;
		p4+=5;
		p5+=5;
		p6+=5;
	}


	r1 |= ( *(codes+1)   | *(codes+2)   | *(codes+3)   )	;
	r2 |= ( *(codes+65)  | *(codes+66)  | *(codes+67)  )	;
	r3 |= ( *(codes+129) | *(codes+130) | *(codes+131) )	;
	r4 |= ( *(codes+193) | *(codes+194) | *(codes+195) )	;
	r5 |= ( *(codes+257) | *(codes+258) | *(codes+259) )	;
	r6 |= ( *(codes+321) | *(codes+322) | *(codes+323) )    ;


	if(r1)
	{
		cbp |= 0x20 ;
	}
	
	if(r2)
	{
		cbp |= 0x10 ;
	}

	if(r3)
	{
		cbp |= 0x8 ;
	}

	if(r4)
	{
		cbp |= 0x4 ;
	}

	if(r5)
	{
		cbp |= 0x2 ;
	}

	if(r6)
	{
		cbp |= 0x1 ;
	}	

	return cbp;

}


#else
/* 目前这段代码的优化对指令cache的影响比较大 */
uint32_t									/*==> return the bits for six blocks,
											showing whether code it or not */
calc_cbp_c(const int16_t codes[6 * 64]      /*<--  8*8 block coeff value */
		   )
{
	uint32_t i, j;
	uint32_t cbp = 0;
	uint32_t sum =0;
	uint32_t sum0,sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8,sum9;
	int32_t *ptr_codes = (int32_t *)codes;
        
	for (i = 0; i < 6; i++) {
        
        #pragma TCS_unroll=8
		for (j = 0; j < 64; j += 8) {
			sum0 = DSPIDUALABS( *(ptr_codes   ));
			sum1 = DSPIDUALABS( *(ptr_codes+1 ));
			sum2 = DSPIDUALABS( *(ptr_codes+2 ));
			sum3 = DSPIDUALABS( *(ptr_codes+3 ));
			sum4 = DSPIDUALADD(sum0,sum1);
			sum5 = DSPIDUALADD(sum2,sum3);
			sum6 = DSPIDUALADD(sum4,sum5);
			sum7 = UFIR16(sum6,0x00010001);
			
			sum += sum7;
		    ptr_codes+=4;	
		}
		sum-=IABS(codes[i*64]);
		if(sum) cbp|=1<<(5-i);
		sum=0;
	}

	return cbp;

}
#endif

⌨️ 快捷键说明

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