YUV格式視頻的轉置

來源:互聯網
上載者:User

 

 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的順序存放。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.