Nvidia の npp ライブラリを使用して、3 チャネル パックされた rgb のフレームを nv12 に変換しようとしています。これが私がこれまでに持っているコードです:
//cpu buffer that will hold converted data
Npp8u* converted_data = (Npp8u*)malloc(frameToWrite.getWidth());
memset(converted_data, 0, frameToWrite.getSize());
//Begin - load data and convert rgb to yuv
{
NppStatus ret = NPP_SUCCESS;
int stepSource;
Npp8u* frame = nppiMalloc_8u_C3(frameToWrite.getWidth(), frameToWrite.getHeight(), &stepSource);
cudaMemcpy2D(frame, stepSource, frameToWrite.getFrame(), frameToWrite.getSizePerRow(), frameToWrite.getWidth(), frameToWrite.getHeight(), cudaMemcpyHostToDevice);
int stepDestP1, stepDestP2, stepDestP3;
Npp8u* m_stYuvP1 = nppiMalloc_8u_C1(frameToWrite.getWidth(), frameToWrite.getHeight(), &stepDestP1);
Npp8u* m_stYuvP2 = nppiMalloc_8u_C1(frameToWrite.getWidth(), frameToWrite.getHeight(), &stepDestP2);
Npp8u* m_stYuvP3 = nppiMalloc_8u_C1(frameToWrite.getWidth(), frameToWrite.getHeight(), &stepDestP3);
int d_steps[3] = { stepDestP1, stepDestP2, stepDestP3 };
Npp8u* d_ptrs[3] = { m_stYuvP1, m_stYuvP2, m_stYuvP3 };
NppiSize ROI = { frameToWrite.getWidth(), frameToWrite.getHeight() };
if ((ret = nppiRGBToYUV_8u_C3P3R(frame, stepSource, d_ptrs, stepDestP1, ROI)) != NPP_SUCCESS)
return ERROR_CODE_NVENC_ERROR_UNKNOWN;
cudaMemcpy2D(converted_data, frameToWrite.getWidth(), m_stYuvP1, stepDestP1, frameToWrite.getWidth(), frameToWrite.getHeight(), cudaMemcpyDeviceToHost);
}
主にこのスタックオーバーフローの質問に基づいていますが、ケースに合わせて調整しました。補足として、次のframeToWrite.getSize()
ように計算されます。
mFrameSize = ((getBytesPerPixel() * mWidth) + mPaddingInBytes) * mHeight;
getBytesPerPixel()
通常は を返します3
。
最終的に私の質問は次のとおりです。
- 変換された画像データをデバイスのメモリから取得するにはどうすればよいですか?
- 変換前の画像データを正しい方法でデバイスに渡しましたか?