35 uint programnumber,
uint tunedchanid);
36 static void init_fixup(QMap<uint64_t,uint> &fix);
38 #define LOC QString("EITHelper: ")
42 gps_offset(-1 * GPS_LEAP_SECONDS),
43 sourceid(0), channelid(0),
44 maxStarttime(QDateTime()), seenEITother(
false)
85 insertCount +=
event->UpdateDB(query, 1000);
98 LOC + QString(
"Added %1 events -- complete(%2) "
99 "incomplete(%3) unmatched(%4)")
105 LOG(VB_EIT, LOG_INFO,
106 LOC + QString(
"Added %1 events").arg(insertCount));
115 uint atsc_key = (atsc_major << 16) | atsc_minor;
124 QStringList::const_iterator it;
125 for (it = langPref.begin(); it != langPref.end(); ++it)
127 if (!(*it).isEmpty())
151 uint atsc_key = (atsc_major << 16) | atsc_minor;
162 EventIDToETT::iterator it = etts.find(eit->
EventID(i));
164 if (it != etts.end())
175 unsigned char *
tmp =
new unsigned char[ev.desc_length];
186 uint atsc_key = (atsc_major << 16) | atsc_minor;
191 EventIDToATSCEvent::iterator it = (*eits_it).find(ett->
EventID());
192 if (it != (*eits_it).end())
195 atsc_major, atsc_minor, *it,
199 delete [] (*it).desc;
201 (*eits_it).erase(it);
209 if (elist.find(ett->
EventID()) == elist.end())
217 QMap<uint,uint> languagePreferences,
218 QString &title, QString &subtitle,
219 QString &description)
221 const unsigned char *bestShortEvent =
226 unsigned char enc_1[3] = { 0x10, 0x00, 0x01 };
227 unsigned char enc_9[3] = { 0x10, 0x00, 0x09 };
228 unsigned char enc_15[3] = { 0x10, 0x00, 0x0f };
230 const unsigned char *enc = NULL;
237 enc_len =
sizeof(enc_1);
245 enc_len =
sizeof(enc_9);
253 enc_len =
sizeof(enc_15);
262 subtitle = sed.
Text(enc, enc_len);
267 subtitle = sed.
Text();
271 vector<const unsigned char*> bestExtendedEvents =
276 for (
uint j = 0; j < bestExtendedEvents.size(); j++)
278 if (!bestExtendedEvents[j])
286 description += eed.
Text(enc, enc_len);
288 description += eed.
Text();
293 unsigned char &subtitle_type,
294 unsigned char &audio_properties,
295 unsigned char &video_properties)
299 for (
uint j = 0; j < components.size(); j++)
330 uint descCompression = (eit->
TableID() > 0x80) ? 2 : 1;
332 fix |=
fixup.value((((uint64_t)eit->
TSID()) << 32) |
335 fix |=
fixup.value((((uint64_t)eit->
TSID()) << 32) |
351 QString title = QString(
"");
352 QString subtitle = QString(
"");
353 QString description = QString(
"");
354 QString category = QString(
"");
356 unsigned char subtitle_type=0, audio_props=0, video_props=0;
362 const unsigned char *dish_event_name = NULL;
373 title = dend.
Name(descCompression);
375 const unsigned char *dish_event_description =
378 if (dish_event_description)
388 title, subtitle, description);
394 QString programId = QString(
"");
395 QString seriesId = QString(
"");
396 QString
rating = QString(
"");
397 QString rating_system = QString(
"");
398 QString advisory = QString(
"");
400 QDate originalairdate;
409 stars = mpaa.
stars();
414 rating_system =
"MPAA";
427 rating_system =
"VCHIP";
432 if (!advisory.isEmpty() && !rating.isEmpty())
433 rating +=
", " + advisory;
434 else if (!advisory.isEmpty())
437 rating_system =
"advisory";
449 if (programId.startsWith(
"MV") || programId.startsWith(
"SP"))
463 const unsigned char *content_data =
499 category =
"Entertainment";
505 category =
"Children";
511 category =
"Arts/Culture";
514 category =
"Current Affairs";
517 category =
"Education";
520 category =
"Infotainment";
523 category =
"Special";
532 category =
"Documentary";
550 for (
uint j = 0; j < contentIds.size(); j++)
576 title, subtitle, description,
577 category, category_type,
578 starttime, endtime, fix,
582 seriesId, programId);
596 QString title = QString(
"");
597 QString subtitle = QString(
"");
598 QString description = QString(
"");
599 QString category = QString(
"");
601 unsigned char subtitle_type=0, audio_props=0, video_props=0;
608 title, subtitle, description);
613 const unsigned char *content_data =
619 if (content.
Nibble(0)==0x00)
628 category = QObject::tr(
"Sports");
648 for(
uint j=0; j< transmissions.size(); j++)
659 LOG(VB_EIT, LOG_INFO,
LOC +
660 QString(
"Premiere EIT for NIT %1, TID %2, SID %3, "
661 "count %4, title: %5. Channel not found!")
662 .arg(networkid).arg(tsid).arg(serviceid)
683 title, subtitle, description,
684 category, category_type,
685 starttime, endtime, fix,
725 QDateTime endtime = starttime.addSecs(event.
length);
728 unsigned char subtitle_type =
734 uint atsc_key = (atsc_major << 16) | atsc_minor;
737 QString title =
event.title;
738 QString subtitle = ett;
741 fixup.value(atsc_key), subtitle_type,
742 audio_properties, video_properties));
749 key |= ((uint64_t) atsc_minor) << 16;
750 key |= ((uint64_t) atsc_major) << 32;
752 ServiceToChanID::const_iterator it =
srv_to_chanid.find(key);
766 key |= ((uint64_t) serviceid) << 16;
767 key |= ((uint64_t) networkid) << 32;
768 key |= ((uint64_t) tsid) << 48;
770 ServiceToChanID::const_iterator it =
srv_to_chanid.find(key);
784 key |= ((uint64_t) program_number) << 16;
787 ServiceToChanID::const_iterator it =
srv_to_chanid.find(key);
802 "SELECT chanid, useonairguide "
804 "WHERE atsc_major_chan = :MAJORCHAN AND "
805 " atsc_minor_chan = :MINORCHAN AND "
806 " sourceid = :SOURCEID");
807 query.
bindValue(
":MAJORCHAN", atsc_major);
808 query.
bindValue(
":MINORCHAN", atsc_minor);
813 else if (query.
next())
815 bool useOnAirGuide = query.
value(1).toBool();
816 return (useOnAirGuide) ? query.
value(0).toUInt() : 0;
827 bool useOnAirGuide =
false;
832 "SELECT chanid, useonairguide, channel.sourceid "
833 "FROM channel, dtv_multiplex "
834 "WHERE serviceid = :SERVICEID AND "
835 " networkid = :NETWORKID AND "
836 " transportid = :TRANSPORTID AND "
837 " channel.mplexid = dtv_multiplex.mplexid";
840 query.
bindValue(
":SERVICEID", serviceid);
841 query.
bindValue(
":NETWORKID", networkid);
842 query.
bindValue(
":TRANSPORTID", transportid);
847 if (query.
size() == 0) {
851 "SELECT chanid, useonairguide, channel.sourceid "
852 "FROM channel, dtv_multiplex "
853 "WHERE serviceid = :SERVICEID AND "
854 " networkid = :NETWORKID AND "
855 " channel.mplexid = dtv_multiplex.mplexid";
858 query.
bindValue(
":SERVICEID", serviceid);
859 query.
bindValue(
":NETWORKID", networkid);
867 chanid = query.
value(0).toUInt();
868 useOnAirGuide = query.
value(1).toBool();
869 if (sourceid == query.
value(2).toUInt())
870 return useOnAirGuide ? chanid : 0;
873 if (query.
size() > 1)
875 LOG(VB_EIT, LOG_INFO,
876 LOC + QString(
"found %1 channels for networdid %2, "
877 "transportid %3, serviceid %4 but none "
878 "for current sourceid %5.")
879 .arg(query.
size()).arg(networkid).arg(transportid)
880 .arg(serviceid).arg(sourceid));
883 return useOnAirGuide ? chanid : 0;
896 bool useOnAirGuide =
false;
901 "SELECT c1.chanid, c1.useonairguide, c1.sourceid "
902 "FROM channel c1, dtv_multiplex m, channel c2 "
903 "WHERE c1.serviceid = :SERVICEID AND "
904 " c1.mplexid = m.mplexid AND "
905 " m.mplexid = c2.mplexid AND "
906 " c2.chanid = :CHANID";
909 query.
bindValue(
":SERVICEID", serviceid);
918 chanid = query.
value(0).toUInt();
919 useOnAirGuide = query.
value(1).toBool();
920 if (sourceid == query.
value(2).toUInt())
921 return useOnAirGuide ? chanid : 0;
924 if (query.
size() > 1)
926 LOG(VB_EIT, LOG_INFO,
927 LOC + QString(
"found %1 channels for multiplex of chanid %2, "
928 "serviceid %3 but none "
929 "for current sourceid %4.")
930 .arg(query.
size()).arg(tunedchanid)
931 .arg(serviceid).arg(sourceid));
934 return useOnAirGuide ? chanid : 0;
1027 fix[ 1089LL << 32 | 1 << 16] =
1028 fix[ 773LL << 32 | 8468U << 16] =
1029 fix[ 2819LL << 32 | 8468U << 16] =
1030 fix[ 8706LL << 32 | 8468U << 16] =
1031 fix[ 12801LL << 32 | 8468U << 16] =
1059 fix[ 42249U << 16] =
1112 fix[ 8707LL << 32 | 8468U << 16 | 16426 ] =
1128 fix[10004LL<<32 | 61441U << 16 | 50403] =
1129 fix[10004LL<<32 | 61441U << 16 | 53101] =
1130 fix[10004LL<<32 | 61441U << 16 | 53108] =
1131 fix[10004LL<<32 | 61441U << 16 | 53109] =
1132 fix[10004LL<<32 | 61441U << 16 | 53406] =
1133 fix[10004LL<<32 | 61441U << 16 | 53407] =
1134 fix[10004LL<<32 | 61441U << 16 | 53404] =
1135 fix[10004LL<<32 | 61441U << 16 | 53408] =
1136 fix[10004LL<<32 | 61441U << 16 | 53409] =
1137 fix[10004LL<<32 | 61441U << 16 | 53410] =
1138 fix[10004LL<<32 | 61441U << 16 | 53503] =
1139 fix[10004LL<<32 | 61441U << 16 | 53411] =
1140 fix[10004LL<<32 | 61441U << 16 | 53412] =
1141 fix[10004LL<<32 | 61441U << 16 | 53112] =
1142 fix[10004LL<<32 | 61441U << 16 | 53513] =
1143 fix[10004LL<<32 | 61441U << 16 | 53618] =
1144 fix[10004LL<<32 | 61441U << 16 | 53619] =
1147 fix[10005LL<<32 | 61441U << 16 | 50104] =
1148 fix[10005LL<<32 | 61441U << 16 | 50107] =
1149 fix[10005LL<<32 | 61441U << 16 | 50301] =
1150 fix[10005LL<<32 | 61441U << 16 | 50302] =
1151 fix[10005LL<<32 | 61441U << 16 | 50303] =
1152 fix[10005LL<<32 | 61441U << 16 | 50304] =
1153 fix[10005LL<<32 | 61441U << 16 | 50305] =
1154 fix[10005LL<<32 | 61441U << 16 | 50306] =
1155 fix[10005LL<<32 | 61441U << 16 | 50307] =
1156 fix[10005LL<<32 | 61441U << 16 | 53105] =
1157 fix[10005LL<<32 | 61441U << 16 | 53115] =
1158 fix[10005LL<<32 | 61441U << 16 | 53405] =
1159 fix[10005LL<<32 | 61441U << 16 | 53402] =
1160 fix[10005LL<<32 | 61441U << 16 | 53613] =
1161 fix[10005LL<<32 | 61441U << 16 | 53516] =
1162 fix[10005LL<<32 | 61441U << 16 | 53611] =
1163 fix[10005LL<<32 | 61441U << 16 | 53104] =
1166 fix[10007LL<<32| 61441U << 16 | 53607] =
1167 fix[10007LL<<32| 61441U << 16 | 53608] =
1168 fix[10007LL<<32| 61441U << 16 | 53609] =
1169 fix[10007LL<<32| 61441U << 16 | 53628] =
1172 fix[10007LL<<32| 61441U << 16 | 53601] =
1173 fix[10007LL<<32| 61441U << 16 | 53602] =
1174 fix[10007LL<<32| 61441U << 16 | 53604] =
1175 fix[10007LL<<32| 61441U << 16 | 53606] =
1178 fix[ 10008LL<<32 | 61441U << 16 | 53002] =
1182 fix[ 9999 << 16 | 161LL << 32 | 12101 ] =
1183 fix[ 9999 << 16 | 161LL << 32 | 12104 ] =
1184 fix[ 9999 << 16 | 161LL << 32 | 12107 ] =
1185 fix[ 9999 << 16 | 161LL << 32 | 12109 ] =
1186 fix[ 9999 << 16 | 301LL << 32 | 30114 ] =
1188 fix[ 9999 << 16 | 191LL << 32 | 11102 ] =
1191 fix[ 9999 << 16 | 401LL << 32 | 29109 ] =
1201 fix[ 1022LL << 32 | 1 << 16 | 6901 ] =
1202 fix[ 1022LL << 32 | 1 << 16 | 6905 ] =
1203 fix[ 1022LL << 32 | 1 << 16 | 6911 ] =
1204 fix[ 1072LL << 32 | 1 << 16 | 8201 ] =
1205 fix[ 1070LL << 32 | 1 << 16 | 8004 ] =
1206 fix[ 1091LL << 32 | 1 << 16 | 31220 ] =
1207 fix[ 1094LL << 32 | 1 << 16 | 17027 ] =
1208 fix[ 1094LL << 32 | 1 << 16 | 17028 ] =
1209 fix[ 1100LL << 32 | 1 << 16 | 8710 ] =