CIF2QCIF.cpp
CIF文件是25帧的视频序列,一起读入资源耗费太大,所以一帧一帧的进行读入。
#include <iostream>
#include <fstream>
using namespace std;
#define width 352
#define height 288
#define UVwidth 176
int main()
{
int YSize = width * height;//Y块的大小
int CrSize = width * height / 4;//Cr块的大小
int CbSize = width * height / 4;//Cb块的大小
int FrameSize = YSize + CrSize + CbSize;
int QFrameSize = FrameSize >> 2;
ifstream CIFfile("D:\\0CUC\\digital_video\\miss.cif", ios::binary);//读入文件
ofstream QCIFfile("D:\\0CUC\\digital_video\\Qmiss.qcif", ios::binary);//写入文件
if (!CIFfile)
{
cout << "error!" << endl;
exit(1);
}
int number = 0;
while (CIFfile.peek() != EOF)
{
unsigned char* in = new unsigned char[FrameSize];//用来读取每一帧文件的数组
unsigned char* out = new unsigned char[QFrameSize];//用来写入到QCIF的每一帧的数据
CIFfile.read((char*)in, FrameSize);//in里面存储的是一帧的数据
int j = 0;//j代表的是此时QCIF文件的位置,i代表的是此时CIF文件的位置
for (int i = 0; i < FrameSize;)
{
if (i < YSize)//进入Y数据的写入
{
if ((i)%(width*2)==(width-1))
{
i = i + width;
continue;
}
if (i % 2 == 1)
{
i++;
continue;
}
int y1 = *(in + i);
int y2 = *(in + +i + 1);
int y3 = *(in + i + width);
int y4 = *(in + i + width + 1);
*(out + j) = (y1 + y2 + y3 + y4) / 4;
j++;
}
else if (i < YSize + CrSize)//进入Cr数据的写入
{
if ((i - YSize) % (UVwidth * 2) == (UVwidth - 1))
{
i = i + UVwidth;
continue;
}
if (i % 2 == 1)
{
i++;
continue;
}
int u1 = *(in + i);
int u2 = *(in + i + 1);
int u3 = *(in + i + UVwidth);
int u4 = *(in + i + UVwidth + 1);
*(out + j) = (u1 + u2 + u3 + u4) / 4;
j++;
}
else//进入Cb数据的写入
{
if ((i - YSize) % (UVwidth * 2) == (UVwidth - 1))
{
i = i + UVwidth;
continue;
}
if (i % 2 == 1)
{
i++;
continue;
}
int u1 = *(in + i);
int u2 = *(in + i + 1);
int u3 = *(in + i + UVwidth);
int u4 = *(in + i + UVwidth + 1);
*(out + j) = (u1 + u2 + u3 + u4) / 4;
j++;
}
i++;
}
QCIFfile.write((char*)out, QFrameSize);
delete in;
delete out;
number++;
}
CIFfile.close();
QCIFfile.close();
return 0;
}