ATSC Data Types
Starting with an mpeg 2 transport stream, we have packets of 188 bytes, composed of 187 bytes
of data, and one sync byte of 71, or 0x47.
>>> atsc.ATSC_MPEG_PKT_LENGTH
188
>>> atsc.MPEG_SYNC_BYTE
71
The first module in our transmit chain, atsc.randomizer(), takes the 188 byte
packets, varifies the presence of and strips off the sync byte, emitting 187 byte packets called
>>> atsc.MPEG_DATA_LENGTH
187
Notice, however that
>>> atsc.sizeof_mpeg_packet
256
Explaination from gr-atsc/src/python/qa_atsc.py:
An MPEG transport stream packet is 188 bytes long. Internally we use a packet
that is 256 bytes long to help with buffer alignment.
>>> atsc.sizeof_atsc_mpeg_packet_pad
68
Which is the padding needed to fill a 188 byte mpeg packet out to 256 bytes.
From the randomizer, 187 byte packets flow into the Reed Solomon encoder
where 20 bytes of forward error correction parity bytes are computed and
appended. This allows up to 10 byte-errors per packet, and creates another
data type to deal with.
>>> atsc.ATSC_MPEG_RS_ENCODED_LENGTH
207
>>> atsc.sizeof_atsc_mpeg_packet_rs_encoded
256
>>> atsc.sizeof_atsc_mpeg_packet_rs_encoded_pad
45
The observant will notice the above does NOT add up: 256 - 45 is 211, not
207. It turns out, from atsc_types.h, there are 2 ints (4 bytes) that
carry pipeline info along with the data.
The 207 byte RS-encoded packets (211 counting pipeline info) next flow into the atsci.interleaver() and
exit still as 207 byte packets. The interleaver performes the function of
spreading data over time so that a single burst of noise is broken up into
smaller errors the Reed Solomon coding can, hopefully, recover from.
After the interleaver, 207 data-byte packets flow into the Trellis Encoder
where things get really interesting. Here each byte is broken up into 4 2-bit
symbols and convolutionally encoded into 3-bit, 8-level symbols, and the
mpeg packet becomes a Data Segment or 4 * 207 or 828 symbols, each having
a value from 0 to 7, or eight levels. gr-atsc makes use of another form of
data segment, the "soft" data segment where the symbols are represented
by the floating point numbers -7 -5 -3 -1 +1 +3 +5 +7.
>>> atsc.ATSC_DATA_SEGMENT_LENGTH
832
>>> atsc.sizeof_atsc_data_segment
1024
>>> atsc.sizeof_atsc_data_segment_pad
188
>>> atsc.sizeof_atsc_soft_data_segment
4096
>>> atsc.sizeof_atsc_soft_data_segment_pad
764
A data segment is 828 ( 207 * 4 ) plus 4 sync symbols at the beginning
(see gr-atsc/src/lib/atsc_consts.h).
A ds pad of 188 from 1024 is 836, or 832 plus the 4 pipeline bytes.
The 'soft' data segments are 4 times bigger since floating point entities
are 4 bytes.
from gr-atsc/src/python/atsc_utils.py:
FYI, each ATSC Data Frame contains two Data Fields, each of which contains
312 data segments. Each transport stream packet maps to a data segment.
Now lets look at some packets and find some features. Here is couple of
fake trasport stream packets dumped to a file from qa_atsc.py:
00000000 47 6d fd 22 57 9e 6f c5 37 d9 5f 5f 76 79 c0 6e |Gm."W.o.7.__vy.n|
00000010 be c4 3f a2 04 89 06 9e 6d 6a c2 35 6a 3d 2a af |..?.....mj.5j=*.|
00000020 95 1c 36 a9 8f 79 51 4e b3 9b 89 3a df d0 b8 1f |..6..yQN...:....|
00000030 cb be 69 af 92 56 fe 8c d1 c9 ce 19 d6 8e 4d 06 |..i..V........M.|
00000040 a8 c7 58 89 b1 22 79 5f 3b ae fa fa e9 ef 8e 07 |..X.."y_;.......|
00000050 cb 27 e8 50 ec 75 37 e5 82 cc 38 dd d6 6e ba 44 |.'.P.u7...8..n.D|
00000060 9d 89 ad 9e d8 99 1e 78 28 c7 dd a2 cf 90 b3 56 |.......x(......V|
00000070 3a d4 32 12 c6 88 39 a1 bc 89 e4 14 95 08 95 c3 |:.2...9.........|
00000080 13 a8 ad 4a 66 16 7d c2 4d a4 61 13 1d e1 66 51 |...Jf.}.M.a...fQ|
00000090 4c e7 97 39 2b f2 ac 3f 54 a6 f4 63 ec 5e b4 91 |L..9+..?T..c.^..|
000000a0 64 19 e6 05 20 8a 4b 53 60 dd ca d8 0f f1 e0 84 |d... .KS`.......|
000000b0 7a b9 c6 42 b0 a4 93 60 c3 ac 06 06 00 00 00 00 |z..B...`........|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100 47 0d e6 bf 4e 3a cc 03 6c 36 57 3e 9d 1d ce 88 |G...N:..l6W>....|
00000110 f9 96 0c aa be cc 63 21 70 b8 e1 4f 92 91 0d b2 |......c!p..O....|
00000120 da 03 e4 93 07 10 95 4a 31 cd 84 2d 1f b9 06 44 |.......J1..-...D|
00000130 6e d4 33 6a c3 c9 13 fb df 83 cc 3a a7 7f a5 af |n.3j.......:....|
00000140 f0 95 40 dd ba a0 d4 72 a2 72 29 ae 6e 85 46 03 |..@....r.r).n.F.|
00000150 be cd 72 db b0 f2 54 6f 83 3a 5b b8 15 99 cb f9 |..r...To.:[.....|
00000160 9a 09 63 3a 36 9a 06 00 92 60 09 02 08 86 9e b4 |..c:6....`......|
00000170 45 87 98 ac fc 96 47 07 5e dd 08 67 dc 42 45 18 |E.....G.^..g.BE.|
00000180 f4 23 d9 54 2e 44 eb 78 4e 71 bc d3 68 e4 db 49 |.#.T.D.xNq..h..I|
00000190 1d 03 66 ea 48 04 dc ff 1a 7d b0 d6 7a bc a1 3d |..f.H....}..z..=|
000001a0 60 fc b3 f1 d6 fb c8 d1 bd f6 a5 6e 84 59 1f 90 |`..........n.Y..|
000001b0 48 31 94 32 59 2b 79 90 38 39 33 e5 00 00 00 00 |H1.2Y+y.893.....|
000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
The only thing significant in the above are the 0x47 mpeg sync bytes
at the beginning of each packet, and it's following byte should never
have the top transport-error bit on. Other than the sync byte, it's
187 random bytes, 188 total.
Running different data (seperate run, a different fake stream) thru the randomizer stage, we get this:
00000000 09 00 00 00 da 3f 57 b0 5f 98 f8 9a d4 54 db bb |.....?W._....T..|
00000010 a4 1d a9 4b fb 00 ba dd ee c6 d0 8d 76 c5 f0 0e |...K........v...|
00000020 f2 fc d7 61 28 be 92 49 2d 3a c4 9c 65 46 ff 16 |...a(..I-:..eF..|
00000030 da 4c 77 26 3b e7 e5 7e 43 55 1e fd e8 8f 45 65 |.Lw&;..~CU....Ee|
00000040 3c 15 f0 63 c2 9a f8 54 40 67 46 fd 22 ff 39 66 |<..c...T@gF.".9f|
00000050 93 92 35 21 c4 27 a6 8b 1a 6d f8 c3 4c d1 04 13 |..5!.'...m..L...|
00000060 3f bd 0f 3e 7b e7 97 90 15 c1 2b c4 13 45 39 6a |?..>{.....+..E9j|
00000070 9f 6d c1 5a d7 ec 5e 7f eb 83 6e 0e 47 f6 aa 5c |.m.Z..^...n.G..\|
00000080 25 77 04 0f 94 63 fc c0 ce 31 78 de 2b 3b 31 c0 |%w...c...1x.+;1.|
00000090 73 09 eb f3 9e ce 91 b3 c1 2b 28 dc 15 91 08 17 |s........+(.....|
000000a0 a2 c9 d1 ff dd 28 28 bb d1 c7 6d 1c 87 44 f0 59 |.....((...m..D.Y|
000000b0 cc 2c 08 1e f7 27 47 02 88 15 70 a2 47 fa 83 00 |.,...'G...p.G...|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100 01 00 01 00 ed 5d c5 34 57 fa 54 a5 82 b7 3a e4 |.....].4W.T...:.|
00000110 a5 13 ef 42 0a 12 fe f5 12 0d 81 58 6e a3 e0 fa |...B.......Xn...|
00000120 ad 55 c8 63 0e 1e 6a 08 0d e2 ed 9c 8e 58 8f 69 |.U.c..j......X.i|
00000130 25 9d bf 1a f3 d9 58 02 36 a2 8d 4e b8 9f 47 7a |%.....X.6..N..Gz|
00000140 de ec da 0b 70 d7 23 ce 30 6b a9 1a 45 73 67 d0 |....p.#.0k..Esg.|
00000150 82 82 be e2 78 cc e3 55 2b 59 d9 a8 27 b2 b4 a1 |....x..U+Y..'...|
00000160 13 a6 56 24 af 19 9a 65 e1 0c f6 aa 10 ea 1d 60 |..V$...e.......`|
00000170 34 c0 dc 9c 64 cd fc d7 60 b7 ba 7a 87 bd 6c 20 |4...d...`..z..l |
00000180 65 49 7b e2 5a cf 23 75 44 0c bc 03 b5 48 2a ec |eI{.Z.#uD....H*.|
00000190 1c fc 17 82 22 99 88 d9 60 77 5d af e4 23 a5 df |...."...`w]..#..|
000001a0 55 d0 31 9a cc bc a8 03 b2 ea 0c aa 7e e3 16 7d |U.1.........~..}|
000001b0 26 64 9c f6 e4 b4 e6 ac 4f 6c fb 8d 37 ef 8c 00 |&d......Ol..7...|
000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
Here we see the 0x47 mpeg sync bytes are stripped off, and in their place
appear 4 pipeline control bytes - actually two ints in LO HI, LO HI format.
0009 0000 in the 1st packet, and 0001 and 0001 in the next. These are
flags and a segment number. The Flags, from atsc_types.h are:
// these three are mutually exclusive
// This is a regular data segment.
static const int fl_regular_seg = 0x0001;
// This is a field sync segment, for 1st half of a field.
static const int fl_field_sync1 = 0x0002;
// This is a field sync segment, for 2nd half of a field.
static const int fl_field_sync2 = 0x0004;
// This bit is on ONLY when fl_regular_seg is set AND when this is
// the first regular data segment AFTER a field sync segment. This
// segment causes various processing modules to reset.
static const int fl_first_regular_seg = 0x0008;
// which field are we in?
static const int fl_field2 = 0x0010; // else field 1
// This bit is set when Reed-Solomon decoding detects an error that it
// can't correct. Note that other error detection (e.g. Viterbi) do not
// set it, since Reed-Solomon will correct many of those. This bit is
// then copied into the final Transport Stream packet so that MPEG
// software can see that the 188-byte data segment has been corrupted.
static const int fl_transport_error = 0x0020;
so in the two above we have fl_regular_segment + fl_first_regular_seg (0x0009) in
segment 0000, and just fl_regular_segment (0x0001) in segment 0001. There are 187 + 4
bytes in each packet after the randomizer strips off sync and adds flags
and segnos.
After the Reed-Solomon encoder:
00000000 09 00 00 00 ab 1a b2 6d 56 58 da 82 87 eb 47 ad |.......mVX....G.|
00000010 e3 3c 55 4f 7f 90 9c a2 28 e6 38 85 f0 40 3e ce |..|
00000020 de 14 c2 3a 29 b9 ee 01 a2 51 42 ba da 43 69 5f |...:)....QB..Ci_|
00000030 20 c2 0e d3 62 e0 5e 39 3b 0b 91 c0 20 81 22 df | ...b.^9;... .".|
00000040 49 d6 33 9d 72 3c 89 ae 1f b0 75 11 4f 1d 02 ea |I.3.r<....u.O...|
00000050 96 d3 ea 8d a3 0c 20 41 00 7f e5 29 f3 63 bc c7 |...... A...).c..|
00000060 5e 93 ca 07 8d 2f 78 7e 70 05 e0 21 e6 ca ad 35 |^..../x~p..!...5|
00000070 05 66 7b 9d 05 ca be d5 1a 5c 67 2e 4f 63 b8 c8 |.f{......\g.Oc..|
00000080 8d d7 77 89 de d6 54 3c ed b4 3f 5d 6d a3 97 5e |..w...T<..?]m..^|
00000090 32 b4 e3 b9 47 bb d3 af b3 98 6b c2 82 38 d0 b7 |2...G.....k..8..|
000000a0 ce c8 53 fe a0 b4 69 05 cc 7f 72 30 d8 0e 3b 51 |..S...i...r0..;Q|
000000b0 f6 59 e0 8d 2a 64 51 e6 d0 90 61 40 a6 81 25 c7 |.Y..*dQ...a@..%.|
000000c0 8a ed 9a 8b 88 5d 1d 2d 09 0b 96 d4 26 3b c5 5d |.....].-....&;.]|
000000d0 a3 90 43 00 00 00 00 00 00 00 00 00 00 00 00 00 |..C.............|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100 01 00 01 00 e3 1d 65 25 5a cd de ca b6 a5 8d 66 |......e%Z......f|
00000110 ef 40 ee df 95 c2 e5 78 d0 ac 62 25 a5 07 ef aa |.@.....x..b%....|
00000120 d0 66 18 a1 f6 a6 b8 aa 5d 10 bc 05 03 94 33 f4 |.f......].....3.|
00000130 ae 8c 56 23 ce a0 ed 85 4d 2c c9 38 73 9e 93 22 |..V#....M,.8s.."|
00000140 cd 09 e4 e7 33 83 40 cf 3b 2a 4b ae 01 82 06 01 |....3.@.;*K.....|
00000150 13 bf ae 2f df 81 d1 92 ca 1c 88 e1 a9 00 5c c8 |.../..........\.|
00000160 c6 d4 12 1c 49 97 73 27 e6 5b 95 30 22 e1 10 51 |....I.s'.[.0"..Q|
00000170 ab 08 44 9b 08 8b a3 25 51 bd 34 25 d7 a3 82 d2 |..D....%Q.4%....|
00000180 e5 a8 7f 56 16 94 c2 23 59 d8 f0 4e d3 1b 15 a4 |...V...#Y..N....|
00000190 d7 e4 76 a5 28 04 bc ba 37 a3 e3 c5 61 90 a9 83 |..v.(...7...a...|
000001a0 7f 06 70 3e db 72 8e a1 3d e3 1d 33 13 63 19 da |..p>.r..=..3.c..|
000001b0 83 d9 4f 34 e0 43 56 74 2c 85 d1 fd da e6 a1 09 |..O4.CVt,.......|
000001c0 8a 72 01 e0 83 ff 19 4a 87 b1 04 11 0a f8 f6 89 |.r.....J........|
000001d0 b7 1e 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 |..?.............|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
pretty much the same pipeline-info wise, just 20 more bytes per packet.
The next stage, the interleaver, takes 52 packets to fully load, untill then
it emits lots of zeros, so after skipping 52 packets:
00000000 01 00 34 00 d2 29 c8 a2 af 7e 94 01 48 6c ce d6 |..4..)...~..Hl..|
00000010 26 c3 e4 35 cb 78 a9 f7 83 6e 63 5c 8b c8 67 c4 |&..5.x...nc\..g.|
00000020 90 22 41 80 72 64 91 90 fb cf ff 4a 7f b3 cb 68 |."A.rd.....J...h|
00000030 5b 65 d3 29 50 e3 bf a4 2a 98 4d 63 2f b8 19 07 |[e.)P...*.Mc/...|
00000040 2e 92 91 d4 7f 5d 76 f8 57 6b ec 47 15 10 16 01 |.....]v.Wk.G....|
00000050 1f a5 3e 30 8c 34 47 dc 1e 43 86 90 e9 6f fb 3f |..>0.4G..C...o.?|
00000060 63 72 01 5e ea 4d b2 f9 d2 7a d3 87 64 62 f4 6b |cr.^.M...z..db.k|
00000070 3a 75 60 7e 6b c1 0b 1d 1e f0 c0 e0 0d 3e d4 85 |:u`~k........>..|
00000080 af 51 68 f4 87 f1 de ca 67 d2 db 48 9d 8a 15 19 |.Qh.....g..H....|
00000090 0e 77 9c 48 ba ac a9 90 32 b1 93 c0 d4 e3 57 3a |.w.H....2.....W:|
000000a0 93 dc 28 66 9a 13 2b 59 0c 4c 81 89 a2 bf ca 3f |..(f..+Y.L.....?|
000000b0 86 47 f5 2a fc af 1f 40 39 c8 c8 e4 79 fb 2f 99 |.G.*...@9...y./.|
000000c0 75 14 d4 c8 c7 70 06 33 2c ab 7a ab 92 2b 77 d3 |u....p.3,.z..+w.|
000000d0 ce 5a 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 |.Z..............|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100 01 00 35 00 87 d8 83 87 6a bf 5c eb 62 89 db 02 |..5.....j.\.b...|
00000110 6c 39 eb 69 64 c9 76 7d 39 1f 5e 4a ef bb bb 78 |l9.id.v}9.^J...x|
00000120 88 67 51 8b f4 c6 5f 98 35 93 01 f9 ca 0c 13 9b |.gQ..._.5.......|
00000130 12 70 6b b8 41 5d b3 f7 d2 58 f3 8d 59 5d 7b 10 |.pk.A]...X..Y]{.|
00000140 fa 04 2d a4 cc 34 c6 b8 13 d1 1d 4c ef d3 cb 14 |..-..4.....L....|
00000150 9a a5 80 a0 82 40 60 fb c9 01 1e bc 03 b7 26 9b |.....@`.......&.|
00000160 b8 69 17 f9 35 e4 06 9e 60 95 2e 81 45 f0 00 54 |.i..5...`...E..T|
00000170 a7 0d 3f 8a da 5a 5a 24 4a 63 cf d0 d7 09 86 47 |..?..ZZ$Jc.....G|
00000180 4b 26 f3 95 e0 51 76 7f 94 2c 27 76 0a 45 0c 7d |K&...Qv..,'v.E.}|
00000190 70 5d 36 37 d7 b7 36 ec 26 14 54 91 35 3b c5 9c |p]67..6.&.T.5;..|
000001a0 a8 cf 2e 6c 32 2f 76 56 7b 82 b7 e0 f2 d7 e1 29 |...l2/vV{......)|
000001b0 88 81 d0 32 84 80 cb 2d 35 9a 9e 14 62 3d 47 64 |...2...-5...b=Gd|
000001c0 3d 57 0d 40 84 be c9 26 6b cb 9a 6a 8b b8 fa 8f |=W.@...&k..j....|
000001d0 61 84 d5 00 00 00 00 00 00 00 00 00 00 00 00 00 |a...............|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
Same fl_regular_segment flag and the segnos start at 0x34 (52), then 207
random bytes.
Finally the Trellis encoder which takes the 207 bytes and emits 4 * 207
3-bit symbols, here one symbol per byte ranging from 0-7
00000000 01 00 34 00 06 01 01 06 04 02 06 04 04 02 04 00 |..4.............|
00000010 02 02 06 04 06 03 07 06 00 01 06 06 07 03 07 02 |................|
00000020 03 03 01 05 04 00 05 07 07 01 05 05 07 00 07 06 |................|
00000030 02 05 06 07 00 05 03 00 04 05 00 06 05 06 02 02 |................|
00000040 05 07 00 03 05 02 05 07 06 06 07 00 02 06 05 01 |................|
00000050 04 00 00 05 02 03 05 02 00 04 04 01 03 00 07 05 |................|
00000060 07 01 01 03 06 04 05 01 07 04 07 03 01 03 01 07 |................|
00000070 05 04 02 07 06 04 00 06 03 06 03 02 00 00 00 06 |................|
00000080 06 04 05 06 06 02 02 04 01 00 00 00 07 04 00 07 |................|
...skipping...
000002d0 05 01 00 00 02 02 03 03 05 00 01 04 01 03 05 07 |................|
000002e0 05 02 07 00 02 06 03 00 01 02 06 03 02 07 02 07 |................|
000002f0 02 05 02 00 05 04 04 04 02 01 00 07 05 00 02 02 |................|
00000300 05 02 02 01 05 05 04 06 02 05 05 05 05 07 03 02 |................|
00000310 00 07 04 02 00 04 02 02 03 03 01 02 03 04 02 07 |................|
00000320 02 07 06 06 04 06 01 01 01 05 07 01 07 03 07 05 |................|
00000330 07 02 03 02 03 02 07 03 05 06 03 06 01 01 02 04 |................|
00000340 06 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400 01 00 35 00 06 01 01 06 01 04 06 00 02 02 03 05 |..5.............|
00000410 03 00 04 04 07 05 05 06 07 01 07 04 00 04 07 00 |................|
00000420 02 00 02 03 01 06 04 05 05 06 03 04 00 07 02 01 |................|
00000430 05 04 05 00 06 01 00 04 06 07 07 05 07 04 06 05 |................|
00000440 00 06 03 00 05 00 01 05 02 06 06 04 02 04 07 00 |................|
00000450 02 05 01 01 02 03 05 07 07 00 04 06 04 02 01 01 |................|
again our flags and segno starting at 0x34, then 4 sync symbols of
6-1-1-6 ( this will later become the +5 -5 -5 +5 you see in Fig. 6 of
"Fundaments of 8VSB" and elsewhere) then the 828 (207 * 4) symbols.
Just for giggles and grins, lets look for other flags. There are 312
segments per field, so skipping ahead in rs encoded mpeg packets to segment
0x0138:
00010300 01 00 37 01 c5 e4 a3 8b 67 02 50 0e b9 05 e5 c0 |..7.....g.P.....|
00010310 cc 4c aa 7d 24 8c ec 64 61 26 d8 d1 86 6e 33 a8 |.L.}$..da&...n3.|
00010320 80 0b cd c8 5c 62 dc c8 7c 09 4a 90 13 42 f8 6a |....\b..|.J..B.j|
00010330 dc 56 82 21 92 60 78 2c 0a 7f 85 5d 6a 09 82 80 |.V.!.`x,...]j...|
....skipping....
000103c0 1c 18 4c 37 b4 ed 9f 51 f1 fe b6 78 aa e1 86 e4 |..L7...Q...x....|
000103d0 f4 df c7 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000103e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00010400 19 00 00 00 fb bb a8 2f b3 90 02 fb 55 30 ea 32 |......./....U0.2|
00010410 6a 9b d5 2c 0b 6c 95 79 47 a9 ac 7c ea 2f 72 17 |j..,.l.yG..|./r.|
00010420 92 48 6c b6 80 0d ff 48 07 4f 4b 3d 76 f6 0f 5b |.Hl....H.OK=v..[|
...skipping...
000104c0 c3 be 24 04 05 f1 fd 24 e3 ea 0a 46 67 a5 75 b4 |..$....$...Fg.u.|
000104d0 d5 b4 db 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000104e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00010500 11 00 01 00 44 e9 c5 f3 41 da 61 ab 56 50 ec ab |....D...A.a.VP..|
00010510 9e 95 43 21 8f 2e 18 37 cc 87 7d ea d5 17 3e 4a |..C!...7..}...>J|
00010520 02 18 b4 6a 5b 3f 66 4c 3f 52 58 b5 a0 a4 f5 e8 |...j[?fL?RX.....|
we find a fl_regular_seg flag on segment 0x0137, then segno rolls over back
to 0x000, with 0x0019 flags, or fl_field2 + fl_regular_segment + fl_first_regular_segment. After that all segment flags are 0x0011, in field 2, regular segment.
Since it takes 2 fields to make a frame, lets skip ahead another
312 segments to next segno 0x0138:
00023ad0 d2 e0 bb 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00023ae0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00023b00 11 00 37 01 1a d5 b3 a9 ac 34 e7 34 f6 aa 69 eb |..7......4.4..i.|
00023b10 59 14 21 ca cc 36 15 e5 aa 20 fc 8a 85 8f 11 8d |Y.!..6... ......|
...skipping...
00023bc0 c0 a4 e9 c5 83 97 32 bf 06 01 cf 3b 1f 08 4d 3f |......2....;..M?|
00023bd0 d3 15 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00023be0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00023c00 09 00 00 00 cd d4 88 5d b9 d1 52 f4 46 72 80 58 |.......]..R.Fr.X|
00023c10 6b e7 ce 36 5f 3d a7 2f 05 fd e7 29 b6 50 01 4b |k..6_=./...).P.K|
...skiping...
00023c20 97 40 19 e4 aa 7e a8 2f 54 60 76 69 0b 9a 5f 34 |.@...~./T`vi.._4|
00023c30 92 7b b5 20 a9 16 7c 0d 18 d5 6d b2 d2 05 a4 98 |.{. ..|...m.....|
00023ce0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00023d00 01 00 01 00 cf fd 23 0e 1e 72 e9 87 e1 ae 97 b6 |......#..r......|
00023d10 df 2e 5b f8 04 29 27 90 e8 62 80 ae df e2 b1 2b |..[..)'..b.....+|
00023d20 e5 7f dd 90 3f 9e 54 b7 4b 31 6a 03 36 c4 91 57 |....?.T.K1j.6..W|
there's 0x0011 flags on segment 0x0137, 0x0009 at next field 0x0000, then
back to 0x0001 on segment 0x0001.
Where are flags fl_field_sync1 and fl_field_sync2 used? Perhaps after the
field sync multiplexor.
Moving on, the next stage is the Field Sync Multiplexor, which adds a
segment sync symbol pattern of 06 01 01 06 (+5 -5 -5 +5) to the
beginning of each segement, and also every 312 segments adds a complete
data segment with special pseudo-noise and mode bites. The pseudo-noise
bits of a segment are made of predefined pn511 and pn63 symbol blocks.
Doing a hexdump and skipping ahead 312 1024-byte segments (312 * 1024 = 4E400)
0004e000 00 00 00 00 06 01 01 06 01 01 01 01 01 01 01 06 |................|
where there's no pipeline flags set, the 6-1-1-6 seg sync, then follows
511 symbols that match those found in atsci_pnXXX.cc. From 4e207 to
4e245 inclusive is a pn63 block, from 4e246 to 4e284 another pn63
block, and from 4e285 4e2c3 a pn63 block. The 2nd pn63 block is invetered
on FIELD2's. Then comes 24 symbols of
VSB mode info, here 8VSB, from 4e2c4 to 4e2db. Then 92 reserved symbols
from 4e2dc to 4e337, made up of more pn63 symbols. The 12 symbols from 4e338 to 4e343 are the last 12 symbols of the previous segment. After that
atsc_field_sync_mux.cc spits out random data outside of symbol limits
of 0 to 6.