tdt段分析

来源:互联网 发布:淘打软件官网 编辑:程序博客网 时间:2024/04/29 04:48

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);
}