让我们从这个开始:
我有一个 16 字节的内存块,我只需要将偶数字节复制到 8 字节的内存块。
我目前的算法正在做这样的事情:
unsigned int source_size = 16, destination_size = 8, i;
unsigned char * source = new unsigned char[source_size];
unsigned char * destination = new unsigned char[destination_size];
// fill source
for( i = 0; i < source_size; ++i)
{
source[i] = 0xf + i;
}
// source :
// 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e
// copy
for( i = 0; i < destination_size; ++i)
{
destination[i] = source[i * 2];
}
// destination :
// 0f 11 13 15 17 19 1b 1d
这只是一个例子,因为我想知道当我需要获取每 3 个字节或每 4 个字节时是否有更好的方法来执行此操作,而不仅仅是字节。
我知道使用循环我可以实现这一点,但我需要优化它......我不完全知道如何使用 SSE,所以我不知道在这种情况下是否可以使用,但类似 memcpy 魔法的东西会很棒。
我还考虑过使用宏来摆脱循环,因为源和目标的大小都是恒定的,但这看起来没什么大不了的。
如果我说这是提取 YUYV 像素格式的 YCbCr 字节,也许你可以开箱即用。另外我需要强调的是,我这样做是为了摆脱 libswscale。