⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frameheader.cpp

📁 自己在wince的环境下做的一移动数字电视驱动
💻 CPP
字号:
/////////////////
//Author: Wenson Chen.
//Company: Innofidei.com
//Date: 2007/09/26-
//Licesence Notes:
//

/*

Copyright (C) 2007-2008 Innofidei, Inc.

Module Name: FrameHeader.cpp

History: 
--*/

#include "FrameHeader.h"
#ifndef _DEBUG
//#define printf(...)
#endif

DWORD CFrameHeader::ParseHeader(LPBYTE lpIn)
{
	nHeaderLen	= GET1(lpIn+4);

	if(false == CheckCRC32(lpIn, nHeaderLen))
	{
		printf("\tDEMUX_CRC_ERROR, header = %d bytes\n", nHeaderLen);
		printf("\t0x%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,"
			"%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
			lpIn[0],lpIn[1],lpIn[2],lpIn[3],lpIn[4],
			lpIn[5],lpIn[6],lpIn[7],lpIn[8],lpIn[9],
			lpIn[10],lpIn[11],lpIn[12],lpIn[13],lpIn[14],
			lpIn[15],lpIn[16],lpIn[17],lpIn[18],lpIn[19],lpIn[20]);

		lpIn[0] = 0;
		lpIn[1] = 0;
		lpIn[2] = 0;
		lpIn[3] = 1;
		lpIn[4] = 0xf;//One Subframe, try only for service channel
		if(false == CheckCRC32(lpIn, nHeaderLen))
			return DEMUX_CRC_ERROR;
	}
	lpIn += 5;

	WORD wTemp      = STEP2(lpIn);

	nVersion        = wTemp >> 11;			// 5 bits
	nMinVersion     = (wTemp >> 6) & 0x1f;	// 5
	nMfID           = wTemp & 0x3f;			// 6

	BYTE  nTemp     = STEP1(lpIn);
	nUrgencyFlag    = nTemp >> 6;				//2
	nNextFrameFlag  = (nTemp >> 5) & 1;		//1
	nSnUpdateFlag   = nTemp & 3;				//2

	DWORD u32Tmp	= STEP4(lpIn);
	NIT_USN         = BYTE(u32Tmp >> 28);			//4
	CMCT_USN        = BYTE((u32Tmp >> 24) & 0xf);	//4
	CSCT_USN        = BYTE((u32Tmp >> 20) & 0xf);	//4
	SMCT_USN        = BYTE((u32Tmp >> 16) & 0xf);	//4
	SSCT_USN        = BYTE((u32Tmp >> 12) & 0xf);	//4
	ESG_USN         = BYTE((u32Tmp >>  8) & 0xf);	//4
	nSubFrameNum	= BYTE(u32Tmp & 0xf);	//4

	if(nMfID == 0)
	{
		printf("TS0 Received.NIT_USN=%d\n",NIT_USN);
	}

	for (unsigned i = 0; i < nSubFrameNum; i++)
	{
		dwSubFrameLen[i]  = STEP3(lpIn);
	}

	if (nNextFrameFlag)								// flag for next-second
	{
		tPareOfNextFrame.nMFHeaderLen				= STEP1(lpIn);//
		tPareOfNextFrame.dwFirstSubFrameLen			= STEP3(lpIn);
		tPareOfNextFrame.nFirstSubFrameHeaderLen	= STEP1(lpIn);
	}
	else
	{
		tPareOfNextFrame.nMFHeaderLen				= 0;//the legth of next second frame
		tPareOfNextFrame.dwFirstSubFrameLen			= 0;
		tPareOfNextFrame.nFirstSubFrameHeaderLen	= 0;
	}

	return 0;
}

bool CheckCRC32(const LPBYTE lpIn, size_t len)
{
	unsigned long dwCalCRC		= CalcCRC32(lpIn, len);
	unsigned long u32CRCValue	= GET4(lpIn + len);
	return dwCalCRC == u32CRCValue;
}

int CFrameHeader::getHeaderLen()
{
	return 4 + nHeaderLen;
}

int CFrameHeader::getFrameLen()
{
	int l = getHeaderLen();
	for(int i=0;i<nSubFrameNum;i++)
	{
		l += dwSubFrameLen[i];
	}
	return l;
}

WORD CFrameHeader::GetFrequency(BYTE id)
{
	static WORD freq[]=
	{
		0,0,0,0,0,0,0,0,0,0,0,0,0,//0-12
		474,482,490,498,506,
		514,522,530/*20*/,538,546,
		554,562,//It is NOT continous
		610,618,626,
		634,642,650,658,666,674,
		682,690,698,706,714,
		722,730,738,746,754/*43*/,762,770,778,786,794,802,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		2620/*100*/,2628,2636
	};
	if(id>102)
		return 0;
	return freq[id];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -