📄 frameheader.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 + -