|
在软件解码JPG流程中,有一段YCbCr 转 RGB16的代码(块大小为16*16),
static inline void YCbCrToBGREx (uchar * pYCbCr, ushort * pBgr)
{
int i, j, n;
uchar y, cb, cr, *py[4], *pcb, *pcr;
for( i = 0; i < nBlocksInMcu-2; i++ )
py[i] = pYCbCr + i * 64;
pcb = pYCbCr + (nBlocksInMcu-2) * 64;
pcr = pcb + 64;
uchar * range_limit = range_tbl + 256;
for( j=0; j<nMcuSize; j++ )//vertical axis
{
for( i=0; i<nMcuSize; i++ ) //horizontal axis
{
y = *( py[user_const1[i][j]] ++ );
n = user_const2[i][j];
cb = pcb[n]; cr = pcr[n];
// 直接转为16位色(已提前&0xFC)
*(pBgr++) = (range_limit[y + CrToR[cr]] >> 3) << 11
| (range_limit[y + ((CbToG[cb] + CrToG[cr])>>16)]) << 3
| range_limit[y + CbToB[cb]]>> 3;
}
}
}
该代码基本上没有计算,只有查表。在RT1052环境下实测了一下,条件如下:
1 - 600M,800*480图片,IAR优化等级最高
2 - 所有数据均放在SDRAM,解码代码放在ITCM。
实测整幅图片的时间开销约为18ms。
当IAR优化等级最高时,数据,代码随便放在哪里其实都影响不大,主要是cache起作用。
想请教一下:这段代码是否还有优化的可能性以提高点速度?
|
|