}
'
+check_cc_snippet stime '
+#include <time.h>
+#define TEST test
+int test(void)
+{
+ time_t t = 1;
+ stime(&t);
+ return 0;
+}
+'
+
check_cc_snippet recvmmsg '
#define _GNU_SOURCE
#include <stdlib.h>
#define MPS_WEIGHT_RAW 400
#define MPS_WEIGHT_NIT2 300
#define MPS_WEIGHT_SDT2 300
+#define MPS_WEIGHT_TDT 101
#define MPS_WEIGHT_PMT_SCAN 100
int mps_weight;
void *mps_owner;
(struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid);
int dvb_tdt_callback
(struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid);
+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);
#define DVB_PAT_PID 0x00
#define DVB_CAT_PID 0x01
+#define DVB_TSDT_PID 0x02
#define DVB_NIT_PID 0x10
#define DVB_SDT_PID 0x11
#define DVB_BAT_PID 0x11
#define DVB_EIT_PID 0x12
+#define DVB_RST_PID 0x13
+#define DVB_TDT_PID 0x14
+#define DVB_SNC_PID 0x15
+#define DVB_RNT_PID 0x16
+#define DVB_INB_PID 0x1C
+#define DVB_MSR_PID 0x1D
+#define DVB_DIT_PID 0x1E
+#define DVB_SIT_PID 0x1F
#define DVB_VCT_PID 0x1FFB
/* Tables */
#define DVB_BAT_BASE 0x48
#define DVB_BAT_MASK 0xF8
+#define DVB_TDT_BASE 0x70
+#define DVB_TDT_MASK 0xFF
+
+#define DVB_TOT_BASE 0x73
+#define DVB_TOT_MASK 0xFF
+
#define DVB_FASTSCAN_NIT_BASE 0xBC
#define DVB_FASTSCAN_SDT_BASE 0xBD
#define DVB_FASTSCAN_MASK 0xFF
#include "bouquet.h"
#include "fastscan.h"
#include "descrambler/dvbcam.h"
+#include "tvhtime.h"
#include <assert.h>
#include <stdio.h>
return ret;
}
+/**
+ * TDT parser, from ISO 13818-1 and ETSI EN 300 468
+ */
+
+static void dvb_time_update(const uint8_t *ptr, const char *srcname)
+{
+ static time_t dvb_last_update = 0;
+ time_t t;
+ if (dvb_last_update + 1800 < dispatch_clock) {
+ t = dvb_convert_date(ptr, 0);
+ tvhtime_update(t, srcname);
+ dvb_last_update = dispatch_clock;
+ }
+}
+
+int
+dvb_tdt_callback
+ (mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid)
+{
+ if (len == 5) {
+ dvb_time_update(ptr, "TDT");
+ mt->mt_incomplete = 0;
+ mt->mt_complete = 1;
+ mt->mt_finished = 1;
+ }
+ return 0;
+}
+
+/**
+ * TOT parser, from ISO 13818-1 and ETSI EN 300 468
+ */
+int
+dvb_tot_callback
+ (mpegts_table_t *mt, const uint8_t *ptr, int len, int tableid)
+{
+ if (len >= 5) {
+ dvb_time_update(ptr, "TOT");
+ mt->mt_incomplete = 0;
+ mt->mt_complete = 1;
+ mt->mt_finished = 1;
+ }
+ return 0;
+}
+
/*
* Install default table sets
*/
DVB_SDT_PID, MPS_WEIGHT_SDT);
mpegts_table_add(mm, DVB_BAT_BASE, DVB_BAT_MASK, dvb_bat_callback,
NULL, "bat", MT_CRC, DVB_BAT_PID, MPS_WEIGHT_BAT);
+ if (tvhtime_update_enabled) {
+ mpegts_table_add(mm, DVB_TDT_BASE, DVB_TDT_MASK, dvb_tdt_callback,
+ NULL, "tdt", MT_ONESHOT | MT_QUICKREQ | MT_RECORD,
+ DVB_TDT_PID, MPS_WEIGHT_TDT);
+ mpegts_table_add(mm, DVB_TOT_BASE, DVB_TOT_MASK, dvb_tot_callback,
+ NULL, "tot", MT_ONESHOT | MT_QUICKREQ | MT_CRC | MT_RECORD,
+ DVB_TDT_PID, MPS_WEIGHT_TDT);
+ }
#if ENABLE_MPEGTS_DVB
if (idnode_is_instance(&mm->mm_id, &dvb_mux_dvbs_class)) {
dvb_mux_conf_t *mc = &((dvb_mux_t *)mm)->lm_tuning;
#endif
#include "profile.h"
#include "bouquet.h"
+#include "tvhtime.h"
#ifdef PLATFORM_LINUX
#include <sys/prctl.h>
libav_init();
#endif
+ tvhtime_init();
+
profile_init();
imagecache_init();
tvhtrace(subsys, "%s() leave", #fcn); \
} while (0)
-#define tvhdebug(...) tvhlog(LOG_DEBUG, ##__VA_ARGS__)
-#define tvhinfo(...) tvhlog(LOG_INFO, ##__VA_ARGS__)
-#define tvhwarn(...) tvhlog(LOG_WARNING, ##__VA_ARGS__)
-#define tvherror(...) tvhlog(LOG_ERR, ##__VA_ARGS__)
+#define tvhdebug(...) tvhlog(LOG_DEBUG, ##__VA_ARGS__)
+#define tvhinfo(...) tvhlog(LOG_INFO, ##__VA_ARGS__)
+#define tvhwarn(...) tvhlog(LOG_WARNING, ##__VA_ARGS__)
+#define tvhnotice(...) tvhlog(LOG_NOTICE, ##__VA_ARGS__)
+#define tvherror(...) tvhlog(LOG_ERR, ##__VA_ARGS__)
#endif /* __TVH_LOGGING_H__ */
* Update time
*/
void
-tvhtime_update ( struct tm *tm )
+tvhtime_update ( time_t utc, const char *srcname )
{
#if !ENABLE_ANDROID
- time_t now;
+ struct tm tm;
struct timeval tv;
ntp_shm_t *ntp_shm;
- int64_t t1, t2;
+ int64_t t1, t2, diff;
- tvhtrace("time", "current time is %04d/%02d/%02d %02d:%02d:%02d",
- tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+ localtime_r(&utc, &tm);
+
+ tvhtrace("time", "%s - current time is %04d/%02d/%02d %02d:%02d:%02d",
+ srcname,
+ tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
+ tm.tm_hour, tm.tm_min, tm.tm_sec);
- /* Current and reported time */
- now = mktime(tm);
gettimeofday(&tv, NULL);
/* Delta */
- t1 = now * 1000000;
+ t1 = utc * 1000000;
t2 = tv.tv_sec * 1000000 + tv.tv_usec;
/* Update local clock */
if (tvhtime_update_enabled) {
- if (llabs(t2 - t1) > tvhtime_tolerance) {
- tvhlog(LOG_DEBUG, "time", "updated system clock");
-#ifdef stime
- stime(&now);
+ if ((diff = llabs(t2 - t1)) > tvhtime_tolerance) {
+#if ENABLE_STIME
+ if (stime(&utc) < 0)
+ tvherror("time", "%s - unable to update system time: %s", srcname, strerror(errno));
+ else
+ tvhdebug("time", "%s - updated system clock", srcname);
#else
- tvhlog(LOG_NOTICE, "time", "stime(2) not implemented");
+ tvhnotice("time", "%s - stime(2) not implemented", srcname);
#endif
+ } else {
+ tvhwarn("time", "%s - time not updated (diff %"PRId64")", srcname, diff);
}
}
tvhtrace("time", "ntp delta = %"PRId64" us\n", t2 - t1);
ntp_shm->valid = 0;
ntp_shm->count++;
- ntp_shm->clockTimeStampSec = now;
+ ntp_shm->clockTimeStampSec = utc;
ntp_shm->clockTimeStampUSec = 0;
ntp_shm->receiveTimeStampSec = tv.tv_sec;
ntp_shm->receiveTimeStampUSec = (int)tv.tv_usec;
tvhtime_ntp_enabled = 0;
if (htsmsg_get_u32(m, "tolerance", &tvhtime_tolerance))
tvhtime_tolerance = 5000;
+ htsmsg_destroy(m);
}
static void tvhtime_save ( void )
htsmsg_add_u32(m, "ntp_enabled", tvhtime_ntp_enabled);
htsmsg_add_u32(m, "tolerance", tvhtime_tolerance);
hts_settings_save(m, "tvhtime/config");
+ htsmsg_destroy(m);
}
void tvhtime_set_update_enabled ( uint32_t on )
extern uint32_t tvhtime_tolerance;
void tvhtime_init ( void );
-void tvhtime_update ( struct tm *now );
+void tvhtime_update ( time_t utc, const char *srcname );
void tvhtime_set_update_enabled ( uint32_t on );
void tvhtime_set_ntp_enabled ( uint32_t on );