#ifndef __PARSER_DVB_H__ #define __PARSER_DVB_H__ #include "blst_list.h" #include "ch_map.h" #include "getbits.h" /* TODO:: Scheduled event parsing ... */ /* based on en_300468 */ #define DVB_PID_NIT 0x10 #define DVB_PID_SDT 0x11 #define DVB_PID_EIT 0x12 #define DVB_PID_TDT 0x14 #define DVB_PID_BAT 0x11 /* table id definition */ #define DVB_TID_NIT_ACT 0x40 #define DVB_TID_NIT_OTH 0x41 #define DVB_TID_SDT_ACT 0x42 /* service_description_section - actual_transport_stream */ #define DVB_TID_SDT_OTH 0x46 /* service_description_section - other_transport_stream */ #define DVB_TID_EIT_ACT 0x4E #define DVB_TID_EIT_OTH 0x4F #define DVB_TID_EIT_SCH_ACT 0x50 #define DVB_TID_EIT_SCH_OTH 0x60 #define DVB_TID_TIME_DATE 0x70 #define DVB_TID_TIME_OFFSET 0x73 #define DVB_TID_BAT 0x4A #define DVB_TID_SIT 0x7F #define DVB_TID_DIT 0x7E #define DVB_TID_RST 0x71 #define DVB_TID_STUFF 0x72 #define DVB_SDT_LEN 11 /* except descriptor+crc */ #define DVB_SDT_DESCR_LEN 5 #define DVB_EIT_LEN 11 /* descriptor tag */ #define DVB_DESC_TAG_NETWORK_NAME 0x40 #define DVB_DESC_TAG #define DVB_DESC_TAG_SERVICE #define MAX_NAME_LEN 30 #define MAX_EVENT_NAME 96 // sync with MAX_TITLE_CHARS #define MAX_EVENT_TEXT 256 // sync with MAX_DESC_CHARS #define MAX_SERVICE_LIST 30 typedef struct sdt_t { uint32_t frequency; uint16_t stream_id; /* transport stream id */ uint16_t service_id; /* 16 bit service id which is program number in PMT */ uint8_t eit_schedule_flag:1; /* EIT schedule information is present */ uint8_t eit_pf_flag:1; /* EIT present/following service is present */ uint8_t running_status:3; /* 0: undefined, 1:not running, 2:start in a few seconds, 3:pausing, 4:running */ uint8_t free_ca_mode:1; /* 0: not scrambled, 1: controlled by CA system */ uint8_t service_type; /* service type. table 72. */ uint8_t provider_name[MAX_NAME_LEN]; uint8_t service_name[MAX_NAME_LEN]; } sdt_t; typedef struct nit_t { uint16_t stream_id; uint8_t type; uint32_t frequency; uint8_t modulation; uint8_t bandwidth; uint32_t symbol_rate; uint8_t code_rate; uint8_t program_cnt; uint16_t program_id[MAX_SERVICE_LIST]; } nit_t; typedef struct nit_map_t { uint16_t num_nit; nit_t nit[MAX_FREQ_MAP]; } nit_map_t; typedef struct dvb_sdt_cb_t { void (*cb)(sdt_t *sdt, void *data); void *data; } dvb_sdt_cb_t; typedef struct dvb_nit_cb_t { void (*cb)(nit_t *nit, void *data); void *data; } dvb_nit_cb_t; typedef struct sdt_map_t { uint16_t num_sdt; sdt_t sdt[MAX_VCH]; } sdt_map_t; typedef struct eit_t { /* following 5 sequence should be matched with chm_eit_t in bapp.h */ uint32_t start_time; uint32_t duration; uint16_t event_id; uint8_t event_name[MAX_EVENT_NAME+1]; uint8_t event_text[MAX_EVENT_TEXT+1]; uint8_t running_status:3; uint8_t free_ca_mode:1; uint8_t rating_code[3]; uint8_t rating_age; } eit_t; #define MAX_EIT (MAX_VCH*2) typedef struct eit_entry_t { BLST_D_ENTRY(eit_entry_t) link; uint16_t service_id; uint16_t stream_id; uint8_t version; uint32_t section_mask[8]; eit_t eit_present; eit_t eit_following; } eit_entry_t; typedef struct eit_entry_list { BLST_D_HEAD(eitlist, eit_entry_t) list; } eit_entry_list; typedef struct eit_map_t { uint16_t num_eit; eit_entry_list eit_list; } eit_map_t; #define MAX_SCHED_ENTRY 30 typedef struct eit_sched_entry_t { BLST_D_ENTRY(eit_sched_entry_t) link; uint16_t service_id; uint16_t stream_id; uint8_t version[16]; uint8_t count; uint32_t section_mask[16][8]; eit_t eit_sched[MAX_SCHED_ENTRY]; } eit_sched_entry_t; typedef struct eit_sched_entry_list { BLST_D_HEAD(eitschedlist, eit_sched_entry_t) list; } eit_sched_entry_list; typedef struct eit_sched_map_t { uint16_t num_eit; eit_sched_entry_list eit_list; } eit_sched_map_t; #define MAX_TIMEOFFSET 10 typedef struct tot_t { uint8_t country[3]; uint8_t region_id; uint8_t polarity; uint16_t offset; uint32_t toc; uint16_t next_offset; } tot_t; typedef struct tot_map_t { uint8_t num_tot; tot_t tot[MAX_TIMEOFFSET]; } tot_map_t; #ifdef LINUX #define MJD_START 40587 #else #define MJD_START 44244 #endif #define MJD_TO_TIME(x,y) (((x<<8| y)-MJD_START)*86400) #define BCD_TO_SEC(h,m,s) ((3600 * ((10*((h & 0xF0)>>4)) + (h & 0xF))) + \ (60 * ((10*((m & 0xF0)>>4)) + (m & 0xF))) + \ ((10*((s & 0xF0)>>4)) + (s & 0xF))) #define BCD_TO_MIN(h,m) ((60*((10*((h&0xF0)>>4))+(h&0xF))) + \ ((10*((m&0xF0)>>4))+(m&0xF))) uint32_t dvb_find_frequency_for_stream_id(uint16_t stream_id); void dvb_nit_init(dvb_nit_cb_t *cb); void dvb_sdt_init(dvb_sdt_cb_t *cb); void dvb_tdt_init(void); void dvb_eit_init(void); bool dvb_sdt_complete(int num_stream); bool dvb_nit_complete(void); int dvb_nit_parse(const uint8_t *nit_buf, size_t *psize); int dvb_sdt_parse(const uint8_t *nit_buf, size_t *psize); int dvb_eit_parse(const uint8_t *eit_buf, size_t *psize); int dvb_tdt_parse(const uint8_t *nit_buf, size_t *psize); //void dvb_get_current_event(vch_t vch, int *eit_cnt, eit_t *p_eit_cur, eit_t *p_eit_next); void dvb_get_current_event(vch_t vch, int *eit_cnt, eit_t *p_eit); uint32_t dvb_get_cur_time(void); void dvb_parse_descriptors(uint8_t *buf, uint16_t length, uint8_t table_id, void *entry); eit_entry_t *dvb_eit_get_entry(uint16_t stream_id, uint16_t service_id); eit_sched_entry_t *dvb_eit_get_sched_entry(uint16_t stream_id, uint16_t service_id); #endif