frameparser.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,611 行 · 第 1/5 页
C
1,611 行
/******************************************************************************
** *
** File Name: frameparser.c *
** Copyright: 2007-2008 Telepath Technologies Corp. All rights reserved.*
** Version: 1.1 *
** Description: Digital TV Sub multiplex Frame Parser. *
** *
*******************************************************************************
*******************************************************************************
** Edit History *
** ------------------------------------------------------------------------- *
** DATE NAME DESCRIPTION *
** 9/21/2007 pxd Create. *
*******************************************************************************/
/*----------------------------------------------------------------------------*
** Dependencies *
**----------------------------------------------------------------------------*/
#include "platform.h"
#include "tpapi.h"
#include "crc32table.h"
#include "frameparser.h"
/*----------------------------------------------------------------------------*
** Debugging Flag *
**----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*
** Compiler Flag *
**----------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C"
{
#endif
/*----------------------------------------------------------------------------*
** Macro Define *
**----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*
** Data Structures *
**----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*
** Local Function Declare *
**----------------------------------------------------------------------------*/
TP_BOOL FindFrameStartTag(FRAME_PARSER_T *fp);
VOID GetFrameStartTag(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetFrameType(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// NIT
VOID GetNitNetNameLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetNitOtherFreqPointNum(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetNitNearNetNum(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetNitContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// CSCT
VOID GetCsctSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetCsctContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// SSCT
VOID GetSsctSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetSsctContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// ESGDT
VOID GetEsgdtSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetEsgdtContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// EADT
VOID GetEadtSectionLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetEadtContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// EB
VOID GetEbDataLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetEbData(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// Multiplex Subframe Header
VOID GetFrameHeaderLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetFrameHeaderContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetFrameHeaderExtend(FRAME_PARSER_T *fp, TP_STREAM_PARAM_T *streamparam);
// Multiplex Subframe Video
VOID GetVideoDataHeaderLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetVideoDataHeader(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetVideoDataHeaderContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetVideoDataContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// Multiplex Subframe Audio
VOID GetAudioDataHeaderUnitnum(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetAudioDataHeader(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetAudioDataHeaderContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetAudioDataContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
// Multiplex Subframe Other
VOID GetOtherDataHeaderUnitNum(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetOtherDataHeader(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID GetOtherDataContent(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
VOID FrameEnd(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream);
TP_BOOL CmpStreamParam(TP_STREAM_PARAM_T *src, TP_STREAM_PARAM_T *dst);
TP_BOOL CheckCRC(TP_UINT8 *str, TP_UINT32 slen, TP_UINT8 *crcstr);
/*----------------------------------------------------------------------------*
** Local Variant Declare *
**----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*
** Global Variant Declare *
**----------------------------------------------------------------------------*/
CONST TP_UINT8 Language_Tab[TP_LANGUAGE_TYPE_MAX][3]=
{"chi", "en"};
FRAME_PARSER_T FrameParser;
CONST TP_STATE_FUNC StateFunc[TP_FP_STATE_MAX]=
{
GetFrameStartTag,
GetFrameType, // TP_FP_STATE_GET_FRAME_TYPE,
// NIT
GetNitNetNameLength, // TP_FP_STATE_GET_NIT_NET_NAME_LENGTH,
GetNitOtherFreqPointNum, //TP_FP_STATE_GET_NIT_OTHERFREQPOINT_NUM,
GetNitNearNetNum, //TP_FP_STATE_GET_NIT_NEAR_NET_NUM,
GetNitContent, //TP_FP_STATE_GET_NIT_CONTENT,
// CSCT
GetCsctSectionLength, //TP_FP_STATE_GET_CSCT_SECTION_LENGTH,
GetCsctContent, //TP_FP_STATE_GET_CSCT_CONTENT,
// SSCT
GetSsctSectionLength, //TP_FP_STATE_GET_SSCT_SECTION_LENGTH,
GetSsctContent, //TP_FP_STATE_GET_SSCT_CONTENT,
// ESGDT
GetEsgdtSectionLength, //TP_FP_STATE_GET_ESGDT_SECTION_LENGTH,
GetEsgdtContent, //TP_FP_STATE_GET_ESGDT_CONTENT,
// EADT
GetEadtSectionLength, //TP_FP_STATE_GET_EADT_SECTION_LENGTH,
GetEadtContent, //TP_FP_STATE_GET_EADT_CONTENT,
// EB
GetEbDataLength, //TP_FP_STATE_GET_EB_DATA_LENGTH,
GetEbData, //TP_FP_STATE_GET_EB_DATA,
// multiplex subframe header State
GetFrameHeaderLength, // TP_FP_STATE_GET_HEADER_LENGTH ,
GetFrameHeaderContent, // TP_FP_STATE_GET_HEADER_CONTENT,
// Video State
GetVideoDataHeaderLength, // TP_FP_STATE_GET_VIDEO_DATA_HEADER_LENGTH,
GetVideoDataHeader, // TP_FP_STATE_GET_VIDEO_DATA_HEADER,
GetVideoDataHeaderContent,// TP_FP_STATE_GET_VIDEO_DATA_HEADER_CONTENT,
GetVideoDataContent,// TP_FP_STATE_GET_VIDEO_DATA,
// Audio State
GetAudioDataHeaderUnitnum,// TP_FP_STATE_GET_AUDIO_DATA_HEADER_UNITNUM,
GetAudioDataHeader,// TP_FP_STATE_GET_AUDIO_DATA_HEADER,
GetAudioDataHeaderContent, // TP_FP_STATE_GET_AUDIO_DATA_HEADER_CONTENT,
GetAudioDataContent,// TP_FP_STATE_GET_AUDIO_DATA,
// Other data State
GetOtherDataHeaderUnitNum,// TP_FP_STATE_GET_OTHER_DATA_HEADER_UNITNUM,
GetOtherDataHeader,// TP_FP_STATE_GET_OTHER_DATA_HEADER,
GetOtherDataContent,// TP_FP_STATE_GET_OTHER_DATA,
FrameEnd,// TP_FP_STATE_END
};
/*----------------------------------------------------------------------------*
** Function Prototype *
**----------------------------------------------------------------------------*/
/******************************************************************************
* FrameParserClean *
* Description: Stop TV. *
* Input: *
* fp: frame parser structure *
* Output: *
* fp: frame parser structure *
* fp->Error: frame parser error *
* Return: *
* None *
* Note: *
* None *
*******************************************************************************/
VOID FrameParserClean(FRAME_PARSER_T *fp)
{
fp->HeaderLength = 0;
pf_memset(&fp->HeaderTag, 0, sizeof(HEADER_TAG_T));
fp->VideoFieldLength = 0;
fp->VideoStreamTotal = 0;
fp->AudioFieldLength = 0;
fp->AudioStreamTotal = 0;
fp->OtherFieldLength = 0;
fp->VideoDataHeaderLength = 0;
fp->VideoDataHeader = 0;
fp->CurUnitLen = 0;
fp->CurAudioFrame = 0;
fp->AudioUnitNum = 0;
fp->AudioDataHeader = 0;
fp->OtherUnitNum = 0;
fp->CurOtherFrame = NULL;
fp->Error = TP_RET_SUC;
fp->ParserState = TP_FP_STATE_GET_FRAME_START;
}
TP_BOOL FindFrameStartTag(FRAME_PARSER_T *fp)
{
TP_UINT32 i,maxval;
maxval = fp->FrameDataLen-(FRAME_START_FIELD_WIDTH-1);
for(i=0; i<maxval; i++)
{
if (pf_memcmp(fp->FrameData+i, FRAME_START_TAG, FRAME_START_FIELD_WIDTH)==0)
{
fp->FrameData += i+FRAME_START_FIELD_WIDTH;
fp->FrameDataLen -= i+FRAME_START_FIELD_WIDTH;
return TRUE;
}
}
fp->FrameData += fp->FrameDataLen-(FRAME_START_FIELD_WIDTH-1);
fp->FrameDataLen = (FRAME_START_FIELD_WIDTH-1);
return FALSE;
}
VOID GetFrameStartTag(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
if (fp->FrameDataLen > FRAME_START_FIELD_WIDTH)
{
if (FindFrameStartTag(fp))
fp->ParserState = TP_FP_STATE_GET_FRAME_TYPE;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetFrameType(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
#ifdef DEBUG_USE_FULL_MULTIPLEX_FRAME_DATA
if (fp->FrameDataLen > FRAME_TYPE_FIELD_WIDTH)
{
fp->ParserState = TP_FP_STATE_GET_HEADER_LENGTH;
fp->FrameDataLen -= *fp->FrameData;
fp->multiplexcount = (*(fp->FrameData+7)&0x0f) - 1;
fp->FrameData += *fp->FrameData;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
#else //DEBUG_USE_FULL_MULTIPLEX_FRAME_DATA
FRAME_TYPE_E frametype;
FRAME_CTRL_INFO_SUB_TYPE_E subtype;
if (fp->FrameDataLen >= FRAME_TYPE_FIELD_WIDTH)
{
frametype = *fp->FrameData;
if (frametype == FRAME_TYPE_CONTROL_INFO)
{
subtype = (*(fp->FrameData+1)<<8) + *(fp->FrameData+2);
switch(subtype)
{
case FRAME_CTRL_INFO_SUB_TYPE_NIT:
fp->ParserState = TP_FP_STATE_GET_NIT_NET_NAME_LENGTH;
break;
case FRAME_CTRL_INFO_SUB_TYPE_CSCT:
fp->ParserState = TP_FP_STATE_GET_CSCT_SECTION_LENGTH;
break;
case FRAME_CTRL_INFO_SUB_TYPE_SST:
fp->ParserState = TP_FP_STATE_GET_SSCT_SECTION_LENGTH;
break;
case FRAME_CTRL_INFO_SUB_TYPE_ESGDT:
fp->ParserState = TP_FP_STATE_GET_ESGDT_SECTION_LENGTH;
break;
case FRAME_CTRL_INFO_SUB_TYPE_EADT:
fp->ParserState = TP_FP_STATE_GET_EADT_SECTION_LENGTH;
break;
case FRAME_CTRL_INFO_SUB_TYPE_EB:
fp->ParserState = TP_FP_STATE_GET_EB_DATA_LENGTH;
break;
default:
fp->ParserState = TP_FP_STATE_GET_FRAME_START;
return;
}
}
else if (frametype == FRAME_TYPE_COMMAND_RESPONSE)
{
fp->ParserState = TP_FP_STATE_GET_FRAME_START;
fp->CmdResponse = *(fp->FrameData+1);
fp->CmdResult = *(fp->FrameData+2);
pf_memcpy(fp->CmdResData, fp->FrameData+3, COMMAND_RESPONSE_DATA_MAX_SIZE);
fp->ParserState = TP_FP_STATE_END;
}
else
fp->ParserState = TP_FP_STATE_GET_HEADER_LENGTH;
fp->FrameData += FRAME_TYPE_FIELD_WIDTH;
fp->FrameDataLen -= FRAME_TYPE_FIELD_WIDTH;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
#endif
}
VOID GetNitNetNameLength(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
if (fp->FrameDataLen > NIT_PART1_WIDTH)
{
stream->SysConf.NitConf.NetNameLength = *(fp->FrameData+NIT_PART1_WIDTH-1);
fp->ParserState = TP_FP_STATE_GET_NIT_OTHERFREQPOINT_NUM;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetNitOtherFreqPointNum(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_INT needdatalen;
needdatalen = NIT_PART1_WIDTH+stream->SysConf.NitConf.NetNameLength+NIT_PART2_WIDTH;
if (fp->FrameDataLen > needdatalen)
{
stream->SysConf.NitConf.OtherFreqPointNum = *(fp->FrameData+needdatalen-1)&0x0F;
fp->ParserState = TP_FP_STATE_GET_NIT_NEAR_NET_NUM;
}
else
fp->Error = TP_RET_DATA_NONE_ERR;
}
VOID GetNitNearNetNum(FRAME_PARSER_T *fp, TP_DTV_STREAM_T *stream)
{
TP_INT needdatalen;
needdatalen = NIT_PART1_WIDTH+stream->SysConf.NitConf.NetNameLength+NIT_PART2_WIDTH
+stream->SysConf.NitConf.OtherFreqPointNum*NIT_OTHER_FREQPOINT_PARAM_WIDTH
+NIT_PART3_WIDTH;
if (fp->FrameDataLen > needdatalen)
{
stream->SysConf.NitConf.NearNetNum = *(fp->FrameData+needdatalen-1)>>4;
fp->ParserState = TP_FP_STATE_GET_NIT_CONTENT;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?