Advertisement

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用作超出宽度范围的数据填充方式,在数据处理中主要采用以字节对齐的方式进行操作,默认情况下每份文件占据16或32字节的空间单位。其原理与ffmpeg中linesize处理超出宽度区域的方式相似,在实际操作中需确保在转换过程中留有足够的存储空间用于处理超出部分的数据)

全部评论 (0)

还没有任何评论哟~