summaryrefslogtreecommitdiff
path: root/gr-fec/lib/async_encoder_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-fec/lib/async_encoder_impl.cc')
-rw-r--r--gr-fec/lib/async_encoder_impl.cc20
1 files changed, 17 insertions, 3 deletions
diff --git a/gr-fec/lib/async_encoder_impl.cc b/gr-fec/lib/async_encoder_impl.cc
index d6ce67d491..106ad25cc4 100644
--- a/gr-fec/lib/async_encoder_impl.cc
+++ b/gr-fec/lib/async_encoder_impl.cc
@@ -110,9 +110,21 @@ namespace gr {
int nbits_in = pmt::length(bits);
const uint8_t* bits_in = pmt::u8vector_elements(bits, o0);
- d_encoder->set_frame_size(nbits_in);
+ bool variable_framesize = d_encoder->set_frame_size(nbits_in);
+ size_t nbits_out = 0;
+ size_t nblocks = 1;
+ if( variable_framesize ){
+ nbits_out = d_encoder->get_output_size();
+ } else {
+ nblocks = nbits_in / d_encoder->get_input_size();
+ if( nblocks * d_encoder->get_input_size() != nbits_in ){
+ printf("nblocks: %d, in_block_size: %d, got_input_size: %d\n",
+ nblocks, d_encoder->get_input_size(), nbits_in);
+ throw std::runtime_error("input does not divide into code block size!");
+ }
+ nbits_out = nblocks * d_encoder->get_output_size();
+ }
- int nbits_out = d_encoder->get_output_size();
// buffers for output bits to go to
pmt::pmt_t outvec = pmt::make_u8vector(nbits_out, 0x00);
@@ -123,7 +135,9 @@ namespace gr {
d_encoder->generic_work((void*)d_bits_in, (void*)bits_out);
}
else {
- d_encoder->generic_work((void*)bits_in, (void*)bits_out);
+ for(size_t i=0; i<nblocks; i++){
+ d_encoder->generic_work((void*) &bits_in[i*d_encoder->get_input_size()], (void*)&bits_out[i*d_encoder->get_output_size()]);
+ }
}
pmt::pmt_t msg_pair = pmt::cons(meta, outvec);