ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Algorithm-FEC/FEC.pm
Revision: 1.6
Committed: Sat Sep 13 21:02:28 2003 UTC (23 years ago) by root
Branch: MAIN
Changes since 1.5: +35 -18 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.3 Algorithm::FEC - Forward Error Correction using Vandermonde Matrices
4 root 1.1
5     =head1 SYNOPSIS
6    
7 root 1.3 use Algorithm::FEC;
8 root 1.1
9     =head1 DESCRIPTION
10    
11     This module is an interface to the fec library by Luigi Rizzo et al., see
12     the file README.fec in the distribution for more details.
13    
14     This library implements a simple (C<encoded_packets>,C<data_packets>)
15     erasure code based on Vandermonde matrices. The encoder takes
16     C<data_packets> packets of size C<block_size> each, and is able to produce
17     up to C<encoded_packets> different encoded packets, numbered from C<0>
18     to C<encoded_packets-1>, such that any subset of C<data_packets> members
19     permits reconstruction of the original data.
20    
21     Allowed values for C<data_packets> and C<encoded_packets> must obey the
22     following equation:
23    
24     data_packets <= encoded_packets <= MAXBLOCKS
25    
26     Where C<MAXBLOCKS=256> for the fast implementation and C<MAXBLOCKS=65536>
27     for the slow implementation (the implementation is chosen automatically).
28    
29     =over 4
30    
31     =cut
32    
33 root 1.3 package Algorithm::FEC;
34 root 1.1
35     require XSLoader;
36    
37     no warnings;
38    
39 root 1.6 $VERSION = 0.4;
40 root 1.1
41 root 1.3 XSLoader::load Algorithm::FEC, $VERSION;
42 root 1.1
43     =item $fec = new data_packets, encoded_packets, blocksize
44    
45 root 1.6 =item $fec->set_encode_blocks ([array_of_blocks])
46 root 1.1
47     Sets the data blocks used for the encoding. Each member of the array can either be:
48    
49     =over 4
50    
51     =item * a string of size C<blocksize> C<exactly>.
52    
53     This is useful for small files (encoding entirely in memory).
54    
55     =item * a filehandle of a file of size C<blocksize> C<exactly>.
56    
57     This is useful when the amount of data is large and resides in single files.
58    
59     =item * a reference to an array containing a filehandle and, optionally, an offset into that file.
60    
61     This is useful if the amount of data is large and resides in a single
62     file. Needless to say, all parts must not overlap and must fit into the
63     file.
64    
65     =back
66    
67     If your data is not of the required size (i.e. a multiple of C<blocksize>
68     bytes), then you must pad it (e.g. with zero bytes) on encoding, and
69     truncate it after decoding.
70    
71     If called without arguments, the internal storage associated with the
72     blocks is freed again.
73    
74     =item $block = $fec->encode (block_index)
75    
76     Creates a single encoded packet of index C<block_index>, which must be
77     between C<0> and C<encoded_packets-1> (inclusive). The blocks from C<0> to
78     C<data_packets-1> are simply copies of the original data blocks.
79    
80     The encoded block is returned as a perl scalar (so the blocks should fit
81     into memory. If this is a problem for you mail me and I'll make it a file.
82    
83 root 1.6 =item $fec->set_decode_blocks ([array_of_blocks], [array_of_indices])
84 root 1.1
85 root 1.6 Prepares to decode C<data_packets> of blocks (see C<set_encode_blocks> for
86     the C<array_of_blocks> parameter).
87 root 1.1
88     Since these are not necessarily the original data blocks, an array of
89     indices (ranging from C<0> to C<encoded_packets-1>) must be supplied as
90     the second arrayref.
91    
92     Both arrays must have exactly C<data_packets> entries.
93    
94 root 1.6 This method also reorders the blocks and index array in place (if
95     necessary) to reflect the order the blocks will have in the decoded
96     result.
97    
98     Both arrays must have exactly C<data_packets> entries.
99    
100     The index array represents the decoded ordering, in that the n-th entry
101     in the indices array corresponds to the n-th data block of the decoded
102     result. The value stored in the n-th place in the array will contain the
103     index of the encoded data block.
104    
105     Input blocks with indices less than C<data_packets> will be moved to their
106     final position (block k to position k), while the gaps between them will
107     be filled with check blocks. The decoding process will not modify the
108     already decoded data blocks, but will modify the check blocks.
109 root 1.1
110     That is, if you call this function with C<indices = [4,3,1]>, with
111     C<data_packets = 3>, then this array will be returned: C<[0,2,1]>. This
112 root 1.4 means that input block C<0> corresponds to file block C<0>, input block
113     C<1> to file block C<2> and input block C<2> to data block C<1>.
114 root 1.1
115     You can just iterate over this array and write out the corresponding data
116 root 1.4 block (although this is inefficient):
117    
118 root 1.6 for my $i (0 .. $#idx)
119     if ($idx[$i] != $i) # need we move this block?
120     copy encoded packet $idx[$i] to position $i
121     }
122 root 1.4 }
123 root 1.1
124 root 1.6 The C<copy> method can be helpful here.
125 root 1.1
126 root 1.6 This method destroys the block array as set up by C<set_encode_blocks>.
127    
128     =item $fec->decode
129    
130     Decode the blocks set by a prior call to C<set_decode_blocks>.
131    
132     This method destroys the block array as set up by C<set_decode_blocks>.
133 root 1.1
134 root 1.2 =item $fec->copy ($srcblock, $dstblock)
135 root 1.1
136     Utility function that simply copies one block (specified like in
137 root 1.6 C<set_encode_blocks>) into another. This, btw., destroys the blocks set by
138     C<set_*_blocks>.
139 root 1.1
140     =item COMPATIBILITY
141    
142     The way this module works is compatible with the way freenet
143     (L<http://freenet.sf.net>) encodes files. Comaptibility to other file
144     formats or networks is not know, please tell me if you find more examples.
145    
146     =head1 SEE ALSO
147    
148     L<Net::FCP>. And the author, who might be happy to receive mail from any
149     user, just to see that this rather rarely-used module is actually being
150     used (except for freenet ;)
151    
152     =head1 BUGS
153    
154 root 1.6 * too complicated.
155 root 1.1 * largely untested, please change this.
156     * file descriptors are not supported, but should be.
157     * utility functions for files should be provided.
158     * 16 bit version not tested
159    
160     =head1 AUTHOR
161    
162     Marc Lehmann <pcg@goof.com>
163     http://home.schmorp.de
164    
165     =cut
166    
167     1;
168