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