summaryrefslogtreecommitdiff
path: root/gr-fec/lib/cc_encoder_impl.cc
diff options
context:
space:
mode:
authorTom Rondeau <tom@trondeau.com>2014-05-17 19:23:44 -0400
committerTom Rondeau <tom@trondeau.com>2014-05-17 19:23:44 -0400
commit91b5f380b6c511624064f1b64ae3ebfd710d7272 (patch)
tree5c157b11cebf25e110d26f8829287f0b97fb0bfd /gr-fec/lib/cc_encoder_impl.cc
parent3245fde378417687db10f7cdeb274c9fa126d4e8 (diff)
fec: wip: adding concept of padding for CC encoder/decoder.
When using terminated mode, the CC encoder adds K-1 bits to the output, which doesn't fit a full byte and will throw off the book-keeping in PDU or tagged mode. Padding to fill a byte tells both encoder and decoder to handle the extra bits.
Diffstat (limited to 'gr-fec/lib/cc_encoder_impl.cc')
-rw-r--r--gr-fec/lib/cc_encoder_impl.cc16
1 files changed, 11 insertions, 5 deletions
diff --git a/gr-fec/lib/cc_encoder_impl.cc b/gr-fec/lib/cc_encoder_impl.cc
index abbf1a8f1b..90d2ee4c1c 100644
--- a/gr-fec/lib/cc_encoder_impl.cc
+++ b/gr-fec/lib/cc_encoder_impl.cc
@@ -42,21 +42,21 @@ namespace gr {
generic_encoder::sptr
cc_encoder::make(int frame_size, int k, int rate,
std::vector<int> polys, int start_state,
- cc_mode_t mode)
+ cc_mode_t mode, bool padded)
{
return generic_encoder::sptr
(new cc_encoder_impl(frame_size, k, rate,
polys, start_state,
- mode));
+ mode, padded));
}
cc_encoder_impl::cc_encoder_impl(int frame_size, int k, int rate,
std::vector<int> polys, int start_state,
- cc_mode_t mode)
+ cc_mode_t mode, bool padded)
: generic_encoder("cc_encoder"),
d_rate(rate), d_k(k), d_polys(polys),
d_start_state(start_state),
- d_mode(mode)
+ d_mode(mode), d_padding(0)
{
if(static_cast<size_t>(d_rate) != d_polys.size()) {
throw std::runtime_error("cc_encoder: Number of polynomials must be the same as the value of rate");
@@ -64,6 +64,12 @@ namespace gr {
partab_init();
+ // set up a padding factor. If padding, extends the encoding
+ // by this many bits to fit into a full byte.
+ if(padded && (mode == CC_TERMINATED)) {
+ d_padding = static_cast<int>(8.0f*ceilf(d_rate*(d_k-1)/8.0f) - (d_rate*(d_k-1)));
+ }
+
d_max_frame_size = frame_size;
set_frame_size(frame_size);
}
@@ -98,7 +104,7 @@ namespace gr {
d_frame_size = frame_size;
if(d_mode == CC_TERMINATED) {
- d_output_size = d_rate * (d_frame_size + d_k - 1);
+ d_output_size = d_rate * (d_frame_size + d_k - 1) + d_padding;
}
/*
else if(d_trunc_intrinsic) {