diff --git a/src/remuxerHandler.cpp b/src/remuxerHandler.cpp index 797aac1..62c4e81 100644 --- a/src/remuxerHandler.cpp +++ b/src/remuxerHandler.cpp @@ -554,8 +554,10 @@ void RemuxerHandler::onMhEit(const MmtTlv::MhEit& mhEit) { tsid = mhEit.tlvStreamId; if (mhEit.isPf() && mhEit.sectionNumber == 0 && !mhEit.events.empty()) { - std::tm startTime = EITConvertStartTime((mhEit.events.begin())->get()->startTime); - programStartTime = static_cast(std::mktime(&startTime)); + uint64_t startTime{}; + if (EITConvertStartTimeToUnixTime((mhEit.events.begin())->get()->startTime, &startTime)) { + programStartTime = startTime; + } } ts::EIT tsEit(true, mhEit.isPf(), 0, mhEit.versionNumber, true, mhEit.serviceId, mhEit.tlvStreamId, mhEit.originalNetworkId); diff --git a/src/timeUtil.cpp b/src/timeUtil.cpp index 74d1ff6..5145275 100644 --- a/src/timeUtil.cpp +++ b/src/timeUtil.cpp @@ -1,4 +1,5 @@ #include "timeUtil.h" +#include #include #include @@ -46,6 +47,38 @@ struct tm EITConvertStartTime(uint64_t i_date) { return tm; } +bool EITConvertStartTimeToUnixTime(uint64_t i_date, uint64_t* p_unix_time) { + if (i_date == UNKNOWN_START_TIME || p_unix_time == nullptr) { + return false; + } + + const struct tm startTime = EITConvertStartTime(i_date); + const std::chrono::year_month_day date{ + std::chrono::year{startTime.tm_year + BASE_YEAR}, + std::chrono::month{static_cast(startTime.tm_mon + 1)}, + std::chrono::day{static_cast(startTime.tm_mday)} + }; + if (!date.ok() || startTime.tm_hour < 0 || startTime.tm_hour > 23 || + startTime.tm_min < 0 || startTime.tm_min > 59 || + startTime.tm_sec < 0 || startTime.tm_sec > 59) { + return false; + } + + constexpr std::chrono::hours JST_OFFSET{9}; + const auto utcTime = std::chrono::sys_days{date} + + std::chrono::hours{startTime.tm_hour} + + std::chrono::minutes{startTime.tm_min} + + std::chrono::seconds{startTime.tm_sec} - JST_OFFSET; + const auto unixTime = std::chrono::duration_cast( + utcTime.time_since_epoch()).count(); + if (unixTime < 0) { + return false; + } + + *p_unix_time = static_cast(unixTime); + return true; +} + int EITConvertDuration(uint32_t i_duration) { return convertFromBcd(i_duration >> 16) * 3600 + convertFromBcd(i_duration >> 8) * 60 + diff --git a/src/timeUtil.h b/src/timeUtil.h index 1278379..1cfecda 100644 --- a/src/timeUtil.h +++ b/src/timeUtil.h @@ -4,4 +4,5 @@ void EITDecodeMjd(int i_mjd, int* p_y, int* p_m, int* p_d); struct tm EITConvertStartTime(uint64_t i_date); -int EITConvertDuration(uint32_t i_duration); \ No newline at end of file +bool EITConvertStartTimeToUnixTime(uint64_t i_date, uint64_t* p_unix_time); +int EITConvertDuration(uint32_t i_duration);