summaryrefslogtreecommitdiff
path: root/libfec/include/fec/ecc.h
blob: c0fd9baeb81495cf3abd714526817d0884568755 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ___FEC_ECC_H___
#define ___FEC_ECC_H___

#include <fec/io.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ecc parameters */
#define FEC_RSM 255

/* parameters to init_rs_char */
#define FEC_PARAMS(roots) \
    8,          /* symbol size in bits */ \
    0x11d,      /* field generator polynomial coefficients */ \
    0,          /* first root of the generator */ \
    1,          /* primitive element to generate polynomial roots */ \
    (roots),    /* polynomial degree (number of roots) */ \
    0           /* padding bytes at the front of shortened block */

/* computes ceil(x / y) */
inline uint64_t fec_div_round_up(uint64_t x, uint64_t y)
{
    return (x / y) + (x % y > 0 ? 1 : 0);
}

/* rounds up x to the nearest multiple of y */
inline uint64_t fec_round_up(uint64_t x, uint64_t y)
{
    return fec_div_round_up(x, y) * y;
}

/* returns a physical offset for a byte in an RS block */
inline uint64_t fec_ecc_interleave(uint64_t offset, int rsn, uint64_t rounds)
{
    return (offset / rsn) + (offset % rsn) * rounds * FEC_BLOCKSIZE;
}

/* returns the size of ecc data given a file size and the number of roots */
inline uint64_t fec_ecc_get_size(uint64_t file_size, int roots)
{
    return fec_div_round_up(fec_div_round_up(file_size, FEC_BLOCKSIZE),
                FEC_RSM - roots)
                    * roots * FEC_BLOCKSIZE
                + FEC_BLOCKSIZE;
}


#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* ___FEC_ECC_H___ */