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;
}