如何使用arm NEON将yuv444转换为YUV422?
我想将颜色图案从如何使用arm NEON将yuv444转换为YUV422?,arm,simd,neon,yuv,Arm,Simd,Neon,Yuv,我想将颜色图案从yuv444转换为yuyv422。 目前,我正在使用c进行转换,转换速度较慢。 有人知道如何使用arm NEON转换颜色图案吗? 下面是我使用c的代码: { unsigned int i, j; unsigned int y1, y2, cb, cr, i_rows; const unsigned char *p; p = src; for (i = 0; i < height; i++) { i_rows = i
yuv444
转换为yuyv422
。
目前,我正在使用c
进行转换,转换速度较慢。
有人知道如何使用arm NEON转换颜色图案吗?
下面是我使用c
的代码:
{
unsigned int i, j;
unsigned int y1, y2, cb, cr, i_rows;
const unsigned char *p;
p = src;
for (i = 0; i < height; i++) {
i_rows = i*2*width;
for (j = 0; j < 2*width; j += 4) {
y1 = p[0];
cb = (p[1] + p[4] + 1) >> 1;
y2 = p[3];
cr = (p[2] + p[5] + 1) >> 1;
*(dst + i_rows + j ) = y1;
*(dst + i_rows + j+1) = cb;
*(dst + i_rows + j+2) = y2;
*(dst + i_rows + j+3) = cr;
p += 6;
}
}
}
{
无符号整数i,j;
无符号整数y1、y2、cb、cr、i_行;
常量无符号字符*p;
p=src;
对于(i=0;i>1;
y2=p[3];
cr=(p[2]+p[5]+1)>>1;
*(dst+i_行+j)=y1;
*(dst+i_行+j+1)=cb;
*(dst+i_行+j+2)=y2;
*(dst+i_行+j+3)=cr;
p+=6;
}
}
}
试试这个:
vld3.8 {d16, d18, d20}, [pSrc]!
vld3.8 {d17, d19, d21}, [pSrc]!
vtrn.8 q9, q10
vrhadd.u8 q9, q10, q9
vst2.8 {q8, q9}, [pDst]!
上面是我放在主循环中的内容。剩下的就看你了。你可能需要自己尝试并实现这一点,如果你在任何时候遇到困难,你都需要回答一些具体的问题。这看起来应该很容易实现矢量化(元素之间没有令人讨厌的依赖关系),虽然6字节的长度意味着您可能希望一次处理几个像素以保持加载/存储对齐,但在末尾需要一些非矢量化清理。这可能是一个很好的起点。我想看看OpenCV是否对此进行了优化。