int nv12Toi420(int nWidth,int nHeight,int nPitch,CUdeviceptr* Src_NV12,unsigned char *Dst_i420)
{
if(m_pTempBufSize < nPitch * nHeight * 3 / 2)
{
m_pTempBufSize = nPitch * nHeight * 3 / 2;
if(m_pBuf)
{
free(m_pBuf);
m_pBuf = (unsigned char* )malloc(m_pTempBufSize);
}
else
m_pBuf = (unsigned char* )malloc(m_pTempBufSize);
}
memcpy(m_pBuf, Src_NV12, nPitch * nHeight * 3 / 2);
int dst_pos = 0;
int src_pos = 0;
for (int i = 0;i<nHeight*3/2;i++)
{
memcpy(Dst_i420+dst_pos, m_pBuf+src_pos, nWidth);
dst_pos += nWidth;
src_pos += nPitch;
}
int i = 0;
// Write Cb
for(int idx = 0; idx < (nWidth*nHeight/2); idx+=2)
{
memcpy(m_pUV[0] + i, Dst_i420+nWidth*nHeight + idx,1);
i++;
}
i =0;
// Write Cr
for(int idx = 1; idx < (nWidth*nHeight/2); idx+=2)
{
memcpy(m_pUV[1]+i,Dst_i420+nWidth*nHeight+idx,1);
i++;
}
memcpy(Dst_i420 + nWidth*nHeight, m_pUV[0],nWidth*nHeight/4);
memcpy(Dst_i420+nWidth*nHeight + nWidth*nHeight/4, m_pUV[1], nWidth*nHeight/4);
return 1;
}