summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ao_fec.h4
-rw-r--r--src/core/ao_viterbi.c14
2 files changed, 16 insertions, 2 deletions
diff --git a/src/core/ao_fec.h b/src/core/ao_fec.h
index e3c55d6e..4fd398eb 100644
--- a/src/core/ao_fec.h
+++ b/src/core/ao_fec.h
@@ -66,8 +66,10 @@ ao_fec_encode(uint8_t *in, uint8_t len, uint8_t *out);
* 'out' must be len/8 bytes long
*/
+#define AO_FEC_DECODE_BLOCK (8 * 32) /* callback must return multiples of this many bits */
+
uint8_t
-ao_fec_decode(uint8_t *in, uint16_t in_len, uint8_t *out, uint8_t out_len);
+ao_fec_decode(uint8_t *in, uint16_t in_len, uint8_t *out, uint8_t out_len, uint16_t (*callback)());
/*
* Interleave data packed in bytes. 'out' must be 'len' bytes long.
diff --git a/src/core/ao_viterbi.c b/src/core/ao_viterbi.c
index 77681556..69e9c1f5 100644
--- a/src/core/ao_viterbi.c
+++ b/src/core/ao_viterbi.c
@@ -91,7 +91,7 @@ ao_cost(struct ao_soft_sym a, struct ao_soft_sym b)
*/
uint8_t
-ao_fec_decode(uint8_t *in, uint16_t len, uint8_t *out, uint8_t out_len)
+ao_fec_decode(uint8_t *in, uint16_t len, uint8_t *out, uint8_t out_len, uint16_t (*callback)())
{
static uint16_t cost[2][NUM_STATE]; /* path cost */
static uint16_t bits[2][NUM_STATE]; /* save bits to quickly output them */
@@ -105,6 +105,7 @@ ao_fec_decode(uint8_t *in, uint16_t len, uint8_t *out, uint8_t out_len)
const uint8_t *whiten = ao_fec_whiten_table;
uint16_t interleave; /* input byte array index */
struct ao_soft_sym s; /* input symbol pair */
+ uint16_t avail;
p = 0;
for (state = 0; state < NUM_STATE; state++) {
@@ -113,11 +114,22 @@ ao_fec_decode(uint8_t *in, uint16_t len, uint8_t *out, uint8_t out_len)
}
cost[0][0] = 0;
+ if (callback)
+ avail = 0;
+ else
+ avail = len;
+
o = 0;
for (i = 0; i < len; i += 2) {
b = i/2;
n = p ^ 1;
+ if (!avail) {
+ avail = callback();
+ if (!avail)
+ break;
+ }
+
/* Fetch one pair of input bytes, de-interleaving
* the input.
*/