?? cbp.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 + -