一般的混流操作是借住D3D或者OpenGL API利用GPU的并行处理能力进行,把各种色彩空间的图片统一由shader转成RGBA的格式进行纹理贴图的操作。
如果要混好的图片作编码一般的过程为:数据上显卡-》在显卡上作贴图-》把混好的纹理转成yuv444-》纹理映射到内存(数据从显卡copy到内存)-》把yuv444转成NV12或者I420去编码。
下面要介绍的是直接使用cpu进行I420的混流操作,这样如果服务器上没有显卡,也可以进行软的混流操作,直接上代码:
void MixYUV420(unsigned char* pDstImg, int realDstW, int realDstH, int posX, int posY,
int dstW, int dstH, unsigned char* pSrcImg, int srcW, int srcH)
{
unsigned char *USrcImg = pSrcImg + srcW * srcH;
unsigned char *UDstImg = pDstImg + realDstW * realDstH;
unsigned char *VSrcImg = pSrcImg + srcW * srcH * 5 / 4;
unsigned char *VDstImg = pDstImg + realDstW * realDstH * 5 / 4;
pDstImg