10 #include <QCoreApplication>
24 : reader(ccr), ignore_time_code(
false),
25 rbuf(new unsigned char[sizeof(
ccsubtitle)+255]),
27 wss_flags(0), wss_valid(
false),
29 xds_crc_passed(0), xds_crc_failed(0),
30 xds_lock(QMutex::Recursive),
31 xds_net_call(QString::null), xds_net_name(QString::null),
34 for (
uint i = 0; i < 2; i++)
54 memset(
row, 0,
sizeof(
row));
55 memset(
col, 0,
sizeof(
col));
62 for (
uint i = 0; i < 8; i++)
66 for (
uint i = 0; i < 128; i++)
85 for (
uint i = 0; i < 2; i++)
108 time_t now = time(NULL);
109 time_t then = now - seconds;
110 for (
uint i = 0; i < 4; i++)
116 11, -1, 1, 2, 3, 4, 12, 13,
117 14, 15, 5, 6, 7, 8, 9, 10
122 '®',
'°',
'½',
'¿', 0x2122 ,
'¢',
'£', 0x266A ,
123 'à',
' ',
'è',
'â',
'ê',
'î',
'ô',
'û'
128 'Á',
'É',
'Ó',
'Ú',
'Ü',
'ü',
'`',
'¡',
129 '*',
'\'', 0x2014 ,
'©',
130 0x2120 ,
'·', 0x201C, 0x201D ,
131 'À',
'Â',
'Ç',
'È',
'Ê',
'Ë',
'ë',
'Î',
132 'Ï',
'ï',
'Ô',
'Ù',
'ù',
'Û',
'«',
'»'
137 'Ã',
'ã',
'Í',
'Ì',
'ì',
'Ò',
'ò',
'Õ',
138 'õ',
'{',
'}',
'\\',
'^',
'_',
'¦',
'~',
139 'Ä',
'ä',
'Ö',
'ö',
'ß',
'¥',
'¤',
'|',
140 'Å',
'å',
'Ø',
'ø', 0x250C, 0x2510, 0x2514, 0x2518
153 for (mode = field*4; mode < (field*4 + 4); mode++)
167 LOG(VB_VBI, LOG_DEBUG,
"Format CC -- Duplicate");
175 b2 = (data >> 8) & 0x7f;
177 LOG(VB_VBI, LOG_DEBUG, QString(
"Format CC @%1/%2 = %3 %4")
179 .arg((data&0xff), 2, 16)
180 .arg((data&0xff00)>>8, 2, 16));
232 else if ((b1 & 0x10) && (b2 > 0x1F))
238 int newccmode = (b1 >> 3) & 1;
239 int newtxtmode =
txtmode[field*2 + newccmode];
240 if ((b1 & 0x06) == 0x04)
261 ccmode[field] = newccmode;
262 txtmode[field*2 + newccmode] = newtxtmode;
263 mode = (field << 2) | (newtxtmode << 1) |
ccmode[field];
285 LOG(VB_VBI, LOG_INFO,
286 QString(
"cc608 preamble indent, b2=%1")
295 LOG(VB_VBI, LOG_INFO,
296 QString(
"cc608 preamble color change, b2=%1")
309 LOG(VB_VBI, LOG_DEBUG,
310 QString(
"<ATTRIBUTE %1 %2>").arg(b1).arg(b2));
320 LOG(VB_VBI, LOG_INFO,
321 QString(
"cc608 mid-row color change, b2=%1")
325 ccbuf[
mode] += QChar(0x7000 + (b2 & 0xf));
367 LOG(VB_VBI, LOG_DEBUG,
368 QString(
"ccmode %1 cmd %2").arg(
ccmode)
369 .arg(b2, 2, 16,
'0'));
379 ccbuf[mode].startsWith(
"\b"))
395 if (
style[mode] == CC_STYLE_PAINT && len)
403 else if (
style[mode] == CC_STYLE_POPUP)
410 if (
style[mode] != CC_STYLE_ROLLUP)
419 (!newtxtmode ||
row[mode] >= 16)))
440 if (
style[mode] == CC_STYLE_ROLLUP && len)
448 else if (
style[mode] == CC_STYLE_POPUP)
473 if (
style[mode] != CC_STYLE_POPUP)
482 if (
style[mode] != CC_STYLE_POPUP)
496 if (
style[mode] != CC_STYLE_POPUP)
542 for (x = 0; x < (b2 & 0x03); x++)
554 for (mode = field*4; mode < (field*4 + 4); mode++)
558 (
style[mode] != CC_STYLE_POPUP) && len)
583 b2 = (data >> 8) & 0x7f;
591 ((b1 & 0x70) == 0x10))
606 int dup_text_fudge, dup_ctrl_fudge;
607 if (
badvbi[field] < 100 && b1 != 0 && b2 != 0)
610 if (d < 25 || d > 42)
612 else if (
badvbi[field] > 0)
620 dup_ctrl_fudge = 33 - 4;
625 dup_ctrl_fudge = 33 - 4;
630 if ((b1 & 0x70) == 0x10)
632 if (tc > (
lastcodetc[field] + 67 + dup_ctrl_fudge))
638 if (tc > (
lastcodetc[field] + 33 + dup_text_fudge))
668 for (
int i = 0; i < cc608str.length(); i++)
670 QChar cp = cc608str[i];
671 int cpu = cp.unicode();
676 case 0x2120 : ret +=
"(SM)";
break;
677 case 0x2122 : ret +=
"(TM)";
break;
678 case 0x2014 : ret +=
"(--)";
break;
679 case 0x201C : ret +=
"``";
break;
680 case 0x201D : ret +=
"''";
break;
681 case 0x250C : ret +=
"|-";
break;
682 case 0x2510 : ret +=
"-|";
break;
683 case 0x2514 : ret +=
"|_";
break;
684 case 0x2518 : ret +=
"_|";
break;
685 case 0x2588 : ret +=
"[]";
break;
686 case 0x266A : ret +=
"o/~";
break;
687 case '\b' : ret +=
"\\b";
break;
689 if (cpu >= 0x7000 && cpu < 0x7000 + 0x30)
691 if (!suppress_unknown)
692 ret += QString(
"[%1]").arg(cpu - 0x7000, 2, 16);
694 else if (cpu <= 0x80)
695 ret += QString(cp.toLatin1());
696 else if (!suppress_unknown)
697 ret += QString(
"{%1}").arg(cpu, 2, 16);
711 len = min(tmpbuf.length(), 255);
715 unsigned char *bp =
rbuf;
718 *(bp++) =
style[mode];
737 if (len && VERBOSE_LEVEL_CHECK(VB_VBI, LOG_INFO))
739 LOG(VB_VBI, LOG_INFO, QString(
"### %1 %2 %3 %4 %5 %6 %7 - '%8'")
742 .arg(
style[mode]).arg(f, 2, 16)
743 .arg(clr).arg(len, 3)
744 .arg(
ToASCII(QString::fromUtf8(tmpbuf.constData(),
len),
false)));
752 case CC_CC1: stream = 0;
break;
753 case CC_CC2: stream = 1;
break;
754 case CC_CC3: stream = 2;
break;
755 case CC_CC4: stream = 3;
break;
769 if (
style[mode] == CC_STYLE_ROLLUP)
847 for (
int x = 0;
x < limit;
x++)
870 return !(((c) & 0x7F) < 0x20 || ((c) & 0x7F) > 0x7E);
881 c ^= (c >> 4); c ^= (c >> 2); c ^= (c >> 1);
892 int day = (pil >> 15);
893 int mon = (pil >> 11) & 0xF;
894 int hour = (pil >> 6 ) & 0x1F;
895 int min = (pil ) & 0x3F;
897 #define _PIL_(day, mon, hour, min) \
898 (((day) << 15) + ((mon) << 11) + ((hour) << 6) + ((min) << 0))
900 if (pil == _PIL_(0, 15, 31, 63))
901 LOG(VB_VBI, LOG_INFO,
" PDC: Timer-control (no PDC)");
902 else if (pil == _PIL_(0, 15, 30, 63))
903 LOG(VB_VBI, LOG_INFO,
" PDC: Recording inhibit/terminate");
904 else if (pil == _PIL_(0, 15, 29, 63))
905 LOG(VB_VBI, LOG_INFO,
" PDC: Interruption");
906 else if (pil == _PIL_(0, 15, 28, 63))
907 LOG(VB_VBI, LOG_INFO,
" PDC: Continue");
908 else if (pil == _PIL_(31, 15, 31, 63))
909 LOG(VB_VBI, LOG_INFO,
" PDC: No time");
911 LOG(VB_VBI, LOG_INFO, QString(
" PDC: %1, 200X-%2-%3 %4:%5")
912 .arg(pil).arg(mon).arg(day).arg(hour).arg(min));
918 int cni, pcs, pty, pil;
932 LOG(VB_VBI, LOG_INFO, QString(
"VPS: 3-10: %1 %2 %3 %4 %5 %6 %7 %8 (\"%9\")")
933 .arg(buf[0]).arg(buf[1]).arg(buf[2]).arg(buf[3]).arg(buf[4])
934 .arg(buf[5]).arg(buf[6]).arg(buf[7]).arg(
vps_pr_label));
937 cni = + ((buf[10] & 3) << 10)
938 + ((buf[11] & 0xC0) << 2)
939 + ((buf[8] & 0xC0) << 0)
941 pil = ((buf[8] & 0x3F) << 14) + (buf[9] << 6) + (buf[10] >> 2);
944 LOG(VB_VBI, LOG_INFO, QString(
"CNI: %1 PCS: %2 PTY: %3 ")
945 .arg(cni).arg(pcs).arg(pty));
958 static const int wss_bits[8] = { 0, 0, 0, 1, 0, 1, 1, 1 };
961 for (
uint i = 0; i < 16; i++)
963 uint b1 = wss_bits[buf[i] & 7];
964 uint b2 = wss_bits[(buf[i] >> 3) & 7];
970 unsigned char parity = wss & 0xf;
971 parity ^= parity >> 2;
972 parity ^= parity >> 1;
974 LOG(VB_VBI, LOG_INFO,
975 QString(
"WSS: %1; %2 mode; %3 color coding;\n\t\t\t"
976 " %4 helper; reserved b7=%5; %6\n\t\t\t"
977 " open subtitles: %7; %scopyright %8; copying %9")
979 .arg((wss & 0x0010) ?
"film" :
"camera")
980 .arg((wss & 0x0020) ?
"MA/CP" :
"standard")
981 .arg((wss & 0x0040) ?
"modulated" :
"no")
982 .arg(!!(wss & 0x0080))
983 .arg((wss & 0x0100) ?
"have TTX subtitles; " :
"")
985 .arg((wss & 0x0800) ?
"surround sound; " :
"")
986 .arg((wss & 0x1000) ?
"asserted" :
"unknown")
987 .arg((wss & 0x2000) ?
"restricted" :
"not restricted"));
1000 for (
uint i = start; (i < buf.size()) && (i < end); i++)
1002 LOG(VB_VBI, LOG_INFO, QString(
"%1: 0x%2 -> 0x%3 %4")
1004 .arg(buf[i],2,16,QChar(
'0'))
1005 .arg(
CharCC(buf[i]).unicode(),2,16,QChar(
'0'))
1011 for (
uint i = start; (i < buf.size()) && (i < end); i++)
1018 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecodeString: '%1'").arg(tmp));
1021 return tmp.trimmed();
1024 static bool is_better(
const QString &newStr,
const QString &oldStr)
1026 if (!newStr.isEmpty() && newStr != oldStr &&
1027 (newStr != oldStr.left(newStr.length())))
1029 if (oldStr.isEmpty())
1033 for (
int i = 0; i < newStr.length(); i++)
1034 if (newStr[i].toLatin1() < 0x20)
1058 QString
prefix[4] = {
"MPAA-",
"TV-",
"CE-",
"CF-" };
1059 QString mainStr[4][8] =
1061 {
"NR",
"G",
"PG",
"PG-13",
"R",
"NC-17",
"X",
"NR" },
1062 {
"NR",
"Y",
"Y7",
"G",
"PG",
"14",
"MA",
"NR" },
1063 {
"E",
"C",
"C8+",
"G",
"PG",
"14+",
"18+",
"NR" },
1064 {
"E",
"G",
"8+",
"13+",
"16+",
"18+",
"NR",
"NR" },
1067 QString
main = prefix[i] + mainStr[i][
GetRating(i, future)];
1071 uint cf = (future) ? 1 : 0;
1108 for (
uint i = 0; i < program_type.size(); i++)
1123 if (key ==
"ratings")
1125 else if (key.startsWith(
"has_rating_"))
1127 else if (key.startsWith(
"rating_"))
1130 else if (key ==
"future_ratings")
1132 else if (key.startsWith(
"has_future_rating_"))
1134 else if (key.startsWith(
"future_rating_"))
1137 else if (key ==
"programname")
1139 else if (key ==
"future_programname")
1142 else if (key ==
"programtype")
1144 else if (key ==
"future_programtype")
1147 else if (key ==
"callsign")
1153 else if (key ==
"channame")
1159 else if (key ==
"tsid")
1162 return QString::null;
1183 LOG(VB_VBI, LOG_INFO,
1184 QString(
"XDSDecode: 0x%1 0x%2 '%3%4' xds[%5]=%6 in XDS %7")
1185 .arg(b1,2,16,QChar(
'0')).arg(b2,2,16,QChar(
'0'))
1186 .arg((
CharCC(b1).unicode()>0x20) ?
CharCC(b1) : QChar(
' '))
1187 .arg((
CharCC(b2).unicode()>0x20) ?
CharCC(b2) : QChar(
' '))
1188 .arg(field).arg(
xds[field])
1208 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecode: Starting XDS %1").arg(
xds_cur_service));
1212 else if ((0
x0 < b1) && (b1 < 0x0f))
1216 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecode: Resuming XDS %1").arg(
xds_cur_service));
1229 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecode: Ending XDS %1").arg(
xds_cur_service));
1234 xds_cur_service = -1;
1236 else if ((0x10 <= b1) && (b1 <= 0x1f))
1239 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecode: Suspending XDS %1 on 0x%2")
1252 bool handled =
false;
1253 int xds_class = xds_buf[0];
1258 if ((xds_class == 0x01) || (xds_class == 0x03))
1260 else if (xds_class == 0x05)
1262 else if (xds_class == 0x07)
1264 else if (xds_class == 0x09)
1266 else if (xds_class == 0x0b)
1268 else if (xds_class == 0x0d)
1271 if (DEBUG_XDS && !handled)
1273 LOG(VB_VBI, LOG_INFO, QString(
"XDS: ") +
1274 QString(
"Unhandled packet (0x%1 0x%2) sz(%3) '%4'")
1275 .arg(xds_buf[0],0,16).arg(xds_buf[1],0,16)
1276 .arg(xds_buf.size())
1285 for (
uint i = 0; i < xds_buf.size() - 1; i++)
1288 if ((((~sum) & 0x7f) + 1) != xds_buf[xds_buf.size() - 1])
1292 LOG(VB_VBI, LOG_ERR, QString(
"XDS: failed CRC %1 of %2")
1303 const vector<unsigned char> &xds_buf,
bool future)
1305 bool handled =
true;
1306 int b2 = xds_buf[1];
1307 int cf = (future) ? 1 : 0;
1308 QString loc = (future) ?
"XDS: Future " :
"XDS: Current ";
1310 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1312 uint min = xds_buf[2] & 0x3f;
1313 uint hour = xds_buf[3] & 0x0f;
1314 uint day = xds_buf[4] & 0x1f;
1315 uint month = xds_buf[5] & 0x0f;
1316 month = (month < 1 || month > 12) ? 0 : month;
1318 LOG(VB_VBI, LOG_INFO, loc +
1319 QString(
"Start Time %1/%2 %3:%4%5")
1320 .arg(month).arg(day).arg(hour).arg(min / 10).arg(min % 10));
1322 else if ((b2 == 0x02) && (xds_buf.size() >= 4))
1324 uint length_min = xds_buf[2] & 0x3f;
1325 uint length_hour = xds_buf[3] & 0x3f;
1326 uint length_elapsed_min = 0;
1327 uint length_elapsed_hour = 0;
1328 uint length_elapsed_secs = 0;
1329 if (xds_buf.size() > 6)
1331 length_elapsed_min = xds_buf[4] & 0x3f;
1332 length_elapsed_hour = xds_buf[5] & 0x3f;
1334 if (xds_buf.size() > 8 && xds_buf[7] == 0x40)
1335 length_elapsed_secs = xds_buf[6] & 0x3f;
1337 QString msg = QString(
"Program Length %1:%2%3 "
1338 "Time in Show %4:%5%6.%7%8")
1339 .arg(length_hour).arg(length_min / 10).arg(length_min % 10)
1340 .arg(length_elapsed_hour)
1341 .arg(length_elapsed_min / 10).arg(length_elapsed_min % 10)
1342 .arg(length_elapsed_secs / 10).arg(length_elapsed_secs % 10);
1344 LOG(VB_VBI, LOG_INFO, loc + msg);
1346 else if ((b2 == 0x03) && (xds_buf.size() >= 6))
1352 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Name: '%1'")
1356 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1358 vector<uint> program_type;
1359 for (
uint i = 2; i < xds_buf.size() - 2; i++)
1361 int cur = xds_buf[i] - 0x20;
1362 if (cur >= 0 && cur < 96)
1363 program_type.push_back(cur);
1367 for (
uint i = 0; (i < program_type.size()) && unchanged; i++)
1373 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Type '%1'")
1377 else if ((b2 == 0x05) && (xds_buf.size() >= 4))
1379 uint movie_rating = xds_buf[2] & 0x7;
1380 uint rating_system = (xds_buf[2] >> 3) & 0x7;
1381 uint tv_rating = xds_buf[3] & 0x7;
1382 uint VSL = xds_buf[3] & (0x7 << 3);
1383 uint sel = VSL | rating_system;
1391 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1402 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1406 else if (sel == 0x13 || sel == 0x1f)
1408 else if ((rating_system & 0
x3) == 1)
1413 uint f = ((xds_buf[0]<<3) & 0x80) | ((xds_buf[1]<<1) & 0x70);
1416 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1420 else if (rating_system == 0)
1427 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1433 LOG(VB_VBI, LOG_ERR, loc +
1434 QString(
"VChip Unhandled -- rs(%1) rating(%2:%3)")
1435 .arg(rating_system).arg(tv_rating).arg(movie_rating));
1439 else if (b2 == 0x07)
1441 else if (b2 == 0x08)
1443 else if (b2 == 0x09)
1445 else if (b2 == 0x0c)
1447 else if (b2 == 0x10 || b2 == 0x13 || b2 == 0x15 || b2 == 0x16 ||
1448 b2 == 0x91 || b2 == 0x92 || b2 == 0x94 || b2 == 0x97)
1450 else if (b2 == 0x86)
1452 else if (b2 == 0x89)
1454 else if (b2 == 0x8c)
1465 bool handled =
true;
1467 int b2 = xds_buf[1];
1468 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1473 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Name '%1'").arg(tmp));
1477 else if ((b2 == 0x02) && (xds_buf.size() >= 6))
1482 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Call '%1'").arg(tmp));
1486 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1488 uint tsid = (xds_buf[2] << 24 | xds_buf[3] << 16 |
1489 xds_buf[4] << 8 | xds_buf[5]);
1492 LOG(VB_VBI, LOG_INFO, QString(
"XDS: TSID 0x%1").arg(tsid,0,16));
1504 xds_program_type[0] = QCoreApplication::translate(
"(Categories)",
1506 xds_program_type[1] = QCoreApplication::translate(
"(Categories)",
1508 xds_program_type[2] = QCoreApplication::translate(
"(Categories)",
1510 xds_program_type[3] = QCoreApplication::translate(
"(Categories)",
1512 xds_program_type[4] = QCoreApplication::translate(
"(Categories)",
1514 xds_program_type[5] = QCoreApplication::translate(
"(Categories)",
1516 xds_program_type[6] = QCoreApplication::translate(
"(Categories)",
1518 xds_program_type[7] = QCoreApplication::translate(
"(Categories)",
1520 xds_program_type[8] = QCoreApplication::translate(
"(Categories)",
1522 xds_program_type[9] = QCoreApplication::translate(
"(Categories)",
1524 xds_program_type[10] = QCoreApplication::translate(
"(Categories)",
1526 xds_program_type[11] = QCoreApplication::translate(
"(Categories)",
1528 xds_program_type[12] = QCoreApplication::translate(
"(Categories)",
1530 xds_program_type[13] = QCoreApplication::translate(
"(Categories)",
1532 xds_program_type[14] = QCoreApplication::translate(
"(Categories)",
1534 xds_program_type[15] = QCoreApplication::translate(
"(Categories)",
1536 xds_program_type[16] = QCoreApplication::translate(
"(Categories)",
1538 xds_program_type[17] = QCoreApplication::translate(
"(Categories)",
1540 xds_program_type[18] = QCoreApplication::translate(
"(Categories)",
1542 xds_program_type[19] = QCoreApplication::translate(
"(Categories)",
1544 xds_program_type[20] = QCoreApplication::translate(
"(Categories)",
1546 xds_program_type[21] = QCoreApplication::translate(
"(Categories)",
1548 xds_program_type[22] = QCoreApplication::translate(
"(Categories)",
1550 xds_program_type[23] = QCoreApplication::translate(
"(Categories)",
1552 xds_program_type[24] = QCoreApplication::translate(
"(Categories)",
1554 xds_program_type[25] = QCoreApplication::translate(
"(Categories)",
1556 xds_program_type[26] = QCoreApplication::translate(
"(Categories)",
1558 xds_program_type[27] = QCoreApplication::translate(
"(Categories)",
1560 xds_program_type[28] = QCoreApplication::translate(
"(Categories)",
1562 xds_program_type[29] = QCoreApplication::translate(
"(Categories)",
1564 xds_program_type[30] = QCoreApplication::translate(
"(Categories)",
1566 xds_program_type[31] = QCoreApplication::translate(
"(Categories)",
1568 xds_program_type[32] = QCoreApplication::translate(
"(Categories)",
1570 xds_program_type[33] = QCoreApplication::translate(
"(Categories)",
1572 xds_program_type[34] = QCoreApplication::translate(
"(Categories)",
1574 xds_program_type[35] = QCoreApplication::translate(
"(Categories)",
1576 xds_program_type[36] = QCoreApplication::translate(
"(Categories)",
1578 xds_program_type[37] = QCoreApplication::translate(
"(Categories)",
1580 xds_program_type[38] = QCoreApplication::translate(
"(Categories)",
1582 xds_program_type[39] = QCoreApplication::translate(
"(Categories)",
1584 xds_program_type[40] = QCoreApplication::translate(
"(Categories)",
1586 xds_program_type[41] = QCoreApplication::translate(
"(Categories)",
1588 xds_program_type[42] = QCoreApplication::translate(
"(Categories)",
1590 xds_program_type[43] = QCoreApplication::translate(
"(Categories)",
1592 xds_program_type[44] = QCoreApplication::translate(
"(Categories)",
1594 xds_program_type[45] = QCoreApplication::translate(
"(Categories)",
1596 xds_program_type[46] = QCoreApplication::translate(
"(Categories)",
1598 xds_program_type[47] = QCoreApplication::translate(
"(Categories)",
1600 xds_program_type[48] = QCoreApplication::translate(
"(Categories)",
1602 xds_program_type[49] = QCoreApplication::translate(
"(Categories)",
1604 xds_program_type[50] = QCoreApplication::translate(
"(Categories)",
1606 xds_program_type[51] = QCoreApplication::translate(
"(Categories)",
1608 xds_program_type[52] = QCoreApplication::translate(
"(Categories)",
1610 xds_program_type[53] = QCoreApplication::translate(
"(Categories)",
1612 xds_program_type[54] = QCoreApplication::translate(
"(Categories)",
1614 xds_program_type[55] = QCoreApplication::translate(
"(Categories)",
1616 xds_program_type[56] = QCoreApplication::translate(
"(Categories)",
1618 xds_program_type[57] = QCoreApplication::translate(
"(Categories)",
1620 xds_program_type[58] = QCoreApplication::translate(
"(Categories)",
1622 xds_program_type[59] = QCoreApplication::translate(
"(Categories)",
1624 xds_program_type[60] = QCoreApplication::translate(
"(Categories)",
1626 xds_program_type[61] = QCoreApplication::translate(
"(Categories)",
1628 xds_program_type[62] = QCoreApplication::translate(
"(Categories)",
1630 xds_program_type[63] = QCoreApplication::translate(
"(Categories)",
1632 xds_program_type[64] = QCoreApplication::translate(
"(Categories)",
1634 xds_program_type[65] = QCoreApplication::translate(
"(Categories)",
1636 xds_program_type[66] = QCoreApplication::translate(
"(Categories)",
1638 xds_program_type[67] = QCoreApplication::translate(
"(Categories)",
1640 xds_program_type[68] = QCoreApplication::translate(
"(Categories)",
1642 xds_program_type[69] = QCoreApplication::translate(
"(Categories)",
1644 xds_program_type[70] = QCoreApplication::translate(
"(Categories)",
1646 xds_program_type[71] = QCoreApplication::translate(
"(Categories)",
1648 xds_program_type[72] = QCoreApplication::translate(
"(Categories)",
1650 xds_program_type[73] = QCoreApplication::translate(
"(Categories)",
1652 xds_program_type[74] = QCoreApplication::translate(
"(Categories)",
1654 xds_program_type[75] = QCoreApplication::translate(
"(Categories)",
1656 xds_program_type[76] = QCoreApplication::translate(
"(Categories)",
1658 xds_program_type[77] = QCoreApplication::translate(
"(Categories)",
1660 xds_program_type[78] = QCoreApplication::translate(
"(Categories)",
1662 xds_program_type[79] = QCoreApplication::translate(
"(Categories)",
1664 xds_program_type[80] = QCoreApplication::translate(
"(Categories)",
1666 xds_program_type[81] = QCoreApplication::translate(
"(Categories)",
1668 xds_program_type[82] = QCoreApplication::translate(
"(Categories)",
1670 xds_program_type[83] = QCoreApplication::translate(
"(Categories)",
1672 xds_program_type[84] = QCoreApplication::translate(
"(Categories)",
1674 xds_program_type[85] = QCoreApplication::translate(
"(Categories)",
1676 xds_program_type[86] = QCoreApplication::translate(
"(Categories)",
1678 xds_program_type[87] = QCoreApplication::translate(
"(Categories)",
1680 xds_program_type[88] = QCoreApplication::translate(
"(Categories)",
1682 xds_program_type[89] = QCoreApplication::translate(
"(Categories)",
1684 xds_program_type[90] = QCoreApplication::translate(
"(Categories)",
1686 xds_program_type[91] = QCoreApplication::translate(
"(Categories)",
1688 xds_program_type[92] = QCoreApplication::translate(
"(Categories)",
1690 xds_program_type[93] = QCoreApplication::translate(
"(Categories)",
1692 xds_program_type[94] = QCoreApplication::translate(
"(Categories)",
1694 xds_program_type[95] = QCoreApplication::translate(
"(Categories)",