數字視頻處理(一)——CIF文件轉QCIF文件

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章