如何使用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是否对此进行了优化。