/*************************************************************************** * Copyright (c) 2011, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: * * Revision History: * * $brcm_Log: $ * ****************************************************************************/ #include "bstd.h" #include "bkni.h" #include "dvb_parser.h" static uint32_t tdt_cur_time; static tot_map_t tot_map; BDBG_MODULE(dvb_tdt); void dvb_tdt_init(void) { tdt_cur_time = 0; BKNI_Memset(&tot_map, 0, sizeof(tot_map_t)); } int dvb_tdt_parse(const uint8_t *tdt_buf, size_t *psize) { uint16_t section_len, desc_len, idx; uint8_t tid; struct bit_state_t bs; BDBG_ASSERT((tdt_buf&&psize)); BDBG_MSG(("%s: enter (%x)", __FUNCTION__, tid)); bs.bindex = 0; bs.data = (unsigned char *)tdt_buf; tid = get_bits(8, &bs); if ((tid != DVB_TID_TIME_DATE) && (tid != DVB_TID_TIME_OFFSET)) { BDBG_WRN(("%s: only time_date and offset are processing (0x%x)", __FUNCTION__, tid)); return 0; } get_bits(4, &bs); /* skip section_syntax_indicator, reserved */ section_len = get_bits(12, &bs); if (*psize < (section_len+3)) { BDBG_WRN(("%s: invalid TDT/TOT table", __FUNCTION__)); return 0; } idx = bs.bindex/8; tdt_cur_time = MJD_TO_TIME(tdt_buf[idx], tdt_buf[idx+1]) + BCD_TO_SEC(tdt_buf[idx+2], tdt_buf[idx+3], tdt_buf[idx+4]); bs.bindex += 40; if ( tid == DVB_TID_TIME_OFFSET ) { get_bits(4, &bs); /* skip reserved */ desc_len = get_bits(12, &bs); /* TODO: how to apply time_offset value into system time */ dvb_parse_descriptors((uint8_t *)&tdt_buf[bs.bindex/8], desc_len, DVB_TID_TIME_OFFSET, (void *)&tot_map); } if (tid == DVB_TID_TIME_DATE) return 1; else { return 0; } } uint32_t dvb_get_cur_time(void) { return tdt_cur_time; } /* * convert MJD (modified julian date) to Y/M/D format * convert is applicable between the inclusive dates 1900 March 1 to 2100 February 28 * * year: from 1900 */ static void dvb_mjd_to_ymd(uint16_t mjd, int *year, int *month, int *day) { uint32_t y_delta, m_delta, k; y_delta = (int)((double)(mjd-15078.2)/(double)365.25); m_delta = (int)((double)((double)mjd-14956.1-(int)((double)y_delta*365.25))/30.6001); *day = mjd-14956 - (int)((double)y_delta*365.25) - (int)((double)m_delta*30.6001); if (m_delta == 14 || m_delta == 15) k = 1; else k = 0; *year = y_delta + k - 80; // in DVB from 1900, b_tm from 1980 *month = m_delta -1 - k*12 - 1; // in DVB 1-12, b_tm (0-11) }