diff options
author | Tom Rondeau <tom@trondeau.com> | 2015-09-24 21:59:36 -0400 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2015-09-24 21:59:36 -0400 |
commit | cbd70793b710abe4e92e960f23c3286f7270dd65 (patch) | |
tree | 8a788eaf5b6f051f52ec59b1a1cf2100dc8dc68c /gr-fec/lib/async_decoder_impl.cc | |
parent | 2e7800ff6f8dbf16775b8682c5297417e460fa67 (diff) |
fec: Adds MTU parameter to async and tagged stream blocks.
The maximum transmission unit (MTU, in bytes) sets up the encoders and
decoders with enough internal buffer space to accommodate frames of
varying sizes up to the MTU. Proections placed to make sure incoming
tagged streams and PDUs don't exceed this.
This also fixes a bug in the tagged stream encoder and decoder blocks
to properly use calculate_output_stream_length.
Diffstat (limited to 'gr-fec/lib/async_decoder_impl.cc')
-rw-r--r-- | gr-fec/lib/async_decoder_impl.cc | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/gr-fec/lib/async_decoder_impl.cc b/gr-fec/lib/async_decoder_impl.cc index b5ae04be17..ed709e8c67 100644 --- a/gr-fec/lib/async_decoder_impl.cc +++ b/gr-fec/lib/async_decoder_impl.cc @@ -34,14 +34,16 @@ namespace gr { async_decoder::sptr async_decoder::make(generic_decoder::sptr my_decoder, - bool packed, bool rev_pack) + bool packed, bool rev_pack, + int mtu) { return gnuradio::get_initial_sptr - (new async_decoder_impl(my_decoder, packed, rev_pack)); + (new async_decoder_impl(my_decoder, packed, rev_pack, mtu)); } async_decoder_impl::async_decoder_impl(generic_decoder::sptr my_decoder, - bool packed, bool rev_pack) + bool packed, bool rev_pack, + int mtu) : block("async_decoder", io_signature::make(0,0,0), io_signature::make(0,0,0)), @@ -58,6 +60,7 @@ namespace gr { d_packed = packed; d_rev_pack = rev_pack; + d_mtu = mtu; message_port_register_in(d_in_port); message_port_register_out(d_out_port); @@ -71,7 +74,7 @@ namespace gr { } // The maximum frame size is set by the initial frame size of the decoder. - d_max_bits_in = d_decoder->get_input_size(); + d_max_bits_in = d_mtu*8 * 1.0/d_decoder->rate(); d_tmp_f32 = (float*)volk_malloc(d_max_bits_in*sizeof(float), volk_get_alignment()); @@ -81,7 +84,7 @@ namespace gr { } if(d_packed) { - int max_bits_out = d_decoder->get_output_size(); + int max_bits_out = d_mtu*8; d_bits_out = (uint8_t*)volk_malloc(max_bits_out*sizeof(uint8_t), volk_get_alignment()); } @@ -114,7 +117,7 @@ namespace gr { int diff = d_decoder->rate()*d_decoder->get_input_size() - d_decoder->get_output_size(); size_t nbits_in = pmt::length(bits); - size_t nbits_out = 0; + size_t nbits_out = 0; size_t nblocks = 1; bool variable_frame_size = d_decoder->set_frame_size(nbits_out); @@ -127,14 +130,14 @@ namespace gr { // set up nbits_out if(variable_frame_size){ nbits_out = nbits_in*d_decoder->rate() - diff; - } else { - nblocks = nbits_in / d_decoder->get_input_size(); - nbits_out = nblocks * d_decoder->get_output_size(); - if(nblocks * d_decoder->get_input_size() != nbits_in){ - throw std::runtime_error("bad block multiple in!"); - } + } + else { + nblocks = nbits_in / d_decoder->get_input_size(); + nbits_out = nblocks * d_decoder->get_output_size(); + if(nblocks * d_decoder->get_input_size() != nbits_in){ + throw std::runtime_error("bad block multiple in!"); } - + } size_t o0(0); const float* f32in = pmt::f32vector_elements(bits, o0); @@ -148,11 +151,11 @@ namespace gr { // grow d_tmp_f32 if needed if(nbits_in > d_max_bits_in){ - d_max_bits_in = nbits_in; - volk_free(d_tmp_f32); - d_tmp_f32 = (float*)volk_malloc(d_max_bits_in*sizeof(float), - volk_get_alignment()); - } + d_max_bits_in = nbits_in; + volk_free(d_tmp_f32); + d_tmp_f32 = (float*)volk_malloc(d_max_bits_in*sizeof(float), + volk_get_alignment()); + } memcpy(d_tmp_f32, f32in, nbits_in*sizeof(float)); } @@ -170,8 +173,9 @@ namespace gr { } else { for(size_t i=0; i<nblocks; i++){ - d_decoder->generic_work((void*)&d_tmp_f32[i*d_decoder->get_input_size()], (void*)&u8out[i*d_decoder->get_output_size()]); - } + d_decoder->generic_work((void*)&d_tmp_f32[i*d_decoder->get_input_size()], + (void*)&u8out[i*d_decoder->get_output_size()]); + } } meta = pmt::dict_add(meta, pmt::mp("iterations"), pmt::mp(d_decoder->get_iterations()) ); |