diff --git a/libdvbtee/decode.cpp b/libdvbtee/decode.cpp index edd4ccd9..6889c23f 100644 --- a/libdvbtee/decode.cpp +++ b/libdvbtee/decode.cpp @@ -1447,8 +1447,13 @@ void decode::dump_epg_event(const decoded_vct_channel_t *channel, const decoded_ fprintf(stderr, "%04d-%02d-%02d %02d:%02d-%02d:%02d,%s\n", tms.tm_year+1900, tms.tm_mon+1, tms.tm_mday, tms.tm_hour, tms.tm_min, tme.tm_hour, tme.tm_min, name ); + + unsigned char message[4096]; + const char* etm = (const char *)get_decoded_ett((channel->source_id << 16) | (event->event_id << 2) | 0x02, message, sizeof(message)); + if (message[0]) + fprintf(stderr, "\t%s\n", message); + if (reporter) { - unsigned char message[4096]; reporter->epg_event((const char *)service_name, channel->chan_major, channel->chan_minor, physical_channel, channel->program, @@ -1456,7 +1461,7 @@ void decode::dump_epg_event(const decoded_vct_channel_t *channel, const decoded_ start, (end - start), (const char *)name, - (const char *)get_decoded_ett((channel->source_id << 16) | (event->event_id << 2) | 0x02, message, sizeof(message))); + (const char *)message); } return; } @@ -2009,6 +2014,43 @@ bool decode::got_all_eit(int limit) return true; } +bool decode::got_all_ett() +{ + int missing_etts=0; + int total_events=0; + for (int eit_num=0; + eit_num < 128 && !decoded_atsc_eit[eit_num].empty(); + eit_num++) + { + map_decoded_atsc_eit::const_iterator eit_iter; + for (eit_iter = decoded_atsc_eit[eit_num].begin(); + eit_iter != decoded_atsc_eit[eit_num].end(); + eit_iter++) + { + uint32_t source_id = eit_iter->first; + map_decoded_atsc_eit_events events = eit_iter->second.events; + map_decoded_atsc_eit_events::const_iterator event_iter; + for (event_iter = events.begin(); + event_iter != events.end(); + event_iter++) + { + if (!event_iter->second.etm_location) continue; + // TODO: not yet supported? haven't tested + if (event_iter->second.etm_location == 2) continue; + total_events++; + + uint32_t event_id = event_iter->second.event_id; + uint32_t etm_id = (source_id << 16) | (event_id << 2) | 0x02; + if (!decoded_ett.count(etm_id)) { + missing_etts++; + } + } + } + } + fprintf(stderr, "%3d/%3d ETTs remaining...\r", missing_etts, total_events); + return (missing_etts == 0); +} + const decode_network* decode::get_decoded_network() const { map_network_decoder::const_iterator it = networks.find(orig_network_id); diff --git a/libdvbtee/decode.h b/libdvbtee/decode.h index 17c652bd..732b10be 100644 --- a/libdvbtee/decode.h +++ b/libdvbtee/decode.h @@ -525,6 +525,7 @@ class decode void dump_eit_x(decode_report *reporter, uint8_t eit_x, uint16_t source_id = 0); bool eit_x_complete(uint8_t current_eit_x); bool got_all_eit(int limit = -1); + bool got_all_ett(); void dump_epg(decode_report *reporter); diff --git a/libdvbtee/parse.cpp b/libdvbtee/parse.cpp index 4d209b2e..eb15bf08 100644 --- a/libdvbtee/parse.cpp +++ b/libdvbtee/parse.cpp @@ -710,7 +710,13 @@ parse::parse() , ts_id(0) , epg_mode(false) , scan_mode(false) - , dont_collect_ett(true) + , dont_collect_ett( +#if ETT + false +#else + true +#endif + ) , has_pat(false) , has_mgt(false) , has_vct(false) @@ -1152,7 +1158,16 @@ bool parse::is_psip_ready() bool parse::is_epg_ready() { - return ((is_psip_ready()) && ((decoders.count(get_ts_id()) && (decoders[get_ts_id()].got_all_eit(eit_collection_limit))))); + if (!is_psip_ready()) return false; + if (!decoders.count(get_ts_id())) return false; + decode& d=decoders[get_ts_id()]; + if (!d.got_all_eit(eit_collection_limit)) return false; +#if ETT +#if 1 + if (!d.got_all_ett()) return false; +#endif +#endif + return true; } int parse::add_output(void* priv, stream_callback callback)