YUV格式视频的转置

来源:互联网 发布:eclipse设置代理网络 编辑:程序博客网 时间:2024/05/01 08:17

 

 int i;
 int a;
 int y,x;
 int p_in;
 int p_out;
 UpdateData(TRUE);
 BYTE *frm_buffer=new BYTE[m_width*m_height*3/2];
 BYTE *u_buffer=frm_buffer+m_width*m_height;
 BYTE *v_buffer=frm_buffer+m_width*m_height*5/4;

   //转化后缓存空间
 BYTE *tran_frm_buffer=new BYTE[m_width*m_height*3/2];
 BYTE *tran_u_buffer=tran_frm_buffer+m_width*m_height;
 BYTE *tran_v_buffer=tran_frm_buffer+m_width*m_height*5/4;

 unsigned int  bytes_y=m_width*m_height;
 unsigned int  bytes_uv=(m_width/2)*(m_height/2);  //4:2:0
 unsigned int  frm_bytes=bytes_y+2*bytes_uv;
 if((p_in=_open(m_inputfile,O_RDWR|O_BINARY))==-1)
 {
     MessageBox("读取源seq文件失败.");
     return;
 }
 if((p_out=_open(m_outputfile,O_RDWR|O_BINARY))==-1)
 {
     MessageBox("读取目标seq文件失败.");
     return;
 }
 if(!m_allselected) 
 {
  for(i=m_from;i<=m_to;i++)  //需要转换的帧
  {
   if(_lseeki64(p_in,i*frm_bytes,SEEK_SET)==-1)
   {
        MessageBox("Seek Error!");
         return;
   }
    if(_read(p_in,frm_buffer,frm_bytes)!=frm_bytes)
   {
        MessageBox("Read Frame Error!");
        return;
   }
     for(y=0;y<m_width;y++)
         for(x=0;x<m_height;x++)
              tran_frm_buffer[y*m_height+x]=frm_buffer[x*m_width+y];

   for(y=0;y<m_width/2;y++)
        for(x=0;x<m_height/2;x++)
             tran_u_buffer[y*m_height/2+x]=u_buffer[x*m_width/2+y];

   for(y=0;y<m_width/2;y++)
       for(x=0;x<m_height/2;x++)
            tran_v_buffer[y*m_height/2+x]=v_buffer[x*m_width/2+y];


   if(_write(p_out,tran_frm_buffer,frm_bytes)!=frm_bytes)
   {
        MessageBox("Write Transpose Frame Error!");
        return;
   }

          
  }
 }
 else   //全部帧
 {
  while (_read(p_in,frm_buffer,frm_bytes)==frm_bytes)
  {
     for(y=0;y<m_width;y++)
         for(x=0;x<m_height;x++)
            tran_frm_buffer[y*m_height+x]=frm_buffer[x*m_width+y];

     for(y=0;y<m_width/2;y++)
         for(x=0;x<m_height/2;x++)
            tran_u_buffer[y*m_height/2+x]=u_buffer[x*m_width/2+y];

    for(y=0;y<m_width/2;y++)
        for(x=0;x<m_height/2;x++)
            tran_v_buffer[y*m_height/2+x]=v_buffer[x*m_width/2+y];
   if(_write(p_out,tran_frm_buffer,frm_bytes)!=frm_bytes)
   {
         MessageBox("Write Transpose Frame Error!");
          return;
   }
  }
 }
 close(p_in);
 close(p_out);
 delete frm_buffer;
 delete tran_frm_buffer;

 

 程序解释如下:

1) m_inputfile,m_outputfile,m_width,m_height,m_allselected,m_from,m_to是其他地方传递过来的参数。

      其中m_inputfile是源YUV文件,m_outputfile是转置后的YUV结果文件,m_width,m_height是原始视频的宽度和高度。

      若m_allselected为真,则转换视频中的所有帧,否则只转换从m_from到m_to的视频帧。

2) YUV4:2:0的U,V分量的水平分辨率和垂直分辨率均是Y分量的1/2。

3) Y,U,V在文件中按照先Y后U最后V的顺序存放。

原创粉丝点击