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的顺序存放。
- YUV格式视频的转置
- bmp转yuv格式的视频
- YUV 格式的视频呈现
- YUV格式视频的解析
- 视频转yuv格式小记
- 关于视频的YUV格式介绍
- avi视频格式转yuv格式与播放yuv视频
- matlab下avi视频转yuv格式
- 读取YUV格式视频函数
- 【视频处理】YUV格式说明
- 【视频处理】YUV格式说明
- 【视频处理】YUV格式说明
- 使用 8 位 YUV 格式的视频呈现
- 使用 8 位 YUV 格式的视频呈现
- 使用 8 位 YUV 格式的视频呈现
- 使用 8 位 YUV 格式的视频呈现
- 使用 8 位 YUV 格式的视频呈现
- 使用 8 位 YUV 格式的视频呈现
- 禁用文本框右键菜单
- SQL Server2005 安装方法
- Unix学习方法-高手之路
- Oracle 操作日期类型
- 多线程
- YUV格式视频的转置
- 经典书籍
- Hibernate 操作Oracle 单表操作
- C++静态成员的初始化,特别是QMap
- 【转】搭建LLVM实验环境
- j2me内存优化
- 用户体验这点事
- VS2005 安装WTL
- 最大堆MaxHeap和最小堆MinHeap的实现