研究ffmpeg从yuv到rgb的转换时,我遇到了在程序集中实现的等式,位于ffmpeg / libswscale / x86的yuv2rgb_template.c。
我想知道packuswb指令是如何工作的? Google说:
使用无符号饱和度将4个带mm的带符号字整数和4个带mm / m64的带符号字整数转换为8个带mm的无符号字节整数。
DEST[7:0] ← SaturateSignedWordToUnsignedByte DEST[15:0];
DEST[15:8] ← SaturateSignedWordToUnsignedByte DEST[31:16];
DEST[23:16] ← SaturateSignedWordToUnsignedByte DEST[47:32];
DEST[31:24] ← SaturateSignedWordToUnsignedByte DEST[63:48];
DEST[39:32] ← SaturateSignedWordToUnsignedByte SRC[15:0];
DEST[47:40] ← SaturateSignedWordToUnsignedByte SRC[31:16];
DEST[55:48] ← SaturateSignedWordToUnsignedByte SRC[47:32];
DEST[63:56] ← SaturateSignedWordToUnsignedByte SRC[63:48];
由于我不了解Assembly x86,因此甚至很难对其进行仿真或调试当前代码。
我想知道它们如何适合8位中的16位?
答案 0 :(得分:6)
SaturateSignedWordToUnsignedByte
表示裁剪到8位范围。因此> = 0x100变为0xFF,<=-1变为0,其余(0-0xFF)保持不变。