frameparser.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,611 行 · 第 1/5 页
C
1,611 行
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetNitContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_INT i,needdatalen;
needdatalen = NIT_PART1_WIDTH+stream->SysConf.NitConf.NetNameLength+NIT_PART2_WIDTH
+stream->SysConf.NitConf.OtherFreqPointNum*NIT_OTHER_FREQPOINT_PARAM_WIDTH
+NIT_PART3_WIDTH+stream->SysConf.NitConf.NearNetNum*NIT_NEAR_NET_PARAM_WIDTH
+HEADER_CRC_FIELD_WIDTH;
if (fp->FrameDataLen > needdatalen)
{
if (!CheckCRC(fp->FrameData, needdatalen-HEADER_CRC_FIELD_WIDTH,
fp->FrameData+needdatalen-HEADER_CRC_FIELD_WIDTH))
{
fp->Error = TP_RET_CRC_ERR;
return;
}
fp->FrameData += 2; // jump to systime field
pf_memcpy(stream->SysConf.NitConf.SysTime, fp->FrameData, TP_NIT_SYSTIME_FIELD_WIDTH);
fp->FrameData += TP_NIT_SYSTIME_FIELD_WIDTH;
pf_memcpy(stream->SysConf.NitConf.CountryCode, fp->FrameData, TP_NIT_COUNTRYCODE_FIELD_WIDTH);
fp->FrameData += TP_NIT_COUNTRYCODE_FIELD_WIDTH;
stream->SysConf.NitConf.NetLevel = (*fp->FrameData)>>4;
stream->SysConf.NitConf.NetId = (((*fp->FrameData)&0x0f)<<4) + *(fp->FrameData+1);
fp->FrameData += 3; //2 byte net id and 1 byte net name length
pf_memcpy(stream->SysConf.NitConf.NetName, fp->FrameData, stream->SysConf.NitConf.NetNameLength);
fp->FrameData += stream->SysConf.NitConf.NetNameLength;
stream->SysConf.NitConf.FreqPointId = *fp->FrameData++;
stream->SysConf.NitConf.CentralFreq = *fp->FrameData++;
stream->SysConf.NitConf.CentralFreq <<= 8;
stream->SysConf.NitConf.CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.CentralFreq <<= 8;
stream->SysConf.NitConf.CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.CentralFreq <<= 8;
stream->SysConf.NitConf.CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.BandWidth = (*fp->FrameData) >> 4;
fp->FrameData++;
for (i=0; i<stream->SysConf.NitConf.OtherFreqPointNum; i++)
{
stream->SysConf.NitConf.OtherFreqPoint[i].FreqPointId = *fp->FrameData++;
stream->SysConf.NitConf.OtherFreqPoint[i].CentralFreq = *fp->FrameData++;
stream->SysConf.NitConf.OtherFreqPoint[i].CentralFreq <<= 8;
stream->SysConf.NitConf.OtherFreqPoint[i].CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.OtherFreqPoint[i].CentralFreq <<= 8;
stream->SysConf.NitConf.OtherFreqPoint[i].CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.OtherFreqPoint[i].CentralFreq <<= 8;
stream->SysConf.NitConf.OtherFreqPoint[i].CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.OtherFreqPoint[i].BandWidth = (*fp->FrameData++)>>4;
}
fp->FrameData++; // overleap nearnetnum
for (i=0; i<stream->SysConf.NitConf.NearNetNum; i++)
{
stream->SysConf.NitConf.NearNet[i].NetLevel = (*fp->FrameData) >> 4;
stream->SysConf.NitConf.NearNet[i].NetId = (((*fp->FrameData)&0x0F)<<4) + *(fp->FrameData+1);
fp->FrameData += 2;
stream->SysConf.NitConf.NearNet[i].FreqPoint.FreqPointId = *fp->FrameData++;
stream->SysConf.NitConf.NearNet[i].FreqPoint.CentralFreq = *fp->FrameData++;
stream->SysConf.NitConf.NearNet[i].FreqPoint.CentralFreq <<= 8;
stream->SysConf.NitConf.NearNet[i].FreqPoint.CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.NearNet[i].FreqPoint.CentralFreq <<= 8;
stream->SysConf.NitConf.NearNet[i].FreqPoint.CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.NearNet[i].FreqPoint.CentralFreq <<= 8;
stream->SysConf.NitConf.NearNet[i].FreqPoint.CentralFreq += *fp->FrameData++;
stream->SysConf.NitConf.NearNet[i].FreqPoint.BandWidth = (*fp->FrameData++)>>4;
}
stream->SysConf.NitConf.Updated = TRUE;
fp->FrameData += HEADER_CRC_FIELD_WIDTH;
fp->FrameDataLen -= needdatalen;
fp->ParserState = TP_FP_STATE_END;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetCsctSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_UINT8 *sernumP;
if (fp->FrameDataLen > CSCT_PART1_WIDTH)
{
sernumP = fp->FrameData+CSCT_PART1_WIDTH-2;
stream->SysConf.CsctConf.ServiceNum = (*sernumP<<8) + *(sernumP+1);
fp->CurUnitLen = CSCT_PART1_WIDTH+stream->SysConf.CsctConf.ServiceNum*CSCT_ONE_SERVICE_CONF_WIDTH;
fp->ParserState = TP_FP_STATE_GET_CSCT_CONTENT;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetCsctContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_INT i;
TP_SYS_SERVICE_T *priorserv,*curserv;
if (fp->FrameDataLen > fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH)
{
if (!CheckCRC(fp->FrameData, fp->CurUnitLen, fp->FrameData+fp->CurUnitLen))
{
fp->Error = TP_RET_CRC_ERR;
return;
}
fp->FrameData += CSCT_PART1_WIDTH; //jump to service config section
for (i=0; i<stream->SysConf.CsctConf.ServiceNum; i++)
{
curserv = (TP_SYS_SERVICE_T*)pf_alloc(sizeof(TP_SYS_SERVICE_T));
pf_memset(curserv, 0, sizeof(TP_SYS_SERVICE_T));
curserv->ServId = (*fp->FrameData<<8) + *(fp->FrameData+1);
fp->FrameData += 2;
curserv->FreqPointId = *fp->FrameData++;
if (i == 0)
stream->SysConf.CsctConf.Service = curserv;
else
priorserv->next = curserv;
priorserv = curserv;
}
stream->SysConf.CsctConf.Updated = TRUE;
stream->SysConf.CsctConf.State = TP_FRAME_DATA_STATE_READY;
fp->FrameData += HEADER_CRC_FIELD_WIDTH;
fp->FrameDataLen -= fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH;
fp->ParserState = TP_FP_STATE_END;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetSsctSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_UINT8 *sernumP;
if (fp->FrameDataLen > SSCT_PART1_WIDTH)
{
sernumP = fp->FrameData+SSCT_PART1_WIDTH-2;
stream->SysConf.SsctConf.ServiceNum = (*sernumP<<8) + *(sernumP+1);
fp->CurUnitLen = SSCT_PART1_WIDTH+stream->SysConf.SsctConf.ServiceNum*SSCT_ONE_SERVICE_CONF_WIDTH;
fp->ParserState = TP_FP_STATE_GET_SSCT_CONTENT;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetSsctContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_INT i;
TP_SYS_SERVICE_T *priorserv,*curserv;
if (fp->FrameDataLen > fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH)
{
if (!CheckCRC(fp->FrameData, fp->CurUnitLen, fp->FrameData+fp->CurUnitLen))
{
fp->Error = TP_RET_CRC_ERR;
return;
}
fp->FrameData += SSCT_PART1_WIDTH; //jump to service config section
for (i=0; i<stream->SysConf.SsctConf.ServiceNum; i++)
{
curserv = (TP_SYS_SERVICE_T*)pf_alloc(sizeof(TP_SYS_SERVICE_T));
pf_memset(curserv, 0, sizeof(TP_SYS_SERVICE_T));
curserv->ServId = (*fp->FrameData<<8) + *(fp->FrameData+1);
fp->FrameData += 2;
curserv->FreqPointId = *fp->FrameData++;
if (i == 0)
stream->SysConf.SsctConf.Service = curserv;
else
priorserv->next = curserv;
priorserv = curserv;
}
stream->SysConf.SsctConf.Updated = TRUE;
stream->SysConf.SsctConf.State = TP_FRAME_DATA_STATE_READY;
fp->FrameData += HEADER_CRC_FIELD_WIDTH;
fp->FrameDataLen -= fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH;
fp->ParserState = TP_FP_STATE_END;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetEsgdtSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
if (fp->FrameDataLen > ESGDT_PART1_WIDTH)
{
fp->CurUnitLen = ((*(fp->FrameData+1)&0x0f)<<8) + *(fp->FrameData+2);
fp->ParserState = TP_FP_STATE_GET_ESGDT_CONTENT;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetEsgdtContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_INT i,j;
TP_SYS_ESGDT_SERVICE_CONF_T *priorserv,*curserv;
TP_SYS_ESGDT_DATA_CONF_T *priordataconf,*curdataconf;
TP_SYS_ESGDT_DATA_BLOCK_CONF_T *priordatablockconf,*curdatablockconf;
if (fp->FrameDataLen > fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH)
{
if (!CheckCRC(fp->FrameData, fp->CurUnitLen, fp->FrameData+fp->CurUnitLen))
{
fp->Error = TP_RET_CRC_ERR;
return;
}
fp->FrameData += ESGDT_PART1_WIDTH+ESGDT_PART2_WIDTH; //jump to net level
stream->SysConf.EsgdtConf.NetLevel = *fp->FrameData >> 4;
stream->SysConf.EsgdtConf.NetId = ((*fp->FrameData&0x0f)<<8) + *(fp->FrameData+1);
fp->FrameData += 2;
stream->SysConf.EsgdtConf.LocalTimePolarity = (*fp->FrameData&0x20)>>5;
stream->SysConf.EsgdtConf.LocalTimeOffset = *fp->FrameData & 0x1F;
fp->FrameData++;
stream->SysConf.EsgdtConf.Charset = *fp->FrameData>>4;
stream->SysConf.EsgdtConf.ServConfNum = *fp->FrameData++ & 0x0F;
for(i=0; i<stream->SysConf.EsgdtConf.ServConfNum; i++)
{
curserv = pf_alloc(sizeof(TP_SYS_ESGDT_SERVICE_CONF_T));
pf_memset(curserv, 0, sizeof(TP_SYS_ESGDT_SERVICE_CONF_T));
curserv->EsgIndex = *fp->FrameData++ & 0x0F;
curserv->EsgServId = (*fp->FrameData<<8) + *fp->FrameData;
fp->FrameData += 2;
if (i == 0)
stream->SysConf.EsgdtConf.ServConf = curserv;
else
priorserv->next = curserv;
priorserv = curserv;
}
stream->SysConf.EsgdtConf.DataConfNum = *fp->FrameData++ & 0x0F;
for(i=0; i<stream->SysConf.EsgdtConf.DataConfNum; i++)
{
curdataconf = pf_alloc(sizeof(TP_SYS_ESGDT_DATA_CONF_T));
pf_memset(curserv, 0, sizeof(TP_SYS_ESGDT_DATA_CONF_T));
curdataconf->DataType = *fp->FrameData++ >> 4;
curdataconf->DataBlockNum = *fp->FrameData++;
for(j=0; j<curdataconf->DataBlockNum; j++)
{
curdatablockconf = pf_alloc(sizeof(TP_SYS_ESGDT_DATA_BLOCK_CONF_T));
pf_memset(curdatablockconf, 0, sizeof(TP_SYS_ESGDT_DATA_BLOCK_CONF_T));
curdatablockconf->BlockId = *fp->FrameData++;
curdatablockconf->BlockVer = *fp->FrameData >> 4;
curdatablockconf->EsgIndex = *fp->FrameData++ & 0x0f;
if (j == 0)
curdataconf->DataBlockConf = curdatablockconf;
else
priordatablockconf->next = curdatablockconf;
priordatablockconf = curdatablockconf;
}
if (i == 0)
stream->SysConf.EsgdtConf.DataConf = curdataconf;
else
priordataconf->next = curdataconf;
priordataconf = curdataconf;
}
stream->SysConf.EsgdtConf.Updated = TRUE;
stream->SysConf.EsgdtConf.State = TP_FRAME_DATA_STATE_READY;
fp->FrameData += HEADER_CRC_FIELD_WIDTH;
fp->FrameDataLen -= fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH;
fp->ParserState = TP_FP_STATE_END;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetEadtSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
if (fp->FrameDataLen > EADT_PART1_WIDTH)
{
fp->CurUnitLen = (*(fp->FrameData+1)<<8) + *(fp->FrameData+2);
fp->ParserState = TP_FP_STATE_GET_EADT_CONTENT;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetEadtContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_SYS_EADT_SERVICE_T *priorserv,*curserv;
TP_INT32 len;
if (fp->FrameDataLen > fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH)
{
if (!CheckCRC(fp->FrameData, fp->CurUnitLen, fp->FrameData+fp->CurUnitLen))
{
fp->Error = TP_RET_CRC_ERR;
return;
}
fp->FrameData += EADT_PART1_WIDTH+EADT_PART2_WIDTH; //jump to data position
stream->SysConf.EadtConf.Service = NULL;
len = fp->CurUnitLen - EADT_PART1_WIDTH - EADT_PART2_WIDTH;
while(len > 0)
{
curserv = pf_alloc(sizeof(TP_SYS_EADT_SERVICE_T));
pf_memset(curserv, 0, sizeof(TP_SYS_EADT_SERVICE_T));
curserv->CaId = (*fp->FrameData<<8) + *(fp->FrameData+1);
fp->FrameData += 2;
curserv->ServiceId = (*fp->FrameData<<8) + *(fp->FrameData+1);;
fp->FrameData += 2;
curserv->EmmDataType = *fp->FrameData++;
curserv->EcmDataType = *fp->FrameData++;
//curserv->EcmTransMode = *fp->FrameData >> 6;
fp->FrameData += EADT_ONE_SERVICE_RESERVE_WIDTH;
if (stream->SysConf.EadtConf.Service == NULL)
stream->SysConf.EadtConf.Service = curserv;
else
priorserv->next = curserv;
priorserv = curserv;
len -= EADT_ONE_SERVICE_CONF_WIDTH;
}
stream->SysConf.EadtConf.Updated = TRUE;
stream->SysConf.EadtConf.State = TP_FRAME_DATA_STATE_READY;
fp->FrameData += HEADER_CRC_FIELD_WIDTH;
fp->FrameDataLen -= fp->CurUnitLen+HEADER_CRC_FIELD_WIDTH;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?