467 changes: 452 additions & 15 deletions mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1557,20 +1557,84 @@ void TestMPEGTables::scte35_sit_test1(void)
//
// DVB NetworkInformationTable Tests
//
const std::vector<uint8_t> au_nit_data {
0x40, 0xF0, 0x67, 0x32, 0xA0, 0xE1, 0x00, 0x00, 0xF0, 0x05, 0x40, 0x03, 0x53, 0x43, 0x41, 0xF0,
0x55, 0x08, 0x07, 0x32, 0x0C, 0xF0, 0x4F, 0x5A, 0x0B, 0x01, 0x0E, 0xD7, 0xF0, 0x3B, 0x82, 0x4A,
0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x18, 0x08, 0x07, 0x01, 0x08, 0x27, 0x01, 0x08, 0x47, 0x01, 0x08,
0x67, 0x16, 0x08, 0x87, 0x16, 0x08, 0xA7, 0x01, 0x08, 0xC7, 0x19, 0x08, 0xE7, 0x16, 0x5F, 0x04,
0x00, 0x00, 0x32, 0x00, 0x83, 0x20, 0x08, 0x07, 0xFC, 0x05, 0x08, 0xC7, 0xFC, 0x32, 0x08, 0xA7,
0xFC, 0x33, 0x08, 0x27, 0xFC, 0x34, 0x08, 0x47, 0xFC, 0x35, 0x08, 0xE7, 0xFC, 0x36, 0x08, 0x67,
0xFC, 0x37, 0x08, 0x87, 0xFC, 0x38, 0x7B, 0xC3, 0xA9, 0xED,
};

void TestMPEGTables::dvb_nit_test(void)
{
const std::vector<uint8_t> si_data {
0x40, 0xF0, 0x67, 0x32, 0xA0, 0xE1, 0x00, 0x00, 0xF0, 0x05, 0x40, 0x03, 0x53, 0x43, 0x41, 0xF0,
0x55, 0x08, 0x07, 0x32, 0x0C, 0xF0, 0x4F, 0x5A, 0x0B, 0x01, 0x0E, 0xD7, 0xF0, 0x3B, 0x82, 0x4A,
0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x18, 0x08, 0x07, 0x01, 0x08, 0x27, 0x01, 0x08, 0x47, 0x01, 0x08,
0x67, 0x16, 0x08, 0x87, 0x16, 0x08, 0xA7, 0x01, 0x08, 0xC7, 0x19, 0x08, 0xE7, 0x16, 0x5F, 0x04,
0x00, 0x00, 0x32, 0x00, 0x83, 0x20, 0x08, 0x07, 0xFC, 0x05, 0x08, 0xC7, 0xFC, 0x32, 0x08, 0xA7,
0xFC, 0x33, 0x08, 0x27, 0xFC, 0x34, 0x08, 0x47, 0xFC, 0x35, 0x08, 0xE7, 0xFC, 0x36, 0x08, 0x67,
0xFC, 0x37, 0x08, 0x87, 0xFC, 0x38, 0x7B, 0xC3, 0xA9, 0xED,
};
const std::vector<uint8_t> nz_nit_data {
0x40, 0xF3, 0xDB, 0x34, 0x01, 0xF1, 0x00, 0x01, 0xF0, 0x0B, 0x40, 0x09, 0x46, 0x72, 0x65, 0x65,
0x76, 0x69, 0x65, 0x77, 0x20, 0xF3, 0xC3, 0x00, 0x19, 0x22, 0x2A, 0xF0, 0x8A, 0x5A, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x82, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x21, 0x04, 0xB0, 0x19, 0x04,
0xB1, 0x19, 0x04, 0xB5, 0x19, 0x04, 0xB6, 0x16, 0x04, 0xB7, 0x16, 0x04, 0xB8, 0x16, 0x30, 0xD4,
0x0C, 0x30, 0xD5, 0x19, 0x30, 0xD6, 0x19, 0x30, 0xD7, 0x19, 0x30, 0xD8, 0x19, 0x62, 0x0D, 0xFF,
0x03, 0x34, 0xEC, 0x40, 0x03, 0x28, 0xB7, 0x40, 0x03, 0x71, 0xF5, 0x40, 0x5F, 0x04, 0x00, 0x00,
0x00, 0x37, 0x83, 0x2C, 0x04, 0xB0, 0xFC, 0x01, 0x04, 0xB1, 0xFC, 0x02, 0x04, 0xB5, 0xFC, 0x06,
0x04, 0xB6, 0xFC, 0x0B, 0x04, 0xB7, 0xFC, 0x07, 0x04, 0xB8, 0xFC, 0x0C, 0x30, 0xD4, 0x7D, 0xF4,
0x30, 0xD5, 0x7E, 0x58, 0x30, 0xD6, 0x7E, 0x59, 0x30, 0xD7, 0x7E, 0x5A, 0x30, 0xD8, 0x7E, 0x5B,
0x6D, 0x15, 0x27, 0x74, 0x03, 0x34, 0xEC, 0x40, 0x00, 0x27, 0x75, 0x03, 0x28, 0xB7, 0x40, 0x00,
0x27, 0xA6, 0x03, 0x71, 0xF5, 0x40, 0x00, 0x00, 0x1A, 0x22, 0x2A, 0xF0, 0x7F, 0x5A, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x82, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x18, 0x04, 0xB0, 0x19, 0x04,
0xB1, 0x19, 0x04, 0xB5, 0x19, 0x04, 0xB6, 0x16, 0x04, 0xB7, 0x16, 0x04, 0xB8, 0x16, 0x30, 0xD4,
0x0C, 0x30, 0xD5, 0x19, 0x62, 0x09, 0xFF, 0x03, 0x71, 0xF5, 0x40, 0x03, 0x7E, 0x2A, 0x40, 0x5F,
0x04, 0x00, 0x00, 0x00, 0x37, 0x83, 0x20, 0x04, 0xB0, 0xFC, 0x01, 0x04, 0xB1, 0xFC, 0x02, 0x04,
0xB5, 0xFC, 0x06, 0x04, 0xB6, 0xFC, 0x0B, 0x04, 0xB7, 0xFC, 0x07, 0x04, 0xB8, 0xFC, 0x0C, 0x30,
0xD4, 0x7D, 0xF4, 0x30, 0xD5, 0x7E, 0x58, 0x6D, 0x23, 0x27, 0xD8, 0x03, 0x71, 0xF5, 0x40, 0x00,
0x27, 0xD9, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x27, 0xDA, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x27, 0xEC,
0x03, 0x7E, 0x2A, 0x40, 0x00, 0x28, 0x00, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x00, 0x1B, 0x22, 0x2A,
0xF0, 0xA2, 0x5A, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x82, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x41,
0x15, 0x04, 0xB0, 0x19, 0x04, 0xB1, 0x19, 0x04, 0xB5, 0x19, 0x04, 0xB6, 0x16, 0x04, 0xB7, 0x16,
0x04, 0xB8, 0x16, 0x30, 0xD4, 0x0C, 0x62, 0x09, 0xFF, 0x03, 0x7E, 0x2A, 0x40, 0x03, 0x71, 0xF5,
0x40, 0x5F, 0x04, 0x00, 0x00, 0x00, 0x37, 0x83, 0x1C, 0x04, 0xB0, 0xFC, 0x01, 0x04, 0xB1, 0xFC,
0x02, 0x04, 0xB5, 0xFC, 0x06, 0x04, 0xB6, 0xFC, 0x0B, 0x04, 0xB7, 0xFC, 0x07, 0x30, 0xD4, 0x7D,
0xF4, 0x04, 0xB8, 0xFC, 0x0C, 0x6D, 0x4D, 0x28, 0x3C, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x28, 0x3D,
0x03, 0x71, 0xF5, 0x40, 0x00, 0x28, 0x46, 0x03, 0x71, 0xF5, 0x40, 0x00, 0x28, 0x47, 0x03, 0x7E,
0x2A, 0x40, 0x00, 0x28, 0xA0, 0x03, 0x71, 0xF5, 0x40, 0x00, 0x28, 0xAA, 0x03, 0x71, 0xF5, 0x40,
0x00, 0x28, 0xB4, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x28, 0xBE, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x29,
0x04, 0x03, 0x71, 0xF5, 0x40, 0x00, 0x29, 0x05, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x29, 0x08, 0x03,
0x7E, 0x2A, 0x40, 0x00, 0x00, 0x1C, 0x22, 0x2A, 0xF0, 0x7F, 0x5A, 0x0B, 0x00, 0x00, 0x00, 0x00,
0x1F, 0x82, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x15, 0x04, 0xB0, 0x19, 0x04, 0xB1, 0x19, 0x04,
0xB5, 0x19, 0x04, 0xB6, 0x16, 0x04, 0xB7, 0x16, 0x04, 0xB8, 0x16, 0x30, 0xD4, 0x0C, 0x62, 0x09,
0xFF, 0x03, 0x71, 0xF5, 0x40, 0x03, 0x7E, 0x2A, 0x40, 0x5F, 0x04, 0x00, 0x00, 0x00, 0x37, 0x83,
0x1C, 0x04, 0xB0, 0xFC, 0x01, 0x04, 0xB1, 0xFC, 0x02, 0x04, 0xB5, 0xFC, 0x06, 0x04, 0xB6, 0xFC,
0x0B, 0x04, 0xB7, 0xFC, 0x07, 0x04, 0xB8, 0xFC, 0x0C, 0x30, 0xD4, 0x7D, 0xF4, 0x6D, 0x2A, 0x29,
0x68, 0x03, 0x71, 0xF5, 0x40, 0x00, 0x29, 0x72, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x29, 0x73, 0x03,
0x71, 0xF5, 0x40, 0x00, 0x29, 0x9A, 0x03, 0x7E, 0x2A, 0x40, 0x00, 0x29, 0xCC, 0x03, 0x71, 0xF5,
0x40, 0x00, 0x29, 0xFE, 0x03, 0x71, 0xF5, 0x40, 0x00, 0x00, 0x1D, 0x22, 0x2A, 0xF0, 0x63, 0x5A,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x82, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x12, 0x05, 0x14,
0x19, 0x05, 0x16, 0x16, 0x05, 0x15, 0x19, 0x05, 0x17, 0x19, 0x05, 0x1B, 0x16, 0x05, 0x1C, 0x16,
0x62, 0x09, 0xFF, 0x03, 0x65, 0xC0, 0x40, 0x03, 0x59, 0x8B, 0x40, 0x5F, 0x04, 0x00, 0x00, 0x00,
0x37, 0x83, 0x18, 0x05, 0x14, 0xFC, 0x03, 0x05, 0x16, 0xFC, 0x0D, 0x05, 0x15, 0xFC, 0x0E, 0x05,
0x17, 0xFC, 0x08, 0x05, 0x1B, 0xFC, 0x04, 0x05, 0x1C, 0xFC, 0x09, 0x6D, 0x15, 0x4E, 0x84, 0x03,
0x65, 0xC0, 0x40, 0x00, 0x4E, 0x85, 0x03, 0x59, 0x8B, 0x40, 0x00, 0x4E, 0xB6, 0x03, 0x59, 0x8B,
0x40, 0x00, 0x00, 0x1E, 0x22, 0x2A, 0xF0, 0x71, 0x5A, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x82,
0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x12, 0x05, 0x14, 0x19, 0x05, 0x16, 0x16, 0x05, 0x15, 0x19,
0x05, 0x17, 0x19, 0x05, 0x1B, 0x16, 0x05, 0x1C, 0x16, 0x62, 0x09, 0xFF, 0x03, 0x65, 0xC0, 0x40,
0x03, 0x59, 0x8B, 0x40, 0x5F, 0x04, 0x00, 0x00, 0x00, 0x37, 0x83, 0x18, 0x05, 0x14, 0xFC, 0x03,
0x05, 0x16, 0xFC, 0x0D, 0x05, 0x15, 0xFC, 0x0E, 0x05, 0x17, 0xFC, 0x08, 0x05, 0x1B, 0xFC, 0x04,
0x05, 0x1C, 0xFC, 0x09, 0x6D, 0x23, 0x4E, 0xE8, 0x03, 0x59, 0x8B, 0x40, 0x00, 0x4E, 0xE9, 0x03,
0x65, 0xC0, 0x40, 0x00, 0x4E, 0xEA, 0x03, 0x65, 0xC0, 0x40, 0x00, 0x4E, 0xFC, 0x03, 0x65, 0xC0,
0x40, 0x00, 0x4F, 0x10, 0x03, 0x65, 0xC0, 0x40, 0x00, 0x00, 0x1F, 0x22, 0x2A, 0xF0, 0x9B, 0x5A,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x82, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x12, 0x05, 0x14,
0x19, 0x05, 0x16, 0x16, 0x05, 0x15, 0x19, 0x05, 0x17, 0x19, 0x05, 0x1B, 0x16, 0x05, 0x1C, 0x16,
0x62, 0x09, 0xFF, 0x03, 0x65, 0xC0, 0x40, 0x03, 0x59, 0x8B, 0x40, 0x5F, 0x04, 0x00, 0x00, 0x00,
0x37, 0x83, 0x18, 0x05, 0x14, 0xFC, 0x03, 0x05, 0x16, 0xFC, 0x0D, 0x05, 0x15, 0xFC, 0x0E, 0x05,
0x17, 0xFC, 0x08, 0x05, 0x1B, 0xFC, 0x04, 0x05, 0x1C, 0xFC, 0x09, 0x6D, 0x4D, 0x4F, 0x4C, 0x03,
0x65, 0xC0, 0x40, 0x00, 0x4F, 0x4D, 0x03, 0x59, 0x8B, 0x40, 0x00, 0x4F, 0x56, 0x03, 0x59, 0x8B,
0x40, 0x00, 0x4F, 0x57, 0x03, 0x65, 0xC0, 0x40, 0x00, 0x4F, 0xB0, 0x03, 0x59, 0x8B, 0x40, 0x00,
0x4F, 0xBA, 0x03, 0x59, 0x8B, 0x40, 0x00, 0x4F, 0xC4, 0x03, 0x65, 0xC0, 0x40, 0x00, 0x4F, 0xCE,
0x03, 0x65, 0xC0, 0x40, 0x00, 0x50, 0x14, 0x03, 0x59, 0x8B, 0x40, 0x00, 0x50, 0x15, 0x03, 0x65,
0xC0, 0x40, 0x00, 0x50, 0x18, 0x03, 0x65, 0xC0, 0x40, 0x00, 0x09, 0xC8, 0x3C, 0x18,
};

PSIPTable si_table(si_data);
void TestMPEGTables::dvb_nit_test1(void)
{
PSIPTable si_table(au_nit_data);
QVERIFY (si_table.IsGood());
QVERIFY (si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
Expand Down Expand Up @@ -1601,6 +1665,70 @@ void TestMPEGTables::dvb_nit_test(void)
// No parsing of transport stream descriptors
}

void TestMPEGTables::dvb_nit_test2(void)
{
PSIPTable si_table(nz_nit_data);
QVERIFY (si_table.IsGood());
QVERIFY (si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
QCOMPARE (si_table.Length(), 987U);

// PSIP generic fields
NetworkInformationTable nit(si_table);
QCOMPARE (nit.SectionSyntaxIndicator(), true);
QCOMPARE (nit.PrivateIndicator(), true);
QCOMPARE (nit.SectionLengthRaw(), 987U);
QCOMPARE (nit.NetworkID(), 13313U);
QCOMPARE (nit.Version(), 24U);
QCOMPARE (nit.IsCurrent(), true);
QCOMPARE (nit.Section(), 0U);
QCOMPARE (nit.LastSection(), 1U);

// NIT specific fields
QCOMPARE (nit.NetworkDescriptorsLength(), 11U);
QCOMPARE (nit.NetworkName(), "Freeview ");

// NIT Transport Streams
// No parsing of transport stream descriptors
QCOMPARE (nit.TransportStreamDataLength(), 963U);
QCOMPARE (nit.TransportStreamCount(), 7U);

QCOMPARE (nit.TSID(0), 25U);
QCOMPARE (nit.OriginalNetworkID(0), 8746U);
QCOMPARE (nit.TransportDescriptorsLength(0), 138U);
QCOMPARE (nit.TransportDescriptors(0), nit.data()+29);

QCOMPARE (nit.TSID(1), 26U);
QCOMPARE (nit.OriginalNetworkID(1), 8746U);
QCOMPARE (nit.TransportDescriptorsLength(1), 127U);
QCOMPARE (nit.TransportDescriptors(1), nit.data()+173);

QCOMPARE (nit.TSID(2), 27U);
QCOMPARE (nit.OriginalNetworkID(2), 8746U);
QCOMPARE (nit.TransportDescriptorsLength(2), 162U);
QCOMPARE (nit.TransportDescriptors(2), nit.data()+306);

QCOMPARE (nit.TSID(3), 28U);
QCOMPARE (nit.OriginalNetworkID(3), 8746U);
QCOMPARE (nit.TransportDescriptorsLength(3), 127U);
QCOMPARE (nit.TransportDescriptors(3), nit.data()+474);

QCOMPARE (nit.TSID(4), 29U);
QCOMPARE (nit.OriginalNetworkID(4), 8746U);
QCOMPARE (nit.TransportDescriptorsLength(4), 99U);
QCOMPARE (nit.TransportDescriptors(4), nit.data()+607);

QCOMPARE (nit.TSID(5), 30U);
QCOMPARE (nit.OriginalNetworkID(5), 8746U);
QCOMPARE (nit.TransportDescriptorsLength(5), 113U);
QCOMPARE (nit.TransportDescriptors(5), nit.data()+712);

QCOMPARE (nit.TSID(6), 31U);
QCOMPARE (nit.OriginalNetworkID(6), 8746U);
QCOMPARE (nit.TransportDescriptorsLength(6), 155U);
QCOMPARE (nit.TransportDescriptors(6), nit.data()+831);
}

//
// DVB ServiceDescriptionTable Tests
//
Expand Down Expand Up @@ -1629,7 +1757,42 @@ const std::vector<uint8_t> au_sdt_data {
0x41, 0x08, 0x31, 0x30, 0x20, 0x53, 0x48, 0x41, 0x4B, 0x45, 0xBF, 0x08, 0x88, 0xE6,
};

void TestMPEGTables::dvb_sdt_test(void)
const std::vector<uint8_t> nz_sdt_actual_data {
0x42, 0xF0, 0x98, 0x00, 0x23, 0xCD, 0x00, 0x00, 0x22, 0x2A, 0xFF, 0x06, 0x40, 0xFF, 0x80, 0x37,
0x48, 0x19, 0x19, 0x06, 0x4B, 0x6F, 0x72, 0x64, 0x69, 0x61, 0x10, 0x4D, 0x61, 0x6F, 0x72, 0x69,
0x20, 0x54, 0x65, 0x6C, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x1A, 0x63, 0x72, 0x69,
0x64, 0x3A, 0x2F, 0x2F, 0x6D, 0x61, 0x6F, 0x72, 0x69, 0x74, 0x65, 0x6C, 0x65, 0x76, 0x69, 0x73,
0x69, 0x6F, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x06, 0x41, 0xFF, 0x80, 0x2D, 0x48, 0x0F, 0x19, 0x06,
0x4B, 0x6F, 0x72, 0x64, 0x69, 0x61, 0x06, 0x54, 0x65, 0x20, 0x52, 0x65, 0x6F, 0x73, 0x1A, 0x63,
0x72, 0x69, 0x64, 0x3A, 0x2F, 0x2F, 0x6D, 0x61, 0x6F, 0x72, 0x69, 0x74, 0x65, 0x6C, 0x65, 0x76,
0x69, 0x73, 0x69, 0x6F, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x3E, 0x80, 0xFC, 0x80, 0x19, 0x48, 0x17,
0x16, 0x06, 0x4B, 0x6F, 0x72, 0x64, 0x69, 0x61, 0x0E, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x65,
0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x31, 0xBF, 0x5E, 0x3C, 0x10,
};

const std::vector<uint8_t> nz_sdt_other_data {
0x46, 0xF1, 0x1E, 0x00, 0x1B, 0xD7, 0x00, 0x00, 0x22, 0x2A, 0xFF, 0x04, 0xB0, 0xFD, 0x80, 0x22,
0x48, 0x0D, 0x19, 0x04, 0x54, 0x56, 0x4E, 0x5A, 0x06, 0x54, 0x56, 0x4E, 0x5A, 0x20, 0x31, 0x73,
0x11, 0x63, 0x72, 0x69, 0x64, 0x3A, 0x2F, 0x2F, 0x74, 0x76, 0x6E, 0x7A, 0x2E, 0x63, 0x6F, 0x2E,
0x6E, 0x7A, 0x04, 0xB1, 0xFD, 0x80, 0x22, 0x48, 0x0D, 0x19, 0x04, 0x54, 0x56, 0x4E, 0x5A, 0x06,
0x54, 0x56, 0x4E, 0x5A, 0x20, 0x32, 0x73, 0x11, 0x63, 0x72, 0x69, 0x64, 0x3A, 0x2F, 0x2F, 0x74,
0x76, 0x6E, 0x7A, 0x2E, 0x63, 0x6F, 0x2E, 0x6E, 0x7A, 0x04, 0xB5, 0xFD, 0x80, 0x25, 0x48, 0x10,
0x19, 0x04, 0x54, 0x56, 0x4E, 0x5A, 0x09, 0x54, 0x56, 0x4E, 0x5A, 0x20, 0x44, 0x55, 0x4B, 0x45,
0x73, 0x11, 0x63, 0x72, 0x69, 0x64, 0x3A, 0x2F, 0x2F, 0x74, 0x76, 0x6E, 0x7A, 0x2E, 0x63, 0x6F,
0x2E, 0x6E, 0x7A, 0x04, 0xB6, 0xFD, 0x80, 0x25, 0x48, 0x10, 0x16, 0x04, 0x54, 0x56, 0x4E, 0x5A,
0x09, 0x54, 0x56, 0x4E, 0x5A, 0x20, 0x31, 0x20, 0x2B, 0x31, 0x73, 0x11, 0x63, 0x72, 0x69, 0x64,
0x3A, 0x2F, 0x2F, 0x74, 0x76, 0x6E, 0x7A, 0x2E, 0x63, 0x6F, 0x2E, 0x6E, 0x7A, 0x04, 0xB7, 0xFD,
0x80, 0x25, 0x48, 0x10, 0x16, 0x04, 0x54, 0x56, 0x4E, 0x5A, 0x09, 0x54, 0x56, 0x4E, 0x5A, 0x20,
0x32, 0x20, 0x2B, 0x31, 0x73, 0x11, 0x63, 0x72, 0x69, 0x64, 0x3A, 0x2F, 0x2F, 0x74, 0x76, 0x6E,
0x7A, 0x2E, 0x63, 0x6F, 0x2E, 0x6E, 0x7A, 0x04, 0xB8, 0xFD, 0x80, 0x27, 0x48, 0x12, 0x16, 0x04,
0x54, 0x56, 0x4E, 0x5A, 0x0B, 0x54, 0x56, 0x4E, 0x5A, 0x20, 0x44, 0x55, 0x4B, 0x45, 0x2B, 0x31,
0x73, 0x11, 0x63, 0x72, 0x69, 0x64, 0x3A, 0x2F, 0x2F, 0x74, 0x76, 0x6E, 0x7A, 0x2E, 0x63, 0x6F,
0x2E, 0x6E, 0x7A, 0x30, 0xD4, 0xFC, 0x80, 0x15, 0x48, 0x13, 0x0C, 0x04, 0x54, 0x56, 0x4E, 0x5A,
0x0C, 0x49, 0x4E, 0x46, 0x4F, 0x20, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0xA8, 0x57, 0xB0,
0xA2,
};

void TestMPEGTables::dvb_sdt_test1(void)
{
PSIPTable si_table(au_sdt_data);
QVERIFY (si_table.IsGood());
Expand Down Expand Up @@ -1681,6 +1844,7 @@ void TestMPEGTables::dvb_sdt_test(void)
QCOMPARE (sd->ServiceType(), 1U);
QCOMPARE (sd->ServiceProviderNameLength(), 3U);
QCOMPARE (sd->ServiceProviderName(), "SCA");
QCOMPARE (sd->ServiceProviderShortName(), "SCA");
QCOMPARE (sd->ServiceNameLength(), 8U);
QCOMPARE (sd->ServiceName(), "10 Peach");
}
Expand Down Expand Up @@ -1709,18 +1873,233 @@ void TestMPEGTables::dvb_sdt_test(void)
}
}

void TestMPEGTables::dvb_sdt_test2a(void)
{
PSIPTable si_table(nz_sdt_actual_data);
QVERIFY (si_table.IsGood());
QVERIFY (si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
QCOMPARE (si_table.Length(), 152U);

// PSIP generic fields
ServiceDescriptionTable sdt(si_table);
QCOMPARE (sdt.SectionSyntaxIndicator(), true);
QCOMPARE (sdt.PrivateIndicator(), true);
QCOMPARE (sdt.SectionLengthRaw(), 152U);
QCOMPARE (sdt.TSID(), 35U);
QCOMPARE (sdt.Version(), 6U);
QCOMPARE (sdt.IsCurrent(), true);
QCOMPARE (sdt.Section(), 0U);
QCOMPARE (sdt.LastSection(), 0U);

// SDT specific fields
QCOMPARE (sdt.OriginalNetworkID(), 8746U);
QCOMPARE (sdt.ServiceCount(), 3U);

QCOMPARE (sdt.ServiceID(0), 1600U);
QCOMPARE (sdt.HasEITSchedule(0), true);
QCOMPARE (sdt.HasEITPresentFollowing(0), true);
QCOMPARE (sdt.RunningStatus(0), 4U);
QCOMPARE (sdt.IsEncrypted(0), false);
QCOMPARE (sdt.ServiceDescriptorsLength(0), 55U);
QCOMPARE (sdt.ServiceDescriptors(0), sdt.data()+ 16);
{
ServiceDescriptor *sd0 = sdt.GetServiceDescriptor(0);
QCOMPARE (sd0->ServiceType(), 25U);
QCOMPARE (sd0->ServiceProviderNameLength(), 6U);
QCOMPARE (sd0->ServiceProviderName(), "Kordia");
QCOMPARE (sd0->ServiceProviderShortName(), "Kordia");
QCOMPARE (sd0->ServiceNameLength(), 16U);
QCOMPARE (sd0->ServiceName(), "Maori Television");
}

QCOMPARE (sdt.ServiceID(1), 1601U);
QCOMPARE (sdt.HasEITSchedule(1), true);
QCOMPARE (sdt.HasEITPresentFollowing(1), true);
QCOMPARE (sdt.RunningStatus(1), 4U);
QCOMPARE (sdt.IsEncrypted(1), false);
QCOMPARE (sdt.ServiceDescriptorsLength(1), 45U);
QCOMPARE (sdt.ServiceDescriptors(1), sdt.data()+ 76);
{
ServiceDescriptor *sd1 = sdt.GetServiceDescriptor(1);
QCOMPARE (sd1->ServiceType(), 25U);
QCOMPARE (sd1->ServiceProviderNameLength(), 6U);
QCOMPARE (sd1->ServiceProviderName(), "Kordia");
QCOMPARE (sd1->ServiceProviderShortName(), "Kordia");
QCOMPARE (sd1->ServiceNameLength(), 6U);
QCOMPARE (sd1->ServiceName(), "Te Reo");
}

QCOMPARE (sdt.ServiceID(2), 16000U);
QCOMPARE (sdt.HasEITSchedule(2), false);
QCOMPARE (sdt.HasEITPresentFollowing(2), false);
QCOMPARE (sdt.RunningStatus(2), 4U);
QCOMPARE (sdt.IsEncrypted(2), false);
QCOMPARE (sdt.ServiceDescriptorsLength(2), 25U);
QCOMPARE (sdt.ServiceDescriptors(2), sdt.data()+126);
{
ServiceDescriptor *sd2 = sdt.GetServiceDescriptor(2);
QCOMPARE (sd2->ServiceType(), 22U);
QCOMPARE (sd2->ServiceProviderNameLength(), 6U);
QCOMPARE (sd2->ServiceProviderName(), "Kordia");
QCOMPARE (sd2->ServiceProviderShortName(), "Kordia");
QCOMPARE (sd2->ServiceNameLength(), 14U);
QCOMPARE (sd2->ServiceName(), "Test Service 1");
}
}

void TestMPEGTables::dvb_sdt_test2o(void)
{
PSIPTable si_table(nz_sdt_other_data);
QVERIFY (si_table.IsGood());
QVERIFY (si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
QCOMPARE (si_table.Length(), 286U);

// PSIP generic fields
ServiceDescriptionTable sdt(si_table);
QCOMPARE (sdt.SectionSyntaxIndicator(), true);
QCOMPARE (sdt.PrivateIndicator(), true);
QCOMPARE (sdt.SectionLengthRaw(), 286U);
QCOMPARE (sdt.TSID(), 27U);
QCOMPARE (sdt.Version(), 11U);
QCOMPARE (sdt.IsCurrent(), true);
QCOMPARE (sdt.Section(), 0U);
QCOMPARE (sdt.LastSection(), 0U);

// SDT specific fields
QCOMPARE (sdt.OriginalNetworkID(), 8746U);
QCOMPARE (sdt.ServiceCount(), 7U);

QCOMPARE (sdt.ServiceID(0), 1200U);
QCOMPARE (sdt.HasEITSchedule(0), false);
QCOMPARE (sdt.HasEITPresentFollowing(0), true);
QCOMPARE (sdt.RunningStatus(0), 4U);
QCOMPARE (sdt.IsEncrypted(0), false);
QCOMPARE (sdt.ServiceDescriptorsLength(0), 34U);
QCOMPARE (sdt.ServiceDescriptors(0), sdt.data()+ 16);
{
ServiceDescriptor *sd0 = sdt.GetServiceDescriptor(0);
QCOMPARE (sd0->ServiceType(), 25U);
QCOMPARE (sd0->ServiceProviderNameLength(), 4U);
QCOMPARE (sd0->ServiceProviderName(), "TVNZ");
QCOMPARE (sd0->ServiceProviderShortName(), "TVNZ");
QCOMPARE (sd0->ServiceNameLength(), 6U);
QCOMPARE (sd0->ServiceName(), "TVNZ 1");
}

QCOMPARE (sdt.ServiceID(1), 1201U);
QCOMPARE (sdt.HasEITSchedule(1), false);
QCOMPARE (sdt.HasEITPresentFollowing(1), true);
QCOMPARE (sdt.RunningStatus(1), 4U);
QCOMPARE (sdt.IsEncrypted(1), false);
QCOMPARE (sdt.ServiceDescriptorsLength(1), 34U);
QCOMPARE (sdt.ServiceDescriptors(1), sdt.data()+ 55);
{
ServiceDescriptor *sd1 = sdt.GetServiceDescriptor(1);
QCOMPARE (sd1->ServiceType(), 25U);
QCOMPARE (sd1->ServiceProviderNameLength(), 4U);
QCOMPARE (sd1->ServiceProviderName(), "TVNZ");
QCOMPARE (sd1->ServiceProviderShortName(), "TVNZ");
QCOMPARE (sd1->ServiceNameLength(), 6U);
QCOMPARE (sd1->ServiceName(), "TVNZ 2");
}

QCOMPARE (sdt.ServiceDescriptors(2), sdt.data()+ 94);
QCOMPARE (sdt.ServiceDescriptors(3), sdt.data()+136);
QCOMPARE (sdt.ServiceDescriptors(4), sdt.data()+178);
QCOMPARE (sdt.ServiceDescriptors(5), sdt.data()+220);

QCOMPARE (sdt.ServiceID(6), 12500U);
QCOMPARE (sdt.HasEITSchedule(6), false);
QCOMPARE (sdt.HasEITPresentFollowing(6), false);
QCOMPARE (sdt.RunningStatus(6), 4U);
QCOMPARE (sdt.IsEncrypted(6), false);
QCOMPARE (sdt.ServiceDescriptorsLength(6), 21U);
QCOMPARE (sdt.ServiceDescriptors(6), sdt.data()+264);
{
ServiceDescriptor *sd6 = sdt.GetServiceDescriptor(6);
QCOMPARE (sd6->ServiceType(), 12U);
QCOMPARE (sd6->ServiceProviderNameLength(), 4U);
QCOMPARE (sd6->ServiceProviderName(), "TVNZ");
QCOMPARE (sd6->ServiceProviderShortName(), "TVNZ");
QCOMPARE (sd6->ServiceNameLength(), 12U);
QCOMPARE (sd6->ServiceName(), "INFO CHANNEL");
}
}

//
// DVB EventInformationTable Tests
//

const std::vector<uint8_t> nz_dvb_eit_data {
0x4E, 0xF0, 0xFD, 0x06, 0x41, 0xC1, 0x00, 0x01, 0x00, 0x23, 0x22, 0x2A, 0x01, 0x4E, 0x00, 0xB5,
0xE9, 0x7A, 0x11, 0x00, 0x00, 0x12, 0x30, 0x00, 0x80, 0xE2, 0x54, 0x02, 0x30, 0x00, 0x4D, 0xC6,
0x65, 0x6E, 0x67, 0x07, 0x05, 0x54, 0x65, 0x20, 0x52, 0x65, 0x6F, 0xBA, 0x05, 0x4D, 0x61, 0x6F,
0x72, 0x69, 0x20, 0x54, 0x65, 0x6C, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x70,
0x65, 0x63, 0x69, 0x61, 0x6C, 0x69, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65,
0x20, 0x73, 0x74, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x41, 0x6F, 0x74, 0x65,
0x61, 0x72, 0x6F, 0x61, 0x2E, 0x20, 0x42, 0x65, 0x20, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x74, 0x61,
0x69, 0x6E, 0x65, 0x64, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x65,
0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x77, 0x73, 0x2C, 0x20, 0x63, 0x75, 0x72,
0x72, 0x65, 0x6E, 0x74, 0x20, 0x61, 0x66, 0x66, 0x61, 0x69, 0x72, 0x73, 0x2C, 0x20, 0x73, 0x70,
0x6F, 0x72, 0x74, 0x73, 0x2C, 0x20, 0x64, 0x72, 0x61, 0x6D, 0x61, 0x2C, 0x20, 0x64, 0x6F, 0x63,
0x75, 0x6D, 0x65, 0x6E, 0x74, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D,
0x75, 0x63, 0x68, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x2E, 0x20, 0x47, 0x6F, 0x20, 0x74, 0x6F, 0x20,
0x77, 0x77, 0x77, 0x2E, 0x4D, 0x61, 0x6F, 0x72, 0x69, 0x74, 0x65, 0x6C, 0x65, 0x76, 0x69, 0x73,
0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x55, 0x04, 0x4E, 0x5A, 0x4C, 0x00, 0x50, 0x06, 0xF6, 0x03,
0x14, 0x6D, 0x61, 0x6F, 0x50, 0x06, 0xF5, 0x0B, 0x01, 0x6D, 0x61, 0x6F, 0x76, 0x8A, 0x5F, 0x20,
};

void TestMPEGTables::dvb_eit_test1(void)
{
PSIPTable si_table(nz_dvb_eit_data);
QVERIFY (si_table.IsGood());
QVERIFY (si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
QCOMPARE (si_table.Length(), 253U);

// PSIP generic fields
DVBEventInformationTable eit(si_table);
QCOMPARE (eit.SectionSyntaxIndicator(), true);
QCOMPARE (eit.PrivateIndicator(), true);
QCOMPARE (eit.SectionLengthRaw(), 253U);
QCOMPARE (eit.ServiceID(), 1601U);
QCOMPARE (eit.Version(), 0U);
QCOMPARE (eit.IsCurrent(), true);
QCOMPARE (eit.Section(), 0U);
QCOMPARE (eit.LastSection(), 1U);

// EIT specific fields
QCOMPARE (eit.TSID(), 35U);
QCOMPARE (eit.OriginalNetworkID(), 8746U);
QCOMPARE (eit.SegmentLastSectionNumber(), 1U);
QCOMPARE (eit.LastTableID(), 78U);

// EIT table data
QDateTime expectedDT {QDate(2022,07,10), QTime(11,00,00), Qt::UTC};
QCOMPARE (eit.EventID(0), 181U);
QCOMPARE (eit.StartTimeUTC(0), expectedDT);
QCOMPARE (eit.StartTimeUnixUTC(0), 1657450800U);
QCOMPARE (eit.EndTimeUnixUTC(0), 1657495800U);
QCOMPARE (eit.DurationInSeconds(0), 45000U);
QCOMPARE (eit.RunningStatus(0), 4U);
QCOMPARE (eit.IsScrambled(0), false);
QCOMPARE (eit.DescriptorsLength(0), 226U);
QCOMPARE (eit.Descriptors(0), eit.data()+26U);
}

//
// DVB TimeDateTable Tests
//

void TestMPEGTables::dvb_tdt_test(void)
void TestMPEGTables::dvb_tdt_test1(void)
{
const std::vector<uint8_t> si_data {
0x70, 0x70, 0x05, 0xE9, 0x69, 0x03, 0x46, 0x24,
};
QDateTime expectedDT { QDate(2022,06,23), QTime(03,46,24), Qt::UTC };
PSIPTable si_table(si_data);
QVERIFY (si_table.IsGood());
QVERIFY (!si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
QCOMPARE (si_table.Length(), 5U);
Expand All @@ -1734,6 +2113,64 @@ void TestMPEGTables::dvb_tdt_test(void)
QCOMPARE (tdt.UTC(), expectedDT);
}

void TestMPEGTables::dvb_tdt_test2(void)
{
const std::vector<uint8_t> nz_tdt_data {
0x70, 0x70, 0x05, 0xE9, 0x7A, 0x12, 0x23, 0x52,
};
QDateTime expectedDT { QDate(2022,07,10), QTime(12,23,52), Qt::UTC };
PSIPTable si_table(nz_tdt_data);
QVERIFY (!si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
QCOMPARE (si_table.Length(), 5U);

// PSIP generic fields
TimeDateTable tdt(si_table);
QCOMPARE (tdt.SectionSyntaxIndicator(), false);
QCOMPARE (tdt.SectionLengthRaw(), 5U);

// TDT specific fields
QCOMPARE (tdt.UTC(), expectedDT);
QCOMPARE (tdt.UTCUnix(), 1657455832U);
}

void TestMPEGTables::dvb_tot_test2(void)
{
const std::vector<uint8_t> nz_tot_data {
0x73, 0x70, 0x1A, 0xE9, 0x7A, 0x12, 0x23, 0x52, 0xF0, 0x0F, 0x58, 0x0D, 0x4E, 0x5A, 0x4C, 0x02,
0x12, 0x00, 0xE9, 0x17, 0x14, 0x00, 0x00, 0x12, 0x00, 0xF2, 0x8F, 0xF4, 0x04,
};
QDateTime expectedDT { QDate(2022,07,10), QTime(12,23,52), Qt::UTC };
PSIPTable si_table(nz_tot_data);
QVERIFY (si_table.HasCRC());
QVERIFY (si_table.VerifyCRC());
QCOMPARE (si_table.Length(), 26U);

// PSIP generic fields
TimeOffsetTable tot(si_table);
QCOMPARE (tot.SectionSyntaxIndicator(), false);
QCOMPARE (tot.SectionLengthRaw(), 26U);

// TOT specific fields
QCOMPARE (tot.UTC(), expectedDT);
QCOMPARE (tot.UTCUnix(), 1657455832U);

QCOMPARE (tot.DescriptorsLength(), 15U);
QCOMPARE (tot.Descriptors(), tot.data()+10U);

QDateTime ToCexpectedDT { QDate(2022,04,02), QTime(14,00,00), Qt::UTC };
LocalTimeOffsetDescriptor lto(tot.Descriptors(), tot.DescriptorsLength());
QCOMPARE (lto.Count(), 1U);
QCOMPARE (lto.CountryCode(0), 0x4E5A4CU);
QCOMPARE (lto.CountryCodeString(0), "NZL");
QCOMPARE (lto.CountryRegionId(0), 0U);
QCOMPARE (lto.LocalTimeOffsetPolarity(0), false);
QCOMPARE (lto.LocalTimeOffset(0), 720U);
QCOMPARE (lto.TimeOfChange(0), ToCexpectedDT);
QCOMPARE (lto.TimeOfChangeUnix(0), 1648908000U);
QCOMPARE (lto.NextTimeOffset(0), 720U);
}

void TestMPEGTables::dvbdate(void)
{
const std::array<uint8_t,5> dvbdate_data {
Expand Down
12 changes: 9 additions & 3 deletions mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,15 @@ class TestMPEGTables: public QObject
static void scte35_sit_test1(void);

//DVB Tables
static void dvb_nit_test(void);
static void dvb_sdt_test(void);
static void dvb_tdt_test(void);
static void dvb_nit_test1(void);
static void dvb_nit_test2(void);
static void dvb_sdt_test1(void);
static void dvb_sdt_test2a(void);
static void dvb_sdt_test2o(void);
static void dvb_eit_test1(void);
static void dvb_tdt_test1(void);
static void dvb_tdt_test2(void);
static void dvb_tot_test2(void);

static void dvbdate(void);

Expand Down