硬汉嵌入式论坛

 找回密码
 立即注册
查看: 686|回复: 2
收起左侧

[其它] YCbCr 转 RGB16 的效率问题

[复制链接]

24

主题

121

回帖

193

积分

初级会员

积分
193
发表于 2022-1-17 08:31:23 | 显示全部楼层 |阅读模式
在软件解码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起作用。

想请教一下:这段代码是否还有优化的可能性以提高点速度?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106831
QQ
发表于 2022-1-17 15:05:19 | 显示全部楼层
首先这个for循环部分可以展开下,for循环有时候非常耗时间。可以8个或者16个为一组计算。
回复

使用道具 举报

24

主题

121

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2022-1-17 18:17:56 | 显示全部楼层
eric2013 发表于 2022-1-17 15:05
首先这个for循环部分可以展开下,for循环有时候非常耗时间。可以8个或者16个为一组计算。

谢谢白工,明天就实测一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 15:30 , Processed in 0.198037 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表