1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker *
4*288bf522SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker *
8*288bf522SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker *
10*288bf522SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker */
16*288bf522SAndroid Build Coastguard Worker
17*288bf522SAndroid Build Coastguard Worker #ifndef ___FEC_ECC_H___
18*288bf522SAndroid Build Coastguard Worker #define ___FEC_ECC_H___
19*288bf522SAndroid Build Coastguard Worker
20*288bf522SAndroid Build Coastguard Worker #include <fec/io.h>
21*288bf522SAndroid Build Coastguard Worker
22*288bf522SAndroid Build Coastguard Worker #ifdef __cplusplus
23*288bf522SAndroid Build Coastguard Worker extern "C" {
24*288bf522SAndroid Build Coastguard Worker #endif
25*288bf522SAndroid Build Coastguard Worker
26*288bf522SAndroid Build Coastguard Worker /* ecc parameters */
27*288bf522SAndroid Build Coastguard Worker #define FEC_RSM 255
28*288bf522SAndroid Build Coastguard Worker
29*288bf522SAndroid Build Coastguard Worker /* parameters to init_rs_char */
30*288bf522SAndroid Build Coastguard Worker #define FEC_PARAMS(roots) \
31*288bf522SAndroid Build Coastguard Worker 8, /* symbol size in bits */ \
32*288bf522SAndroid Build Coastguard Worker 0x11d, /* field generator polynomial coefficients */ \
33*288bf522SAndroid Build Coastguard Worker 0, /* first root of the generator */ \
34*288bf522SAndroid Build Coastguard Worker 1, /* primitive element to generate polynomial roots */ \
35*288bf522SAndroid Build Coastguard Worker (roots), /* polynomial degree (number of roots) */ \
36*288bf522SAndroid Build Coastguard Worker 0 /* padding bytes at the front of shortened block */
37*288bf522SAndroid Build Coastguard Worker
38*288bf522SAndroid Build Coastguard Worker /* computes ceil(x / y) */
fec_div_round_up(uint64_t x,uint64_t y)39*288bf522SAndroid Build Coastguard Worker inline uint64_t fec_div_round_up(uint64_t x, uint64_t y)
40*288bf522SAndroid Build Coastguard Worker {
41*288bf522SAndroid Build Coastguard Worker return (x / y) + (x % y > 0 ? 1 : 0);
42*288bf522SAndroid Build Coastguard Worker }
43*288bf522SAndroid Build Coastguard Worker
44*288bf522SAndroid Build Coastguard Worker /* rounds up x to the nearest multiple of y */
fec_round_up(uint64_t x,uint64_t y)45*288bf522SAndroid Build Coastguard Worker inline uint64_t fec_round_up(uint64_t x, uint64_t y)
46*288bf522SAndroid Build Coastguard Worker {
47*288bf522SAndroid Build Coastguard Worker return fec_div_round_up(x, y) * y;
48*288bf522SAndroid Build Coastguard Worker }
49*288bf522SAndroid Build Coastguard Worker
50*288bf522SAndroid Build Coastguard Worker /* returns a physical offset for a byte in an RS block */
fec_ecc_interleave(uint64_t offset,int rsn,uint64_t rounds)51*288bf522SAndroid Build Coastguard Worker inline uint64_t fec_ecc_interleave(uint64_t offset, int rsn, uint64_t rounds)
52*288bf522SAndroid Build Coastguard Worker {
53*288bf522SAndroid Build Coastguard Worker return (offset / rsn) + (offset % rsn) * rounds * FEC_BLOCKSIZE;
54*288bf522SAndroid Build Coastguard Worker }
55*288bf522SAndroid Build Coastguard Worker
56*288bf522SAndroid Build Coastguard Worker /* returns the size of ecc data given a file size and the number of roots */
fec_ecc_get_size(uint64_t file_size,int roots)57*288bf522SAndroid Build Coastguard Worker inline uint64_t fec_ecc_get_size(uint64_t file_size, int roots)
58*288bf522SAndroid Build Coastguard Worker {
59*288bf522SAndroid Build Coastguard Worker return fec_div_round_up(fec_div_round_up(file_size, FEC_BLOCKSIZE),
60*288bf522SAndroid Build Coastguard Worker FEC_RSM - roots)
61*288bf522SAndroid Build Coastguard Worker * roots * FEC_BLOCKSIZE
62*288bf522SAndroid Build Coastguard Worker + FEC_BLOCKSIZE;
63*288bf522SAndroid Build Coastguard Worker }
64*288bf522SAndroid Build Coastguard Worker
65*288bf522SAndroid Build Coastguard Worker
66*288bf522SAndroid Build Coastguard Worker #ifdef __cplusplus
67*288bf522SAndroid Build Coastguard Worker } /* extern "C" */
68*288bf522SAndroid Build Coastguard Worker #endif
69*288bf522SAndroid Build Coastguard Worker
70*288bf522SAndroid Build Coastguard Worker #endif /* ___FEC_ECC_H___ */
71