This is a small description for the Reed-Solomon library intended for
CD sector formatting.

Basics:
It is assumed that you have a basic knowledge of cd sector formats.

The library can handle three types of sector data:
  data sectors,
  audio sectors, and
  sub channel r-w sectors

Currently only encoding is implemented. Decoding and optionally
error correction is planned for later.

Stages:

The process of sector formatting has several stages. Beginning with
a data sector (2048, 2324, or 2336 bytes) a sector of 2352 bytes is
built. This format can be read raw by SCSI MMC-2 and ATAPI drives and
is accepted by cd burners. The additions are an optionally 32 bit CRC
checksum and two layers of Reed-Solomon codes (called Reed-Solomon
Product Code RSPC).
This sector is then scrambled (exor'ed with a bitstream).
The result is called F1 frames. Afterwards even and odd bytes are
swapped, this is called F2 frames. The result is equivalent to an
audio sector and is treated as such by the cd burner.
So, if we wrote a series of sectors (F2 frames) into a CDR file and
later burned them as 'audio', they would turn up as perfect data sectors.

So, now we are at the level of audio sectors. Audio sectors get their
own error correction data (called CIRC). Sector size goes up to 
3136 bytes (that is 4/3 times 2352 bytes). Furthermore different
words get delayed differently and swap positions. The result is ready
to be fed into the so-called EightFourteenModulator (when subchannels
have been added).

Now, only sub channels are missing. While the p and q sub
channels have to be generated elsewhere, any supplied r-w subchannel
user data is protected by two levels of error correction
codes. This format is read by cd burners when burning cd+graphics.
The cdimage is a sequence of sectors, each containing audio data and
after that subchannel data.
Similar to audio sectors delaying and permutation of words
takes place. After that the cd burner would mix sub channel data with
the formatted audio sectors to feed the EFModulator.

NOTE: Most of the described stages need not to be done in order to
prepare sectors for burning, since all cd burners do at least CIRC,
delaying and swaps. For data sectors they also do scrambling and f2
frame generation.

Encoding routines:

For data sectors
 int do_encode_L2(unsigned char *inout, int sectortype, unsigned address);

 encodes data sectors. The returned data is __unscrambled__ and not in
 F2-frame format.

Parameters are:
  inout        pointer to an array of at least 2352 bytes.
  sectortype   One of the MODE_* constants from ecc.h. This defines
               how to format the sector.
  address      The logical address to be used in the header 
               (150 = 0:2.0 MSF).

NOTE: the data portion has be to aligned properly for performance
reasons (see ecc.h for details). So, no moves are necessary here.

Generating f2 frames to be used like audio sectors
 int scramble_L2(unsigned char *inout)

 generates f2 frames in place from sectors generated by do_encode_L2().

Parameters are:
  inout        pointer to an array of at least 2352 bytes.



For sub channels
 int do_encode_sub(unsigned char in[LSUB_RAW*PACKETS_PER_SUBCHANNELFRAME],
		unsigned char out[(LSUB_RAW+LSUB_Q+LSUB_P)*
					PACKETS_PER_SUBCHANNELFRAME],
		int delay1, int permute);

 repack user data and add error correction data. P and q subchannels
should be added later, since all bytes are in place then.

Parameters are:
  in           pointer to an array of at least 72 bytes. It contains
               the user data for one frame.
  out          pointer to an array of at least 96 bytes. Here is
               output frame is placed.
  delay1       do low level delaying, when set to 1.
  permute      do low level permutations, when set to 1.

NOTE: Probably both options need either to be set on (1) or off (0) together.

There is more, but that is seldomly used.

Tests:
The library is accompanied by small verify programs, that compare real
raw sectors with the formatted results. They are also intended as demo
applications (how to use the library). In order to be able to feed
real raw sectors into them, the package read2448 is recommended/needed.
You can only verify sector streams of one sector type, currently no mix.

For more information have a look into ecc.h

recommended Documents:
Yellow Book or ISO 10149
Appendix Red Book
Red Book or IEC 908
