在WebRTC中使用VP8编码I420BufferInterface方式中DataY(),DataU(),DataV(),取出的数据正好是Y,U,V分量,可以直接在OpenGL中渲染,但是改成open264后,由于用的是ffmpeg解码,复用的AVFrame里的数据,涉及到内存对齐,需要按linesize去每行的copy。
所以解码后的数据在I420BufferInterface的通用取法为:
int nYUVBufsize = 0;
int nVOffset = 0;
for (int i = 0; i < m_height; i++) {
memcpy(m_uBuffer + nYUVBufsize,m_I420Buffer->DataY() + i * m_I420Buffer->StrideY(), m_width);
nYUVBufsize += m_width;
}
for (int i = 0; i < m_height / 2; i++) {
memcpy(m_uBuffer + nYUVBufsize, m_I420Buffer->DataU() + i * m_I420Buffer->StrideU(), m_width / 2);
nYUVBufsize += m_width / 2;
memcpy(m_uBuffer + m_width * m_height * 5 / 4 + nVOffset, m_I420Buffer->DataV() + i * m_I420Buffer->StrideV(), m_width / 2);
nVOffset += m_width / 2;
}