-
Part 1
YUV格式图片如下
也就是每4个像素,对应一个U和一个V
YUVDesc.png
同时目前媒体中,YUV主要为Y,ChromaB,ChromaR形式。
关于YUV拆分过程图如下
Y'为亮度,Cb、Cr分量代表当前颜色对蓝色和红色的偏移程度。下图分别是Y+U+V/Y/Cb/Cr
-
Part 2
关于YUV显示和分割
显示
for (i = 0; i<height; i++) {
memcpy(snode->luma + width*i, v_frame->data[0] + i * v_frame->linesize[0], width);
}
for (i = 0; i<height / 2; i++) {
memcpy(snode->chromaB + width/2*i, v_frame->data[1] + i * v_frame->linesize[1], width / 2);
}
for (i = 0; i<height / 2; i++) {
memcpy(snode->chromaR + width/2*i, v_frame->data[2] + i * v_frame->linesize[2], width / 2);
}
分割
左上1/4
for (i = 0; i<height / 2; i++) {
memcpy(snode->luma + width*i, v_frame->data[0] + i * v_frame->linesize[0], width / 2);
}
for (i = 0; i<height / 4; i++) {
memcpy(snode->chromaB + width/2*i, v_frame->data[1] + i * v_frame->linesize[1], width / 4);
}
for (i = 0; i<height / 4; i++) {
memcpy(snode->chromaR + width/2*i, v_frame->data[2] + i * v_frame->linesize[2], width / 4);
}
上半部分和下半部分
/*
* 上半部分
*/
for (i = 0; i<height / 2; i++) {
memcpy(snode->luma + width*i, v_frame->data[0] + i * v_frame->linesize[0], width);
}
for (i = 0; i<height / 4; i++) {
memcpy(snode->chromaB + width/2*i, v_frame->data[1] + i * v_frame->linesize[1], width / 2);
}
for (i = 0; i<height / 4; i++) {
memcpy(snode->chromaR + width/2*i, v_frame->data[2] + i * v_frame->linesize[2], width / 2);
}
/*
* 下半部分
*/
for (i = 0; i<height / 2; i++) {
memcpy(snode->luma + width*i, v_frame->data[0] + (i + height/2) * v_frame->linesize[0], width);
}
for (i = 0; i<height / 4; i++) {
memcpy(snode->chromaB + width/2*i, v_frame->data[1] + (i+ height / 4) * v_frame->linesize[1], width / 2);
}
for (i = 0; i<height / 4; i++) {
memcpy(snode->chromaR + width/2*i, v_frame->data[2] + (i+ height / 4) * v_frame->linesize[2] + height / 4, width / 2);
}
引用,这一块比较好的文章:
https://www.jianshu.com/p/a91502c00fb0
https://blog.csdn.net/occupy8/article/details/49153731
网友评论