diff options
author | Tom Rondeau <tom@trondeau.com> | 2014-05-17 10:31:27 -0400 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2014-05-17 17:45:17 -0400 |
commit | 3245fde378417687db10f7cdeb274c9fa126d4e8 (patch) | |
tree | 8b2fe865e74eff60de112e8128d34c3c81c229bc /gr-fec/lib | |
parent | 15ef5ba664896481faba85c39dc3539f5a4ee5aa (diff) |
blocks: adding reverse packing/unpacking functions.
Diffstat (limited to 'gr-fec/lib')
-rw-r--r-- | gr-fec/lib/async_encoder_impl.cc | 35 | ||||
-rw-r--r-- | gr-fec/lib/async_encoder_impl.h | 5 | ||||
-rw-r--r-- | gr-fec/lib/cc_decoder_impl.cc | 7 |
3 files changed, 32 insertions, 15 deletions
diff --git a/gr-fec/lib/async_encoder_impl.cc b/gr-fec/lib/async_encoder_impl.cc index de760b1c69..4856dfd564 100644 --- a/gr-fec/lib/async_encoder_impl.cc +++ b/gr-fec/lib/async_encoder_impl.cc @@ -33,13 +33,15 @@ namespace gr { namespace fec { async_encoder::sptr - async_encoder::make(generic_encoder::sptr my_encoder) + async_encoder::make(generic_encoder::sptr my_encoder, + bool rev_unpack, bool rev_pack) { return gnuradio::get_initial_sptr - (new async_encoder_impl(my_encoder)); + (new async_encoder_impl(my_encoder, rev_unpack, rev_pack)); } - async_encoder_impl::async_encoder_impl(generic_encoder::sptr my_encoder) + async_encoder_impl::async_encoder_impl(generic_encoder::sptr my_encoder, + bool rev_unpack, bool rev_pack) : block("async_encoder", io_signature::make(0,0,0), io_signature::make(0,0,0)), @@ -52,6 +54,9 @@ namespace gr { d_unpack = new blocks::kernel::unpack_k_bits(8); d_pack = new blocks::kernel::pack_k_bits(8); + d_rev_unpack = rev_unpack; + d_rev_pack = rev_pack; + message_port_register_in(d_in_port); message_port_register_out(d_out_port); set_msg_handler(d_in_port, boost::bind(&async_encoder_impl::encode, this ,_1) ); @@ -72,40 +77,44 @@ namespace gr { int nbytes = pmt::length(bytes); int nbits = 8*nbytes; - size_t o0(0); + size_t o0 = 0; const uint8_t* bytes_in = pmt::u8vector_elements(bytes, o0); uint8_t* bits_in = (uint8_t*)volk_malloc(nbits*sizeof(uint8_t), volk_get_alignment()); // Encoder takes a stream of bits, but PDU's are received as // bytes, so we unpack them here. - d_unpack->unpack(bits_in, bytes_in, nbytes); + if(d_rev_unpack) + d_unpack->unpack_rev(bits_in, bytes_in, nbytes); + else + d_unpack->unpack(bits_in, bytes_in, nbytes); d_encoder->set_frame_size(nbits); int nbits_out = d_encoder->get_output_size(); - int nbytes_out = nbits_out/8; + int nbytes_out = ceilf(static_cast<float>(nbits_out)/8.0f); // buffers for bits/bytes to go to uint8_t* bits_out = (uint8_t*)volk_malloc(nbits_out*sizeof(uint8_t), volk_get_alignment()); - uint8_t* bytes_out = (uint8_t*)volk_malloc(nbytes_out*sizeof(uint8_t), - volk_get_alignment()); + + pmt::pmt_t outvec = pmt::make_u8vector(nbytes_out, 0x00); + uint8_t* bytes_out = pmt::u8vector_writable_elements(outvec, o0); // ENCODE! d_encoder->generic_work((void*)bits_in, (void*)bits_out); - // Stolen from pack_k_bits - d_pack->pack(bytes_out, bits_out, nbytes_out); + // Encoder produces bits, so repack them here to bytes. + if(d_rev_pack) + d_pack->pack_rev(bytes_out, bits_out, nbytes_out); + else + d_pack->pack(bytes_out, bits_out, nbytes_out); - //pmt::pmt_t outvec = pmt::init_u8vector(nouts, u8out); - pmt::pmt_t outvec = pmt::init_u8vector(nbytes_out, bytes_out); pmt::pmt_t msg_pair = pmt::cons(meta, outvec); message_port_pub(d_out_port, msg_pair); volk_free(bits_in); volk_free(bits_out); - volk_free(bytes_out); } int diff --git a/gr-fec/lib/async_encoder_impl.h b/gr-fec/lib/async_encoder_impl.h index 4090d77035..2c43b0d386 100644 --- a/gr-fec/lib/async_encoder_impl.h +++ b/gr-fec/lib/async_encoder_impl.h @@ -43,9 +43,12 @@ namespace gr { void encode(pmt::pmt_t msg); blocks::kernel::unpack_k_bits *d_unpack; blocks::kernel::pack_k_bits *d_pack; + bool d_rev_unpack; + bool d_rev_pack; public: - async_encoder_impl(generic_encoder::sptr my_encoder); + async_encoder_impl(generic_encoder::sptr my_encoder, + bool rev_unpack=true, bool rev_pack=true); ~async_encoder_impl(); int general_work(int noutput_items, diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc index efaf6c002d..6b7daaf4b2 100644 --- a/gr-fec/lib/cc_decoder_impl.cc +++ b/gr-fec/lib/cc_decoder_impl.cc @@ -64,7 +64,8 @@ namespace gr { // Set max frame size here; all buffers and settings will be // based on this value. d_max_frame_size = frame_size; - set_frame_size(frame_size); + d_frame_size = frame_size; + //set_frame_size(frame_size); d_vp = new struct v; @@ -78,6 +79,7 @@ namespace gr { d_end_state = &d_end_state_chaining; d_managed_in = (unsigned char*)volk_malloc(d_veclen*d_rate*sizeof(unsigned char), volk_get_alignment()); + d_veclen = d_frame_size + (6 * (d_k - 1)); d_managed_in_size = d_veclen * d_rate; if(d_managed_in == NULL) { throw std::runtime_error("cc_decoder: bad alloc for d_managed_in\n"); @@ -85,14 +87,17 @@ namespace gr { break; case(CC_TRUNCATED): + d_veclen = d_frame_size; d_end_state = &d_end_state_chaining; break; case(CC_TERMINATED): + d_veclen = d_frame_size + d_k - 1; d_end_state = (end_state == -1) ? &d_end_state_chaining : &d_end_state_nonchaining; break; case(CC_STREAMING): + d_veclen = d_frame_size + d_k - 1; d_end_state = &d_end_state_chaining; break; |