yuv中yv12与nv12的转换
Posted 楠倏之语
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yuv中yv12与nv12的转换相关的知识,希望对你有一定的参考价值。
YV12 与 NV12 的简单区别如图:
ffmpeg解码得到的YUV420P格式YV12写BUFFER保存:
<span style="font-size:12px;"> for( j=0; j<pVideoframe->height; j++)
memcpy(yQueue_buf + ywrite_ptr + pVideoframe->width*j, pVideoframe->data[0] + pVideoframe->linesize[0]*j, pVideoframe->width);
ywrite_ptr += pVideoframe->width*j;
// printf("Y write =%d\\n",ywrite_ptr);
for( j=0; j<pVideoframe->height/2; j++)
memcpy(yQueue_buf + ywrite_ptr + pVideoframe->width/2*j, pVideoframe->data[1] + pVideoframe->linesize[1]*j, pVideoframe->width/2);
ywrite_ptr += pVideoframe->width/2*j;
for( j=0; j<pVideoframe->height/2; j++)
memcpy(yQueue_buf + ywrite_ptr + pVideoframe->width/2*j, pVideoframe->data[2] + pVideoframe->linesize[2]*j, pVideoframe->width/2);
ywrite_ptr += pVideoframe->width/2*j;</span>
将YV12转为NV12发送至编码入口:
<span style="font-size:12px;"> w = pInfo.Width;
h = pInfo.Height;
pitch = pData.Pitch;
ptr = pData.Y + pInfo.CropX + pInfo.CropY * pData.Pitch;
for(i = 0; i < h; i++)
memcpy( ptr + i*pitch, YFrameBuf+w*i, w );
mfxU8 buf[1024];
ptr = pData.UV + pInfo.CropX + (pInfo.CropY / 2) * pitch;
for( i=0; i<h/2; i++)
memcpy(buf, YFrameBuf + w*h + w/2*i, w/2);
for (j = 0; j < w/2; j++)
ptr[i * pitch + j * 2] = buf[j];
for( i=0; i<h/2; i++)
memcpy(buf, YFrameBuf + w*h*5/4 + w/2*i, w/2);
for (j = 0; j < w/2; j++)
ptr[i * pitch + j * 2 + 1] = buf[j];
</span>
(pitch为超出width的填充数据,主要为字节对齐,一般为16或32字节,原理同ffmpeg中的linesize中超出width的部分,在数据转换时需要注意留存空间 )
以上是关于yuv中yv12与nv12的转换的主要内容,如果未能解决你的问题,请参考以下文章
视频存储格式YUV420 NV12 NV21 i420 YV12
将 YV12 (yuv420p) 转换为 JPEG / Bitamp
C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)