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