int32 BCD_Seconds(u_int32 _time)
{
u_int32 temp;
u_int32 hour, minute, second;
temp = bcdint_to_int(_time&0xffffff, 6, 6, 1);
hour = temp/10000;
minute = temp/100 - hour*100;
second = temp - hour*10000 - minute*100;
temp = hour*3600 + minute*60 + second;
return (temp);
}
/* si_parser_sdt_analyse */
/*************************************************************************************/
/* */
/* */
/* */
/* */
/* */
/* */
/*************************************************************************************/
int32 MJD_year_month_day(u_int32 date)
{
u_int32 month, day;
u_int32 temp, year;
u_int32 temp1;
temp = (u_int32)date;
year = (temp*100 - 1507820)/36525;
temp1 = year*36525/100;
month = (temp*10 - 149561 - temp1*10)/306.001;
day = temp - 14956 - temp1 - (month*306001/10000);
if((month == 14) || (month == 15))
{
year++;
month = month -1 - 12;
}
else
month--;
year += 1900;
return ((year&0xffff)<<16 | (month&0xff)<<8 | (day&0xff));
}
/* si_parser_eit_analyse */
/****************************************************************************/
/* FUNCTION: si_parser_tdt_analyse */
/* */
/* DESCRIPTION: */
/* */
/* INPUTS: */
/* */
/* OUTPUTS: */
/* */
/* RETURNS: */
/* */
/* NOTES: NONE */
/* */
/* CONTEXT: Must be called from a non-interrupt context. */
/* */
/****************************************************************************/
static SI_STATUS si_parser_tdt_analyse (
SI_TDT_HANDLE hTDT,
u_int32 uLen,
u_int8 * pData
)
{
PTR_TDT_TABLE pTDT = (PTR_TDT_TABLE)(hTDT);
u_int8 * pBuffer = pData;
TDT_INFO * pInfo;
u_int8 tbl_id, sct_syntax_indicator;
u_int16 sct_length;
u_int32 date;
START_TIME _time;
SI_PARSER_HANDLE handle;
if ((NULL == pTDT) || (uLen < 8) || (NULL == pBuffer))
{
return (SI_ERROR);
}
/* analyse the header of the section: total 8 bytes */
tbl_id = *pBuffer++;
sct_syntax_indicator = (*pBuffer & 0x80);
sct_length = (*pBuffer++ & 0x0F) << 8;
sct_length |= *pBuffer++;
/* check the header information of the section. */
if ((tbl_id != TID_MPEG2_TDT) || (sct_syntax_indicator != 0x00) ||
(sct_length > 5) || ((sct_length + 3) != (u_int16)uLen))
{
return (SI_ERROR);
}
pInfo = &(pTDT->sTDTInfo);
pInfo->UTC_date = (*pBuffer++ ) << 8;
pInfo->UTC_date |= *pBuffer++;
pInfo->UTC_time = (*pBuffer++ ) <<16;
pInfo->UTC_time |= (*pBuffer++ ) << 8;
pInfo->UTC_time |= *pBuffer;
date = MJD_year_month_day(pInfo->UTC_date);
_time.year = date>>16 & 0xffff;
_time.month = date>>8 & 0xff;
_time.day = date & 0xff;
_time.time.seconds = BCD_Seconds((u_int32)(pInfo->UTC_time)&0xffffff);
if (NULL != pTDT->pfCbSection)
{
pTDT->pfCbSection ();
}
if (NULL != pTDT->pfCbSingleSection)
{
/* fixme, other method shoud be called to get si_parser handle */
handle = (SI_PARSER_HANDLE)(&siParser);
pTDT->pfCbSingleSection(handle, &_time);
}
return (SI_OK);
}