From: Lauri Myllari Date: Mon, 12 Jan 2015 05:05:03 +0000 (-0800) Subject: dvb_psi: add ATSC STT parsing (no data is stored though) X-Git-Tag: v4.2.1~1820 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=abc6c38e838acd86834fce49c7c5b8e93b818d60;p=thirdparty%2Ftvheadend.git dvb_psi: add ATSC STT parsing (no data is stored though) --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 0f61f3cab..c156b3ea6 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -153,6 +153,7 @@ typedef struct mpegts_pid_sub #define MPS_WEIGHT_NIT 999 #define MPS_WEIGHT_BAT 999 #define MPS_WEIGHT_VCT 999 +#define MPS_WEIGHT_STT 999 #define MPS_WEIGHT_EIT 999 #define MPS_WEIGHT_PMT 998 #define MPS_WEIGHT_PCR 997 @@ -989,6 +990,8 @@ int dvb_tot_callback (struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid); int atsc_vct_callback (struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid); +int atsc_stt_callback + (struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid); void psi_tables_install (mpegts_input_t *mi, mpegts_mux_t *mm, dvb_fe_delivery_system_t delsys); diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index 9ca170ae9..1e1084991 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -48,6 +48,7 @@ struct mpegts_mux; #define DVB_DIT_PID 0x1E #define DVB_SIT_PID 0x1F #define DVB_VCT_PID 0x1FFB +#define DVB_ATSC_STT_PID 0x1FFB #define DVB_ATSC_MGT_PID 0x1FFB /* Tables */ @@ -93,6 +94,9 @@ struct mpegts_mux; #define DVB_ATSC_ETT_BASE 0xCC #define DVB_ATSC_ETT_MASK 0xFF +#define DVB_ATSC_STT_BASE 0xCD +#define DVB_ATSC_STT_MASK 0xFF + #define DVB_TELETEXT_BASE 0x2000 /* Descriptors */ diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 32288a1a1..105b20681 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -1718,6 +1718,39 @@ next: return dvb_table_end((mpegts_psi_table_t *)mt, st, sect); } +/* + * ATSC STT processing + */ +int +atsc_stt_callback + (mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid) +{ + int r, sect, last, ver, extraid; + uint32_t systemtime, gps_utc_offset; + int is_dst; + mpegts_table_state_t *st = NULL; + + /* Validate */ + if (tableid != DVB_ATSC_STT_BASE) return -1; + + /* Extra ID */ + extraid = ptr[0] << 8 | ptr[1]; + + /* Begin */ + r = dvb_table_begin(mt, ptr, len, tableid, extraid, 7, + &st, §, &last, &ver); + if (r != 1) return r; + + /* Parse fields */ + systemtime = ptr[6] << 24 | ptr[7] << 16 | ptr[8] << 8 | ptr[9]; + gps_utc_offset = ptr[10]; + is_dst = ptr[11] >> 7; + + tvhdebug("stt", "system_time %d, gps_utc_offset %d, is DST %d", + systemtime, gps_utc_offset, is_dst); + + return dvb_table_end(mt, st, sect); +} /* * DVB BAT processing @@ -2490,6 +2523,9 @@ psi_tables_atsc_c ( mpegts_mux_t *mm ) mpegts_table_add(mm, DVB_VCT_C_BASE, DVB_VCT_MASK, atsc_vct_callback, NULL, "vct", MT_QUICKREQ | MT_CRC | MT_RECORD, DVB_VCT_PID, MPS_WEIGHT_VCT); + mpegts_table_add(mm, DVB_ATSC_STT_BASE, DVB_ATSC_STT_MASK, atsc_stt_callback, + NULL, "stt", MT_QUICKREQ | MT_CRC | MT_RECORD, + DVB_ATSC_STT_PID, MPS_WEIGHT_STT); } static void @@ -2498,6 +2534,9 @@ psi_tables_atsc_t ( mpegts_mux_t *mm ) mpegts_table_add(mm, DVB_VCT_T_BASE, DVB_VCT_MASK, atsc_vct_callback, NULL, "vct", MT_QUICKREQ | MT_CRC | MT_RECORD, DVB_VCT_PID, MPS_WEIGHT_VCT); + mpegts_table_add(mm, DVB_ATSC_STT_BASE, DVB_ATSC_STT_MASK, atsc_stt_callback, + NULL, "stt", MT_QUICKREQ | MT_CRC | MT_RECORD, + DVB_ATSC_STT_PID, MPS_WEIGHT_STT); } void