我使用FlasCC允许我使用FFmpeg渲染AS3的视频。在AS3中执行endian交换非常慢,我运行了一些测试并删除了视频ByteArray上的endian交换,然后将视频字节(用于该帧)发送到rendered,大约减少了一半的渲染时间。我想看看我是否能通过在C中实现Endiad交换更快,但我从来没有在C或C++中做过Endiad交换,而且我发现的一些帖子有点复杂。
我正在接收一个指针作为指向我的ByteArray的uint8,并希望使用C将endian从大到小进行交换。是否有人可以指向正确的方向或给我一些示例代码来这样做?
ByteArray应该保存RGB32数据,但它是一个大端,我需要它是一个大端,以便使用ffmpeg进行处理。
编辑:
当前使用:
int i = 0;
int j = bufferSize - 1;
int temp;
while (i < j)
{
temp = buffer[i];
buffer[i] = buffer[j];
buffer[j] = temp;
i++;
j--;
}
最佳答案
byteswap最快的方法是使用为其设计的机器指令,即x86处理器上的bswap
和pshufb
(SSSE3)。
好的编译器有模式匹配器来使用基于掩蔽的常见实现的指令。
xswapped32 = ((x & 0xffu) << 24) | ((x & 0xff00u) << 8) |
((x & 0xff0000u) >> 8) | (x >> 24);
在不允许未对齐负载的平台上从
int8
转换到uint32
时,请注意确保数据对齐。可靠使用它们的最简单方法是使用编译器内部函数,例如与GCC或clang一起使用:
__builtin_bswap32(var)
如果您的机器有SSSE3,使用pshufb会更快:
const __m128i cmask4 = _mm_set_epi8(12, 13, 14, 15,
8, 9, 10, 11,
4, 5, 6, 7,
0, 1, 2 ,3);
_mm_shuffle_epi8(vectorvalue, cmask4);
关于c - 在C中从AS3 ByteArray将big endian转换为little endian,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24890584/