NAME
Net::OnlineCode::Decoder - Rateless Forward Error Correction Decoder
SYNOPSIS
use Net::OnlineCode::Decoder;
use strict;
# variables received from encoder:
my ($msg_id, $e, $q, $msg_size, $blocksize);
# calculated/local variables
my (@check_blocks,@aux_blocks,$message,$block_id);
my $mblocks = int(0.5 + ($msg_size / $blocksize));
my $rng = Net::OnlineCode::RNG->new($msg_id);
my $decoder = Net::OnlineCode::Decoder->new(
mblocks => $mblocks,
initial_rng => $rng,
# ... pass e and q if they differ from defaults
);
my $ablocks = $decoder->{ablocks};
@aux_blocks = ( ( "\0" x $blocksize) x $ablocks);
my ($done,@decoded) = (0);
until ($done) {
my ($block_id,$contents) = ...; # receive data from encoder
push @check_blocks, $contents;
$rng->seed($block_id);
$decoder->accept_check_block($rng);
# keep calling resolve until it solves no more nodes or we've
# decoded all the message blocks
while(1) {
($done,@decoded) = $decoder->resolve;
last unless @decoded;
# resolve returns a Bone object, which can be treated as an
# array (see Net::OnlineCode::Bone for details):
# $bone -> [0] always 1
# $bone -> [1] ID of node that was solved
# $bone -> [2.. ] ID of nodes that need to be XORed
# XOR check/aux blocks together to decode message/aux block
foreach my $bone (@decoded) {
my $block = "\0" x $blocksize;
my $nodes = scalar(@$bone);
my $decoded_node = $bone->[1];
# XOR all component blocks
foreach my $node (@{$bone}[2..$nodes - 1)) {
if ($node < $mblocks) { # message block
fast_xor_strings(\$block,
substr($message, $node * $blocksize, $blocksize))
} elsif ($node < $mblocks + $ablocks) { # auxiliary block
fast_xor_strings(\$block,
$aux_blocks[$node - $mblocks]);
} else { # check block
fast_xor_strings(\$block,
$check_blocks[$node - ($mblocks + $ablocks)]);
}
}
# save newly-decoded message/aux block
if ($decoded_block < $mblocks) { # message block
substr($message, $decoded_node * $blocksize, $blocksize) = $block;
} else { # auxiliary block
$aux_blocks[$decoded_node - $mblocks] = $block;
}
}
last if $done;
}
}
$message = substr($message, 0, $msg_size); # truncate to correct size
print $message; # Done!
DESCRIPTION
This module implements the "decoder" side of the Online Code algorithm for rateless forward error correction. Refer to the the Net::OnlineCode documentation for the technical background
SEE ALSO
See Net::OnlineCode for background information on Online Codes.
This module is part of the GnetRAID project. For project development page, see:
https://sourceforge.net/projects/gnetraid/develop
AUTHOR
Declan Malone, <idablack@users.sourceforge.net>
COPYRIGHT AND LICENSE
Copyright (C) 2013-2015 by Declan Malone
This package is free software; you can redistribute it and/or modify it under the terms of the "GNU General Public License" ("GPL").
The C code at the core of this Perl module can additionally be redistributed and/or modified under the terms of the "GNU Library General Public License" ("LGPL"). For the purpose of that license, the "library" is defined as the unmodified C code in the clib/ directory of this distribution. You are permitted to change the typedefs and function prototypes to match the word sizes on your machine, but any further modification (such as removing the static modifier for non-exported function or data structure names) are not permitted under the LGPL, so the library will revert to being covered by the full version of the GPL.
Please refer to the files "GNU_GPL.txt" and "GNU_LGPL.txt" in this distribution for details.
DISCLAIMER
This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the "GNU General Public License" for more details.