Скопируйте NV12 в ID3D11Texture2D сразу - PullRequest
1 голос
/ 25 сентября 2019

У меня есть декодер, который выдает NV12 yv кадры.То, что я хотел бы сделать, это скопировать этот кадр в текстуру ID3D11Texture2D с одним memcpy.Поскольку D3D11_MAPPED_SUBRESOURCE имеет RowPitch, отличный от моего кадра NV12, я должен копировать целый ряд строк за строкой, что довольно дорого.Есть ли лучший способ сделать это?

Я пытался найти любую информацию по этой теме, но пока безуспешно.

// Copy from CPU access texture to bitmap buffer
D3D11_MAPPED_SUBRESOURCE resource;
UINT subresource = D3D11CalcSubresource(0, 0, 0);
OutMgr.m_DeviceContext->Map(OutMgr.m_texture, subresource, D3D11_MAP_WRITE_DISCARD, 0, &resource);

BYTE* dptr = reinterpret_cast<BYTE*>(resource.pData);

for (int i = 0; i < nv12Frame->height; i++)
{
    memcpy(dptr + resource.RowPitch * i, nv12Frame->Y + nv12Frame->pitch * i, nv12Frame->pitch);
}

for (int i = 0; i < nv12Frame->height / 2; i++)
{
    memcpy(dptr + resource.RowPitch *(nv12Frame->height + i), nv12Frame->UV + nv12Frame->pitch * i, nv12Frame->pitch);
}

OutMgr.m_DeviceContext->Unmap(OutMgr.m_texture, subresource);
...