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

YUV与RGB 以及之间的转换

YV12 and NV12

音视频流媒体图像视频编码网络协议超详细介绍

C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)