IPB

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> CRC error identification
Gajendran
post Apr 8 2009, 09:28 PM
Post #1


Participant


Group: New Members
Posts: 32
Joined: 28-March 08
Member No.: 9,875
Card: None


Dear all,

I have doubt on how to check the CRC error for PAT, PMT, SDT, NIT and EIT sections. I am little bit confused with the standards. Can anyone please help me to guide how to find out the CRC error PAT, PMT, SDT, NIT and EIT sections in a TS. I am just working on to implement ETR290 Priority 2.

Many thanks in advance.

Regards,
Gajendran
Go to the top of the page
 
+Quote Post
pclare
post Apr 11 2009, 05:21 PM
Post #2


Participant


Group: New Members
Posts: 56
Joined: 8-January 07
Member No.: 6,634
Card: Nova DVB-t


QUOTE (Gajendran @ Apr 8 2009, 12:28 PM) *
I have doubt on how to check the CRC error for PAT, PMT, SDT, NIT and EIT sections. I am little bit confused with the standards. Can anyone please help me to guide how to find out the CRC error PAT, PMT, SDT, NIT and EIT sections in a TS. I am just working on to implement ETR290 Priority 2.


It's standard CRC32, with the usual generator polynomial:

x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1

However, it differs from many common CRC32 implementations (e.g. as used in zip files) because the processing is big endian rather than little endian. The other difference is that after all of the bytes have been processed the resulting CRC bits are not inverted whereas the common little endian CRC32 does invert the bits. After processing, the CRC should be 0 (if no errors in the MPEG packet).

Pete
Go to the top of the page
 
+Quote Post
Gajendran
post Apr 17 2009, 05:32 PM
Post #3


Participant


Group: New Members
Posts: 32
Joined: 28-March 08
Member No.: 9,875
Card: None


QUOTE
It's standard CRC32, with the usual generator polynomial:

x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1


Dear Pete,

Thank you very much your reply.

I just confused with the above expression. I don't know how to cross check the CRC value I got from each section. I have all the data of each section including CRC but don't know what to do with this data. I mean I am very confused on what to do with each byte of the section. Please help me.

Kind regards,
Gajendran
Go to the top of the page
 
+Quote Post
pclare
post Apr 18 2009, 04:06 AM
Post #4


Participant


Group: New Members
Posts: 56
Joined: 8-January 07
Member No.: 6,634
Card: Nova DVB-t


QUOTE (Gajendran @ Apr 17 2009, 08:32 AM) *
I just confused with the above expression. I don't know how to cross check the CRC value I got from each section. I have all the data of each section including CRC but don't know what to do with this data. I mean I am very confused on what to do with each byte of the section. Please help me.


Process every byte, including the CRC bytes, in the MPEG packet by a big endian CRC32 function and the result should be 0 if no errors.

For example (pseudo code alert, this won't compile):

CODE

// you must supply this function
extern unsigned int bigEndianCRC32( unsigned char *pBuffer, unsigned int length );

MPEG_STREAM_BUFFER stream;

//(get MPEG packet into stream buffer)

if ( bigEndianCRC32( stream.pDataBuffer, stream.dwSizeOfDataRead ) == 0 )
{
//yay, CRC is OK
}
else
{
//oh dear, CRC error!
}


Pete
Go to the top of the page
 
+Quote Post
Gizmo
post Jul 8 2009, 01:25 AM
Post #5


Be nice to me, I am new.


Group: New Members
Posts: 2
Joined: 8-July 09
Member No.: 12,345
Card: None


QUOTE (pclare @ Apr 18 2009, 05:06 AM) *
Process every byte, including the CRC bytes, in the MPEG packet by a big endian CRC32 function and the result should be 0 if no errors.

For example (pseudo code alert, this won't compile):

CODE

// you must supply this function
extern unsigned int bigEndianCRC32( unsigned char *pBuffer, unsigned int length );

MPEG_STREAM_BUFFER stream;

//(get MPEG packet into stream buffer)

if ( bigEndianCRC32( stream.pDataBuffer, stream.dwSizeOfDataRead ) == 0 )
{
//yay, CRC is OK
}

else
{
//oh dear, CRC error!
}


Pete

Hi there,

To be honest, I have the same problem and I'm still struggling....

This is my test stream, the last 4 bytes build the CRC (615270532).

47 40 00 12 00 00 B0 11 00 01 C1 00 00 00 00 E0 1F 00 01 E1 00 24 AC 48 84

Now, the stream is an odd number of bytes. In which order do I have to move that stuff through the standard
Java function CRC32.update(byte x) ??

I tried all possible variants, none worked...

Any help will be very very much appreciated!!

Thanks,

Jean
Go to the top of the page
 
+Quote Post
Gizmo
post Jul 9 2009, 03:46 PM
Post #6


Be nice to me, I am new.


Group: New Members
Posts: 2
Joined: 8-July 09
Member No.: 12,345
Card: None


QUOTE (Gizmo @ Jul 8 2009, 02:25 AM) *
Hi there,

To be honest, I have the same problem and I'm still struggling....

This is my test stream, the last 4 bytes build the CRC (615270532).

47 40 00 12 00 00 B0 11 00 01 C1 00 00 00 00 E0 1F 00 01 E1 00 24 AC 48 84

Now, the stream is an odd number of bytes. In which order do I have to move that stuff through the standard
Java function CRC32.update(byte x) ??

I tried all possible variants, none worked...

Any help will be very very much appreciated!!

Thanks,

................................
Well, I finally found it! It's all done!
Gizmo
Go to the top of the page
 
+Quote Post
pclare
post Jul 10 2009, 03:31 AM
Post #7


Participant


Group: New Members
Posts: 56
Joined: 8-January 07
Member No.: 6,634
Card: Nova DVB-t


QUOTE (Gizmo @ Jul 7 2009, 04:25 PM) *
Now, the stream is an odd number of bytes. In which order do I have to move that stuff through the standard
Java function CRC32.update(byte x) ??


Just process the bytes in the order that they are in the packet buffer. I know nothing about the Java CRC32 function but I suspect that it is doing the (more common) little endian CRC32 (e.g. as used in zip files). As I said earlier in this thread, you need to do a big endian CRC32.

I don't have any specific links to code to hand but the Wikipedia page on CRC32 provides a good starting point and a google search for "mpeg" and "crc32" results in dozens of hits.

Pete
Go to the top of the page
 
+Quote Post
lmodern
post May 19 2010, 11:29 PM
Post #8


Be nice to me, I am new.


Group: New Members
Posts: 1
Joined: 19-May 10
Member No.: 13,421
Card: None


This code snippet from dvbsnoop works perfectly ok for MPEG TS/DVB-like CRC calculations. You can find it in src/misc/crc32.c

CODE
#include <sys/types.h>
#include "crc32.h"

// CRC32 lookup table for polynomial 0x04c11db7
static u_long 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,
        0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
        0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
        0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
        0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
        0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
        0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
        0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
        0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
        0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
        0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
        0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
        0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
        0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
        0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
        0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
        0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
        0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
        0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
        0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
        0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
        0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
        0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
        0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
        0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
        0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
        0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
        0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
        0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
        0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
        0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
        0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
        0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4};

u_long crc32 (char *data, int len)
{
        register int i;
        u_long crc = 0xffffffff;

        for (i=0; i<len; i++)
                crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *data++) & 0xff];

        return crc;
}
Go to the top of the page
 
+Quote Post
NZ Steve
post May 20 2010, 08:12 AM
Post #9


Participant


Group: New Members
Posts: 43
Joined: 2-February 09
Member No.: 11,797
Card: None


I never managed to get a CSharp version working. Here was the code.

uint crc = 0xffffffff

for (int index = 0; index < blockBytes.Length; index++)
crc = (crc << 8) ^ crctab[((crc >> 24) ^ blockBytes[index]) & 0xff];

The crctab contained the correct values.

I gave up in the end. I suspected that maybe the S+T filter was swapping some bytes around in the header
Go to the top of the page
 
+Quote Post
NZ Steve
post Jun 4 2010, 08:26 AM
Post #10


Participant


Group: New Members
Posts: 43
Joined: 2-February 09
Member No.: 11,797
Card: None


QUOTE (NZ Steve @ May 20 2010, 10:12 AM) *
I never managed to get a CSharp version working. Here was the code.

uint crc = 0xffffffff

for (int index = 0; index < blockBytes.Length; index++)
crc = (crc << 8) ^ crctab[((crc >> 24) ^ blockBytes[index]) & 0xff];

The crctab contained the correct values.

I gave up in the end. I suspected that maybe the S+T filter was swapping some bytes around in the header

For anybody's future reference any section retrieved from the Sections and Tables filter has the length bytes and the table extension bytes swapped which causes the crc calculation to fail.

If you swap them back the calculation above works. Also if you obtain the sections independent of the S+T filter (eg add another pin to the demux and map the required pid's) the bytes are not swapped.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 



RSS Lo-Fi Version Time is now: 14th December 2018 - 05:42 AM