/*************************************************************************** * 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 "ts_priv.h" #include "ts_psi.h" #include "ministd.h" #include "dvb_parser.h" #include "si.h" #include "si_util.h" BDBG_MODULE(dvb_sdt); #define MAX_NUM_STREAM 32 static uint8_t sdt_stream_cnt ; static uint16_t sdt_stream_id[MAX_NUM_STREAM]; static uint8_t sdt_version_num[MAX_NUM_STREAM]; static uint8_t sdt_last_section[MAX_NUM_STREAM]; static uint32_t sdt_section_mask[MAX_NUM_STREAM][8]; static sdt_map_t sdt_map; static dvb_sdt_cb_t *sdt_cb = NULL; #ifdef BCM_DEBUG static void dump_sdt_map(void); #endif void dvb_sdt_init(dvb_sdt_cb_t *cb) { int i,j; sdt_cb = cb; BKNI_Memset(&sdt_map, 0, sizeof(sdt_map)); sdt_stream_cnt = 0; for (i=0; i%d: stream_id:%x", sdt_version_num[st_idx], version_num, stream_id)); /* TODO:: update (not from initial value ) */ sdt_version_num[st_idx] = version_num; SI_Set_Section_mask((unsigned long *)sdt_section_mask[st_idx], section_number); data_len = section_len + 3 - DVB_SDT_LEN - 4; /* crc */ /* services */ while (data_len>0) { p_sdt = &sdt_map.sdt[sdt_map.num_sdt]; BKNI_Memset(p_sdt, 0, sizeof(sdt_t)); p_sdt->stream_id = stream_id; p_sdt->service_id = get_bits(16, &bs); get_bits(6, &bs); /* skip reserved_future_use */ p_sdt->eit_schedule_flag = get_bits(1, &bs); p_sdt->eit_pf_flag = get_bits(1, &bs); p_sdt->running_status = get_bits(3, &bs); p_sdt->free_ca_mode = get_bits(1, &bs); desc_loop_len = get_bits(12, &bs); BDBG_MSG(("SDT [%d] service_id-0x%x, eit_sched:%d, eit_pf:%d, running:%d, ca:%d", sdt_map.num_sdt, p_sdt->service_id, p_sdt->eit_schedule_flag, p_sdt->eit_pf_flag, p_sdt->running_status, p_sdt->free_ca_mode)); p_sdt->frequency = dvb_find_frequency_for_stream_id(stream_id); if (p_sdt->frequency) { dvb_parse_descriptors((uint8_t *)&sdt_buf[bs.bindex/8], desc_loop_len, DVB_TID_SDT_ACT, p_sdt); bs.bindex = bs.bindex + desc_loop_len*8; data_len -= desc_loop_len + DVB_SDT_DESCR_LEN; sdt_map.num_sdt++; if (sdt_cb && sdt_cb->cb) { sdt_cb->cb(p_sdt, sdt_cb->data); } } else { BDBG_WRN(("Frequency entry wasn't defined..")); bs.bindex = bs.bindex + desc_loop_len*8; data_len -= desc_loop_len + DVB_SDT_DESCR_LEN; } } #ifdef BCM_DEBUG dump_sdt_map(); #endif /* crc */ BDBG_MSG(("%s: leave", __func__)); return 1; } bool dvb_sdt_complete(int num_stream) { int i; int result; if (sdt_stream_cnt < num_stream) { /* sdt info for all streams are not delivered yet */ return false; } for (i=0; i