YV12 与 I420是有区别的。具体区别见上一篇。
YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
如果用I420的解析器播放YV12格式的文件的话,会产生偏蓝的问题。 x264仅支持I420的压缩。
YUY2 = YUYV(命名太不规范).
YUY2转换成I420的方法如下,测试通过。
#define uint8_t BYTE
void YUY2toI420(int inWidth, int inHeight, uint8_t *pSrc, uint8_t *pDest)
{
int i, j;
uint8_t *u = pDest + (inWidth * inHeight);
uint8_t *v = u + (inWidth * inHeight) / 4;
for (i = 0; i < inHeight/2; i++)
{
uint8_t *src_l1 = pSrc + inWidth*2*2*i;
uint8_t *src_l2 = src_l1 + inWidth*2;
uint8_t *y_l1 = pDest + inWidth*2*i;
uint8_t *y_l2 = y_l1 + inWidth;
for (j = 0; j < inWidth/2; j++)
{
// two pels in one go
*y_l1++ = src_l1[0];
*u++ = src_l1[1];
*y_l1++ = src_l1[2];
*v++ = src_l1[3];
*y_l2++ = src_l2[0];
*y_l2++ = src_l2[2];
src_l1 += 4;
src_l2 += 4;
}
}
}
void YUY2toI420(int inWidth, int inHeight, uint8_t *pSrc, uint8_t *pDest)
{
int i, j;
uint8_t *u = pDest + (inWidth * inHeight);
uint8_t *v = u + (inWidth * inHeight) / 4;
for (i = 0; i < inHeight/2; i++)
{
uint8_t *src_l1 = pSrc + inWidth*2*2*i;
uint8_t *src_l2 = src_l1 + inWidth*2;
uint8_t *y_l1 = pDest + inWidth*2*i;
uint8_t *y_l2 = y_l1 + inWidth;
for (j = 0; j < inWidth/2; j++)
{
// two pels in one go
*y_l1++ = src_l1[0];
*u++ = src_l1[1];
*y_l1++ = src_l1[2];
*v++ = src_l1[3];
*y_l2++ = src_l2[0];
*y_l2++ = src_l2[2];
src_l1 += 4;
src_l2 += 4;
}
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步