New upstream version 0.79.5

This commit is contained in:
TANIGUCHI Takaki
2017-02-02 22:24:37 +09:00
parent 2f23ea4b4a
commit 9ad5d25d65
1931 changed files with 104660 additions and 254637 deletions

View File

@@ -1,25 +1,23 @@
/* dvdisaster: Additional error correction for optical media.
* Copyright (C) 2004-2012 Carsten Gnoerlich.
* Project home page: http://www.dvdisaster.com
* Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org
* Copyright (C) 2004-2015 Carsten Gnoerlich.
*
* The Reed-Solomon error correction draws a lot of inspiration - and even code -
* from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/
* Email: carsten@dvdisaster.org -or- cgnoerlich@fsfe.org
* Project homepage: http://www.dvdisaster.org
*
* This program is free software; you can redistribute it and/or modify
* This file is part of dvdisaster.
*
* dvdisaster is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* dvdisaster 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA,
* or direct your browser at http://www.gnu.org.
* along with dvdisaster. If not, see <http://www.gnu.org/licenses/>.
*/
#include "dvdisaster.h"
@@ -28,437 +26,261 @@
*** Reed-Solomon encoding
***/
/*
* Optimized encoder for 32 roots
/* Portable (non-SSE2) version.
* Using 32bit operands seems to be a good choice for the lowest
* common denominator between the non-SSE2 systems.
*/
#if 0
void encode_layer_32(ReedSolomonEncoder *rse, unsigned char *data, unsigned char *par_idx, guint64 layer_size)
{ //unsigned char *par_idx = rse->parity;
gint32 *gf_index_of = rse->gfTables->indexOf;
gint32 *enc_alpha_to = rse->gfTables->encAlphaTo;
int i;
#ifdef HAVE_BIG_ENDIAN
#define SHIFT_LEFT <<
#define SHIFT_RIGHT >>
#else
#define SHIFT_LEFT >>
#define SHIFT_RIGHT <<
#endif /* HAVE_BIG_ENDIAN */
for(i=0; i<layer_size; i++)
{ register int feedback = gf_index_of[data[i] ^ par_idx[rse->shiftPtr]];
if(feedback != GF_ALPHA0) /* non-zero feedback term */
{ register int spk = rse->shiftPtr;
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 249];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 59];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 66];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 4];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 43];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 126];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 251];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 97];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 30];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 3];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 213];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 50];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 66];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 170];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 5];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 24];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 5];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 170];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 66];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 50];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 213];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 3];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 30];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 97];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 251];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 126];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 43];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 4];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 66];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 59];
par_idx[((++spk)&31)] ^= enc_alpha_to[feedback + 249];
par_idx[rse->shiftPtr] = enc_alpha_to[feedback]; /* feedback + 0 */
}
else /* zero feedback term */
par_idx[rse->shiftPtr] = 0;
par_idx += 32; /* nroots */
}
rse->shiftPtr = (rse->shiftPtr+1) & 31; /* shift */
}
/*
* Optimized encoder for 64 roots
*/
void encode_layer_64(ReedSolomonEncoder *rse, unsigned char *data, unsigned char *par_idx, guint64 layer_size)
{ //unsigned char *par_idx = rse->parity;
gint32 *gf_index_of = rse->gfTables->indexOf;
gint32 *enc_alpha_to = rse->gfTables->encAlphaTo;
int i;
for(i=0; i<layer_size; i++)
{ register int feedback = gf_index_of[data[i] ^ par_idx[rse->shiftPtr]];
if(feedback != GF_ALPHA0) /* non-zero feedback term */
{ register int spk = rse->shiftPtr;
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 98];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 247];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 160];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 15];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 96];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 27];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 87];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 175];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 64];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 170];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 53];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 39];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 236];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 39];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 58];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 82];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 44];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 89];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 97];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 182];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 80];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 120];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 40];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 104];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 73];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 73];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 12];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 152];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 205];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 96];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 50];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 21];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 147];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 35];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 241];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 30];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 242];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 145];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 242];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 115];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 148];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 70];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 127];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 71];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 83];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 172];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 224];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 104];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 177];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 0];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 39];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 194];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 50];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 9];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 0];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 208];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 217];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 254];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 165];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 181];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 168];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 97];
par_idx[((++spk)&63)] ^= enc_alpha_to[feedback + 45];
par_idx[rse->shiftPtr] = enc_alpha_to[feedback + 44];
}
else /* zero feedback term */
par_idx[rse->shiftPtr] = 0;
par_idx += 64; /* nroots */
}
rse->shiftPtr = (rse->shiftPtr+1) & 63; /* shift */
}
#endif
/*
* Encoder for any number roots
*/
void encode_layer(ReedSolomonTables *rt, unsigned char *data, unsigned char *par_idx, guint64 layer_size, int shift)
static void encode_next_layer_portable(ReedSolomonTables *rt, unsigned char *data, unsigned char *parity, guint64 layer_size, int shift)
{ gint32 *gf_index_of = rt->gfTables->indexOf;
gint32 *enc_alpha_to = rt->gfTables->encAlphaTo;
gint32 *rs_gpoly = rt->gpoly;
int nroots = rt->nroots;
int i;
int nroots = rt->nroots;
int nroots_aligned = (nroots+15)&~15;
int nroots_aligned32 = (nroots+3)&~3;
int nroots_full = nroots_aligned32>>2;
int i,j;
for(i=0; i<layer_size; i++)
{ register int feedback = gf_index_of[data[i] ^ par_idx[shift]];
{ int feedback = gf_index_of[data[i] ^ parity[shift]];
int offset = nroots-shift-1;
int byte_offset = offset&3;
if(feedback != GF_ALPHA0) /* non-zero feedback term */
{ register int spk = shift+1;
register int *gpoly = rs_gpoly + nroots;
{ guint32 *par_idx = (guint32*)parity;
guint32 *e_lut = ((guint32*)(rt->bLut[feedback]+(offset&~3)));
switch(nroots-spk)
{
case 110: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 109: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 108: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 107: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 106: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 105: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 104: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 103: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 102: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 101: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 100: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 99: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 98: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 97: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 96: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 95: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 94: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 93: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 92: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 91: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 90: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 89: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 88: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 87: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 86: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 85: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 84: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 83: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 82: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 81: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 80: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 79: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 78: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 77: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 76: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 75: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 74: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 73: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 72: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 71: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 70: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 69: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 68: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 67: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 66: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 65: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 64: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 63: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 62: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 61: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 60: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 59: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 58: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 57: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 56: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 55: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 54: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 53: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 52: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 51: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 50: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 49: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 48: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 47: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 46: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 45: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 44: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 43: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 42: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 41: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 40: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 39: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 38: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 37: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 36: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 35: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 34: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 33: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 32: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 31: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 30: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 29: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 28: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 27: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 26: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 25: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 24: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 23: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 22: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 21: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 20: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 19: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 18: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 17: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 16: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 15: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 14: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 13: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 12: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 11: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 10: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 9: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 8: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 7: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 6: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 5: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 4: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 3: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 2: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 1: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
/* Process lut in 32 bit steps */
switch(byte_offset)
{ case 0:
for(j=nroots_full; j; j--)
*par_idx++ ^= *e_lut++;
break;
case 1:
{ for(j=nroots_full; j; j--)
{ guint32 span = *e_lut SHIFT_LEFT 8;
e_lut++;
span |= *e_lut SHIFT_RIGHT 24;
*par_idx++ ^= span;
}
}
break;
case 2:
{ for(j=nroots_full; j; j--)
{ guint32 span = *e_lut SHIFT_LEFT 16;
e_lut++;
span |= *e_lut SHIFT_RIGHT 16;
*par_idx++ ^= span;
}
}
break;
case 3:
{ for(j=nroots_full; j; j--)
{ guint32 span = *e_lut SHIFT_LEFT 24;
e_lut++;
span |= *e_lut SHIFT_RIGHT 8;
*par_idx++ ^= span;
}
}
break;
}
spk = 0;
switch(shift)
{
case 110: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 109: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 108: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 107: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 106: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 105: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 104: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 103: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 102: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 101: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 100: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 99: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 98: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 97: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 96: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 95: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 94: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 93: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 92: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 91: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 90: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 89: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 88: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 87: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 86: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 85: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 84: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 83: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 82: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 81: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 80: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 79: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 78: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 77: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 76: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 75: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 74: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 73: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 72: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 71: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 70: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 69: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 68: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 67: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 66: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 65: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 64: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 63: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 62: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 61: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 60: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 59: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 58: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 57: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 56: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 55: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 54: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 53: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 52: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 51: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 50: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 49: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 48: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 47: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 46: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 45: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 44: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 43: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 42: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 41: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 40: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 39: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 38: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 37: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 36: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 35: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 34: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 33: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 32: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 31: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 30: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 29: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 28: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 27: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 26: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 25: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 24: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 23: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 22: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 21: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 20: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 19: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 18: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 17: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 16: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 15: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 14: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 13: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 12: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 11: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 10: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 9: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 8: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 7: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 6: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 5: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 4: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 3: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 2: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
case 1: par_idx[spk++] ^= enc_alpha_to[feedback + *--gpoly];
}
par_idx[shift] = enc_alpha_to[feedback + rs_gpoly[0]];
parity[shift] = enc_alpha_to[feedback + rs_gpoly[0]];
}
else /* zero feedback term */
par_idx[shift] = 0;
parity[shift] = 0;
par_idx += nroots;
parity += nroots_aligned;
}
}
/* 64bit integer (non-SSE2) version.
* May perform better on systems which have shared FPU/SSE2 units
* between several cores.
*/
static void encode_next_layer_64bit(ReedSolomonTables *rt, unsigned char *data, unsigned char *parity, guint64 layer_size, int shift)
{ gint32 *gf_index_of = rt->gfTables->indexOf;
gint32 *enc_alpha_to = rt->gfTables->encAlphaTo;
gint32 *rs_gpoly = rt->gpoly;
int nroots = rt->nroots;
int nroots_aligned = (nroots+15)&~15;
int nroots_aligned64 = (nroots+7)&~7;
int nroots_full = nroots_aligned64>>3;
int i,j;
for(i=0; i<layer_size; i++)
{ int feedback = gf_index_of[data[i] ^ parity[shift]];
int offset = nroots-shift-1;
int byte_offset = offset&7;
if(feedback != GF_ALPHA0) /* non-zero feedback term */
{ guint64 *par_idx = (guint64*)parity;
guint64 *e_lut = ((guint64*)(rt->bLut[feedback]+(offset&~7)));
/* Process lut in 64 bit steps */
switch(byte_offset)
{ case 0:
for(j=nroots_full; j; j--)
*par_idx++ ^= *e_lut++;
break;
case 1:
{ for(j=nroots_full; j; j--)
{ guint64 span = *e_lut SHIFT_LEFT 8;
e_lut++;
span |= *e_lut SHIFT_RIGHT 56;
*par_idx++ ^= span;
}
}
break;
case 2:
{ for(j=nroots_full; j; j--)
{ guint64 span = *e_lut SHIFT_LEFT 16;
e_lut++;
span |= *e_lut SHIFT_RIGHT 48;
*par_idx++ ^= span;
}
}
break;
case 3:
{ for(j=nroots_full; j; j--)
{ guint64 span = *e_lut SHIFT_LEFT 24;
e_lut++;
span |= *e_lut SHIFT_RIGHT 40;
*par_idx++ ^= span;
}
}
break;
case 4:
{ for(j=nroots_full; j; j--)
{ guint64 span = *e_lut SHIFT_LEFT 32;
e_lut++;
span |= *e_lut SHIFT_RIGHT 32;
*par_idx++ ^= span;
}
}
break;
case 5:
{ for(j=nroots_full; j; j--)
{ guint64 span = *e_lut SHIFT_LEFT 40;
e_lut++;
span |= *e_lut SHIFT_RIGHT 24;
*par_idx++ ^= span;
}
}
break;
case 6:
{ for(j=nroots_full; j; j--)
{ guint64 span = *e_lut SHIFT_LEFT 48;
e_lut++;
span |= *e_lut SHIFT_RIGHT 16;
*par_idx++ ^= span;
}
}
break;
case 7:
{ for(j=nroots_full; j; j--)
{ guint64 span = *e_lut SHIFT_LEFT 56;
e_lut++;
span |= *e_lut SHIFT_RIGHT 8;
*par_idx++ ^= span;
}
}
break;
}
parity[shift] = enc_alpha_to[feedback + rs_gpoly[0]];
}
else /* zero feedback term */
parity[shift] = 0;
parity += nroots_aligned;
}
#if 0 /* shift now deliverd from external call */
if(++(shift)>=nroots) shift=0; /* shift */
#endif
}
/*
* Wrapper around the optimized encoder routines
* Dispatch upon availability of SSE2 intrinsics
*/
void EncodeNextLayer(ReedSolomonTables *rt, unsigned char *data, unsigned char *parity, guint64 layer_size, int shift)
{
switch(rt->nroots)
{
#if 0
case 32:
encode_layer_32(rse, data, parity, layer_size);
break;
void encode_next_layer_sse2(ReedSolomonTables*, unsigned char*, unsigned char*, guint64, int);
void encode_next_layer_altivec(ReedSolomonTables*, unsigned char*, unsigned char*, guint64, int);
case 64:
encode_layer_64(rse, data, parity, layer_size);
break;
#endif
default:
encode_layer(rt, data, parity, layer_size, shift);
break;
}
void EncodeNextLayer(ReedSolomonTables *rt, unsigned char *data, unsigned char *parity, guint64 layer_size, int shift)
{
switch(Closure->encodingAlgorithm)
{ case ENCODING_ALG_32BIT:
encode_next_layer_portable(rt, data, parity, layer_size, shift);
break;
case ENCODING_ALG_64BIT:
encode_next_layer_64bit(rt, data, parity, layer_size, shift);
break;
case ENCODING_ALG_SSE2:
encode_next_layer_sse2(rt, data, parity, layer_size, shift);
break;
case ENCODING_ALG_ALTIVEC:
encode_next_layer_altivec(rt, data, parity, layer_size, shift);
break;
case ENCODING_ALG_DEFAULT:
if(Closure->useSSE2)
encode_next_layer_sse2(rt, data, parity, layer_size, shift);
else if(Closure->useAltiVec)
encode_next_layer_altivec(rt, data, parity, layer_size, shift);
else
encode_next_layer_portable(rt, data, parity, layer_size, shift);
break;
}
}
/*
* Provide textual description for current encoder parameters
*/
void DescribeRSEncoder(char **algorithm, char **iostrategy)
{
switch(Closure->encodingAlgorithm)
{ case ENCODING_ALG_32BIT:
*algorithm="32bit";
break;
case ENCODING_ALG_64BIT:
*algorithm="64bit";
break;
case ENCODING_ALG_SSE2:
*algorithm="SSE2";
break;
case ENCODING_ALG_ALTIVEC:
*algorithm="AltiVec";
break;
case ENCODING_ALG_DEFAULT:
if(Closure->useSSE2)
*algorithm="SSE2";
else if(Closure->useAltiVec)
*algorithm="AltiVec";
else
*algorithm="64bit";
break;
}
if(Closure->encodingIOStrategy == IO_STRATEGY_MMAP)
*iostrategy="mmap";
else *iostrategy="read/write";
}