revolt
Full Member level 2
pat mpeg
Hi guys,
at the moment I'm building a transport stream filter for DVB-S. When I filter one program out of the stream my0 MPEG-player says that I is not a valid MPEG2 stream because in the PAT are still several programs announced. So I have to modify the PAT and that is where have my problem.
The PAT is secured by a CRC32. I have some PAT from real transport stream and tried to calculate the checksum but the result differs from the real one.
I've found two implementations of the CRC32 but with both I don't get the right result.
Has somebody done this before and give my some hints?
regards revolt
1. CRC32:
CRC Table
Calculation
2nd one:
table generation
crc calculation
Hi guys,
at the moment I'm building a transport stream filter for DVB-S. When I filter one program out of the stream my0 MPEG-player says that I is not a valid MPEG2 stream because in the PAT are still several programs announced. So I have to modify the PAT and that is where have my problem.
The PAT is secured by a CRC32. I have some PAT from real transport stream and tried to calculate the checksum but the result differs from the real one.
I've found two implementations of the CRC32 but with both I don't get the right result.
Has somebody done this before and give my some hints?
regards revolt
1. CRC32:
CRC Table
Code:
static const unsigned int crc_table[256] = {
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
.................................
Code:
unsigned int chksum1_crc32 (unsigned char *block, unsigned int length)
{
register unsigned long crc;
unsigned long i;
crc = 0xFFFFFFFF;
for (i = 0; i < length; i++)
{
crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF];
}
return (crc ^ 0xFFFFFFFF);
}
2nd one:
table generation
Code:
void chksum_crc32gentab (void)
{
unsigned long crc, poly;
int i, j;
poly = 0xEDB88320L;
for (i = 0; i < 256; i++)
{
crc = i;
for (j = 8; j > 0; j--)
{
if (crc & 1)
{
crc = (crc >> 1) ^ poly;
}
else
{
crc >>= 1;
}
}
crc_tab[i] = crc;
}
}
Code:
unsigned int chksum2_crc32(const unsigned char *data, int len)
{
register int i;
unsigned int crc = 0xffffffff;
for (i=0; i<len; i++)
crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *data++) & 0xff];
return crc;
}