在现有的 Visual Studio 2015 C++ 32 位 Windows 项目中,我有一个将视频帧从 NV12 转换为 YUY2 的功能,这基本上只是随机播放字节。这里是:
void ConvertNV12toYUY2(int nInputHeight,
LPBITMAPINFOHEADER lpbiOutput,
void * _src, void * _dst,
bool bInterlaced)
{
const unsigned char* py8 = (const unsigned char*)_src;
unsigned char* pyuy2_8 = (unsigned char*)_dst;
int pitch = lpbiOutput->biWidth;
int width = pitch;
int nOutputHeight = abs((int)lpbiOutput->biHeight);
const unsigned char *puv8 = py8 + (nInputHeight * pitch);
int w = (width+7) >> 3;
const __m64 *py = (const __m64 *)py8;
__m64 *pyuy2 = (__m64 *)pyuy2_8;
for (int y = 0; y < nOutputHeight; y++)
{
const __m64 *puv;
if (bInterlaced)
puv = (const __m64 *)(puv8+(((y/2)&~1)+(y&1))*pitch);
else
puv = (const __m64 *)(puv8+(y/2)*pitch);
for (int x = 0; x < w; x++)
{
__m64 r0 = py[x]; // yyyy
__m64 r1 = puv[x]; // uvuv
__m64 r2 = r0; // yyyy
r0 = _m_punpcklbw(r0, r1); // yuyv
r2 = _m_punpckhbw(r2, r1); // yuyv
pyuy2[x*2] = r0;
pyuy2[x*2+1] = r2;
}
py += pitch/sizeof(__m64);
pyuy2 += (width*2)/sizeof(__m64);
}
_m_empty();
}
如果在 32 位项目中一直运行良好,但现在我将其移植到64 位,并且由于找不到这些标识符而无法编译:
_m_punpcklbw
_m_punpckhbw
_m_empty
我认为这与 Microsoft 64 位编译器不支持 mmx 内在函数有关,但老实说,我对 mmx 知之甚少。
是否有等效的替换功能可以在 64 位中执行相同的操作?