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