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 + -
显示快捷键?