in src/transport/fec_schemes/xqc_galois_calculation.c [147:193]
unsigned char (*output)[2 * XQC_RSM_COL])
{
int row_i, col_i, max_row, i, tmp, inv, row_above;
unsigned char ratio = 0;
for (row_i = 0; row_i < rows; row_i++) {
max_row = row_i;
for (i = row_i + 1; i < rows; i++) {
if (output[i][row_i] > output[max_row][row_i]) {
max_row = i;
}
}
for (col_i = row_i; col_i < cols; col_i++) {
tmp = output[max_row][col_i];
output[max_row][col_i] = output[row_i][col_i];
output[row_i][col_i] = tmp;
}
if (output[row_i][row_i] == 0) {
return -XQC_EFEC_SCHEME_ERROR;
}
inv = xqc_galois_inversion(output[row_i][row_i]);
for (col_i = row_i; col_i < cols; col_i++) {
output[row_i][col_i] = xqc_galois_multiply(output[row_i][col_i], inv);
}
for (i = row_i + 1; i < rows; i++) {
tmp = output[i][row_i];
for (col_i = row_i; col_i < cols; col_i++) {
output[i][col_i] ^= xqc_galois_multiply(tmp, output[row_i][col_i]);
}
}
}
for (row_i = 0; row_i < rows; row_i++) {
for (row_above = 0; row_above < row_i; row_above++) {
if (output[row_above][row_i] != 0) {
ratio = output[row_above][row_i];
for (col_i = 0; col_i < cols; col_i++) {
output[row_above][col_i] ^= xqc_galois_multiply(ratio, output[row_i][col_i]);
}
}
}
}
return XQC_OK;
}