diff --git a/lib/checksum.h b/lib/checksum.h index c674b3e5..5593627c 100644 --- a/lib/checksum.h +++ b/lib/checksum.h @@ -1,5 +1,5 @@ namespace checksum { - inline unsigned int crc32(unsigned int crc, const char * data, size_t len) { + inline unsigned int crc32c(unsigned int crc, const char * data, size_t len) { static const unsigned int table[256] = { 0x00000000U, 0x04C11DB7U, 0x09823B6EU, 0x0D4326D9U, 0x130476DCU, 0x17C56B6BU, 0x1A864DB2U, 0x1E475005U, @@ -74,4 +74,156 @@ namespace checksum { } return crc; } + + inline unsigned int crc32LE(unsigned int crc, const char * data, size_t len) { + static const unsigned int table[256] = { + 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, + 0x076dc419U, 0x706af48fU, 0xe963a535U, 0x9e6495a3U, + 0x0edb8832U, 0x79dcb8a4U, 0xe0d5e91eU, 0x97d2d988U, + 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, 0x90bf1d91U, + 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, + 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, + 0x136c9856U, 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, + 0x14015c4fU, 0x63066cd9U, 0xfa0f3d63U, 0x8d080df5U, + 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, 0xa2677172U, + 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, + 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, + 0x32d86ce3U, 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, + 0x26d930acU, 0x51de003aU, 0xc8d75180U, 0xbfd06116U, + 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, 0xb8bda50fU, + 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, + 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, + 0x76dc4190U, 0x01db7106U, 0x98d220bcU, 0xefd5102aU, + 0x71b18589U, 0x06b6b51fU, 0x9fbfe4a5U, 0xe8b8d433U, + 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, 0xe10e9818U, + 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, + 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, + 0x6c0695edU, 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, + 0x65b0d9c6U, 0x12b7e950U, 0x8bbeb8eaU, 0xfcb9887cU, + 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, 0xfbd44c65U, + 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, + 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, + 0x4369e96aU, 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, + 0x44042d73U, 0x33031de5U, 0xaa0a4c5fU, 0xdd0d7cc9U, + 0x5005713cU, 0x270241aaU, 0xbe0b1010U, 0xc90c2086U, + 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, + 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, + 0x59b33d17U, 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, + 0xedb88320U, 0x9abfb3b6U, 0x03b6e20cU, 0x74b1d29aU, + 0xead54739U, 0x9dd277afU, 0x04db2615U, 0x73dc1683U, + 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, + 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, + 0xf00f9344U, 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, + 0xf762575dU, 0x806567cbU, 0x196c3671U, 0x6e6b06e7U, + 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, 0x67dd4accU, + 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, + 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, + 0xd1bb67f1U, 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, + 0xd80d2bdaU, 0xaf0a1b4cU, 0x36034af6U, 0x41047a60U, + 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, 0x4669be79U, + 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, + 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, + 0xc5ba3bbeU, 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, + 0xc2d7ffa7U, 0xb5d0cf31U, 0x2cd99e8bU, 0x5bdeae1dU, + 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, 0x026d930aU, + 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, + 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, + 0x92d28e9bU, 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, + 0x86d3d2d4U, 0xf1d4e242U, 0x68ddb3f8U, 0x1fda836eU, + 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, 0x18b74777U, + 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, + 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, + 0xa00ae278U, 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, + 0xa7672661U, 0xd06016f7U, 0x4969474dU, 0x3e6e77dbU, + 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, 0x37d83bf0U, + 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, + 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, + 0xbad03605U, 0xcdd70693U, 0x54de5729U, 0x23d967bfU, + 0xb3667a2eU, 0xc4614ab8U, 0x5d681b02U, 0x2a6f2b94U, + 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, 0x2d02ef8dU + }; + + while (len > 0) { + crc = table[*data ^ ((crc >> 24) & 0xff)] ^ (crc << 8); + data++; + len--; + } + return crc; + } + + inline unsigned int crc32(unsigned int crc, const char * data, size_t len) { + static const unsigned int table[256] = { + 0x00000000U, 0xB71DC104U, 0x6E3B8209U, 0xD926430DU, + 0xDC760413U, 0x6B6BC517U, 0xB24D861AU, 0x0550471EU, + 0xB8ED0826U, 0x0FF0C922U, 0xD6D68A2FU, 0x61CB4B2BU, + 0x649B0C35U, 0xD386CD31U, 0x0AA08E3CU, 0xBDBD4F38U, + 0x70DB114CU, 0xC7C6D048U, 0x1EE09345U, 0xA9FD5241U, + 0xACAD155FU, 0x1BB0D45BU, 0xC2969756U, 0x758B5652U, + 0xC836196AU, 0x7F2BD86EU, 0xA60D9B63U, 0x11105A67U, + 0x14401D79U, 0xA35DDC7DU, 0x7A7B9F70U, 0xCD665E74U, + 0xE0B62398U, 0x57ABE29CU, 0x8E8DA191U, 0x39906095U, + 0x3CC0278BU, 0x8BDDE68FU, 0x52FBA582U, 0xE5E66486U, + 0x585B2BBEU, 0xEF46EABAU, 0x3660A9B7U, 0x817D68B3U, + 0x842D2FADU, 0x3330EEA9U, 0xEA16ADA4U, 0x5D0B6CA0U, + 0x906D32D4U, 0x2770F3D0U, 0xFE56B0DDU, 0x494B71D9U, + 0x4C1B36C7U, 0xFB06F7C3U, 0x2220B4CEU, 0x953D75CAU, + 0x28803AF2U, 0x9F9DFBF6U, 0x46BBB8FBU, 0xF1A679FFU, + 0xF4F63EE1U, 0x43EBFFE5U, 0x9ACDBCE8U, 0x2DD07DECU, + 0x77708634U, 0xC06D4730U, 0x194B043DU, 0xAE56C539U, + 0xAB068227U, 0x1C1B4323U, 0xC53D002EU, 0x7220C12AU, + 0xCF9D8E12U, 0x78804F16U, 0xA1A60C1BU, 0x16BBCD1FU, + 0x13EB8A01U, 0xA4F64B05U, 0x7DD00808U, 0xCACDC90CU, + 0x07AB9778U, 0xB0B6567CU, 0x69901571U, 0xDE8DD475U, + 0xDBDD936BU, 0x6CC0526FU, 0xB5E61162U, 0x02FBD066U, + 0xBF469F5EU, 0x085B5E5AU, 0xD17D1D57U, 0x6660DC53U, + 0x63309B4DU, 0xD42D5A49U, 0x0D0B1944U, 0xBA16D840U, + 0x97C6A5ACU, 0x20DB64A8U, 0xF9FD27A5U, 0x4EE0E6A1U, + 0x4BB0A1BFU, 0xFCAD60BBU, 0x258B23B6U, 0x9296E2B2U, + 0x2F2BAD8AU, 0x98366C8EU, 0x41102F83U, 0xF60DEE87U, + 0xF35DA999U, 0x4440689DU, 0x9D662B90U, 0x2A7BEA94U, + 0xE71DB4E0U, 0x500075E4U, 0x892636E9U, 0x3E3BF7EDU, + 0x3B6BB0F3U, 0x8C7671F7U, 0x555032FAU, 0xE24DF3FEU, + 0x5FF0BCC6U, 0xE8ED7DC2U, 0x31CB3ECFU, 0x86D6FFCBU, + 0x8386B8D5U, 0x349B79D1U, 0xEDBD3ADCU, 0x5AA0FBD8U, + 0xEEE00C69U, 0x59FDCD6DU, 0x80DB8E60U, 0x37C64F64U, + 0x3296087AU, 0x858BC97EU, 0x5CAD8A73U, 0xEBB04B77U, + 0x560D044FU, 0xE110C54BU, 0x38368646U, 0x8F2B4742U, + 0x8A7B005CU, 0x3D66C158U, 0xE4408255U, 0x535D4351U, + 0x9E3B1D25U, 0x2926DC21U, 0xF0009F2CU, 0x471D5E28U, + 0x424D1936U, 0xF550D832U, 0x2C769B3FU, 0x9B6B5A3BU, + 0x26D61503U, 0x91CBD407U, 0x48ED970AU, 0xFFF0560EU, + 0xFAA01110U, 0x4DBDD014U, 0x949B9319U, 0x2386521DU, + 0x0E562FF1U, 0xB94BEEF5U, 0x606DADF8U, 0xD7706CFCU, + 0xD2202BE2U, 0x653DEAE6U, 0xBC1BA9EBU, 0x0B0668EFU, + 0xB6BB27D7U, 0x01A6E6D3U, 0xD880A5DEU, 0x6F9D64DAU, + 0x6ACD23C4U, 0xDDD0E2C0U, 0x04F6A1CDU, 0xB3EB60C9U, + 0x7E8D3EBDU, 0xC990FFB9U, 0x10B6BCB4U, 0xA7AB7DB0U, + 0xA2FB3AAEU, 0x15E6FBAAU, 0xCCC0B8A7U, 0x7BDD79A3U, + 0xC660369BU, 0x717DF79FU, 0xA85BB492U, 0x1F467596U, + 0x1A163288U, 0xAD0BF38CU, 0x742DB081U, 0xC3307185U, + 0x99908A5DU, 0x2E8D4B59U, 0xF7AB0854U, 0x40B6C950U, + 0x45E68E4EU, 0xF2FB4F4AU, 0x2BDD0C47U, 0x9CC0CD43U, + 0x217D827BU, 0x9660437FU, 0x4F460072U, 0xF85BC176U, + 0xFD0B8668U, 0x4A16476CU, 0x93300461U, 0x242DC565U, + 0xE94B9B11U, 0x5E565A15U, 0x87701918U, 0x306DD81CU, + 0x353D9F02U, 0x82205E06U, 0x5B061D0BU, 0xEC1BDC0FU, + 0x51A69337U, 0xE6BB5233U, 0x3F9D113EU, 0x8880D03AU, + 0x8DD09724U, 0x3ACD5620U, 0xE3EB152DU, 0x54F6D429U, + 0x7926A9C5U, 0xCE3B68C1U, 0x171D2BCCU, 0xA000EAC8U, + 0xA550ADD6U, 0x124D6CD2U, 0xCB6B2FDFU, 0x7C76EEDBU, + 0xC1CBA1E3U, 0x76D660E7U, 0xAFF023EAU, 0x18EDE2EEU, + 0x1DBDA5F0U, 0xAAA064F4U, 0x738627F9U, 0xC49BE6FDU, + 0x09FDB889U, 0xBEE0798DU, 0x67C63A80U, 0xD0DBFB84U, + 0xD58BBC9AU, 0x62967D9EU, 0xBBB03E93U, 0x0CADFF97U, + 0xB110B0AFU, 0x060D71ABU, 0xDF2B32A6U, 0x6836F3A2U, + 0x6D66B4BCU, 0xDA7B75B8U, 0x035D36B5U, 0xB440F7B1U + }; + + while (len > 0) { + crc = table[*data ^ ((crc >> 24) & 0xff)] ^ (crc << 8); + data++; + len--; + } + return crc; + } } diff --git a/lib/ogg.cpp b/lib/ogg.cpp index 4ff829cf..30e7c3b6 100644 --- a/lib/ogg.cpp +++ b/lib/ogg.cpp @@ -349,7 +349,7 @@ namespace OGG { long unsigned int retVal = 0; long unsigned int oldChecksum = getCRCChecksum(); setCRCChecksum(0); - retVal = checksum::crc32(0, data, getPageSize()); + retVal = checksum::crc32c(0, data, getPageSize()); setCRCChecksum(oldChecksum); return retVal; } diff --git a/lib/ts_packet.cpp b/lib/ts_packet.cpp index c8d5a8bc..0dc4e31d 100644 --- a/lib/ts_packet.cpp +++ b/lib/ts_packet.cpp @@ -690,6 +690,13 @@ namespace TS { } + ProgramMappingTable::ProgramMappingTable(){ + strBuf.resize(4); + strBuf[0] = 0x47; + strBuf[1] = 0x50; + strBuf[2] = 0x00; + strBuf[3] = 0x10; + } char ProgramMappingTable::getOffset() { unsigned int loc = 4 + (AdaptationField() > 1 ? AdaptationFieldLen() + 1 : 0); @@ -767,7 +774,7 @@ namespace TS { if (strBuf.size() < loc + 1) { strBuf.resize(loc + 1); } - strBuf[loc] = (((char)newVal) << 1) | 0xFD; + strBuf[loc] = (((char)newVal) << 1) | (strBuf[loc] & 0xFD) | 0xC1; } ///Retrieves the section number @@ -810,7 +817,7 @@ namespace TS { if (strBuf.size() < loc + 2) { strBuf.resize(loc + 2); } - strBuf[loc] = (char)((newVal >> 8) & 0x1F) | 0xE0; + strBuf[loc] = (char)((newVal >> 8) & 0x1F) | 0xE0;//Note: here we set reserved bits on 1 strBuf[loc+1] = (char)newVal; } @@ -824,7 +831,7 @@ namespace TS { if (strBuf.size() < loc + 2) { strBuf.resize(loc + 2); } - strBuf[loc] = (char)((newVal >> 8) & 0x0F) | 0xF0; + strBuf[loc] = (char)((newVal >> 8) & 0x0F) | 0xF0;//Note: here we set reserved bits on 1 strBuf[loc+1] = (char)newVal; } @@ -905,12 +912,13 @@ namespace TS { unsigned int loc = 4 + (AdaptationField() > 1 ? AdaptationFieldLen() + 1 : 0) + getOffset() + 13 + getProgramInfoLength() + (getProgramCount() * 5); //return ((int)(strBuf[loc]) << 24) | ((int)(strBuf[loc + 1]) << 16) | ((int)(strBuf[loc + 2]) << 8) | strBuf[loc + 3]; unsigned int newVal;//this will hold the CRC32 value; - unsigned int tidLoc = 4 + (AdaptationField() > 1 ? AdaptationFieldLen() + 1 : 0) + getOffset() + 1;//location of table ID - newVal = checksum::crc32(0, strBuf.c_str() + tidLoc, loc - tidLoc);//calculating checksum over all the fields from table ID to the last stream element + unsigned int pidLoc = 4 + (AdaptationField() > 1 ? AdaptationFieldLen() + 1 : 0) + getOffset() + 9;;//location of PCRPID + + newVal = checksum::crc32(0, strBuf.c_str() + pidLoc, loc - pidLoc);//calculating checksum over all the fields from table ID to the last stream element if (strBuf.size() < 188) { strBuf.resize(188); } - strBuf[loc] = newVal >> 24; + strBuf[loc] = (newVal >> 24) & 0xFF; strBuf[loc + 1] = (newVal >> 16) & 0xFF; strBuf[loc + 2] = (newVal >> 8) & 0xFF; strBuf[loc + 3] = newVal & 0xFF; diff --git a/lib/ts_packet.h b/lib/ts_packet.h index 79a63564..05a258fc 100644 --- a/lib/ts_packet.h +++ b/lib/ts_packet.h @@ -110,6 +110,7 @@ namespace TS { class ProgramMappingTable : public Packet { public: + ProgramMappingTable(); char getOffset(); void setOffset(char newVal); char getTableId();