Скопируйте NV12 в ID3D11Texture2D сразу

У меня есть декодер, который выдает кадры NV12 yuv. Я хотел бы скопировать этот кадр в текстуру ID3D11Texture2D с помощью одного memcpy. Поскольку D3D11_MAPPED_SUBRESOURCE имеет другой RowPitch, чем мой фрейм NV12, мне приходится копировать весь yuv построчно, что довольно дорого. Есть лучший способ это сделать?

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

// 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);

0 ответов

Другие вопросы по тегам