diff options
author | Josh Morman <jmorman@perspectalabs.com> | 2021-03-15 12:12:22 -0400 |
---|---|---|
committer | mormj <34754695+mormj@users.noreply.github.com> | 2021-03-16 09:18:25 -0400 |
commit | aabde1fc4611906b951951b7b62f3c2d51fede37 (patch) | |
tree | a62ec6f9a05beedf13a2d376b2dbbbd9901b337b /gr-dtv/lib/atsc | |
parent | 6a07bc3a829efa5912c31e01d8c1054b61d98b0b (diff) |
dtv/atsc: create separate plinfo stream ports
Rather than adding/searching for tags, just put plinfo on its own
streaming port. This should be more efficient than putting tags on
every item.
Signed-off-by: Josh Morman <jmorman@perspectalabs.com>
Diffstat (limited to 'gr-dtv/lib/atsc')
-rw-r--r-- | gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc | 33 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_derandomizer_impl.cc | 20 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_equalizer_impl.cc | 42 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_equalizer_impl.h | 2 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_fs_checker_impl.cc | 18 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc | 31 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc | 30 |
7 files changed, 54 insertions, 122 deletions
diff --git a/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc b/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc index d83d0a625f..df4ad5c2c0 100644 --- a/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc +++ b/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc @@ -27,8 +27,10 @@ atsc_deinterleaver::sptr atsc_deinterleaver::make() atsc_deinterleaver_impl::atsc_deinterleaver_impl() : gr::sync_block( "atsc_deinterleaver", - io_signature::make(1, 1, ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(uint8_t)), - io_signature::make(1, 1, ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(uint8_t))), + io_signature::make2( + 2, 2, ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(uint8_t), sizeof(plinfo)), + io_signature::make2( + 2, 2, ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(uint8_t), sizeof(plinfo))), alignment_fifo(156) { m_fifo.reserve(s_interleavers); @@ -37,8 +39,6 @@ atsc_deinterleaver_impl::atsc_deinterleaver_impl() m_fifo.emplace_back((s_interleavers - 1 - i) * 4); sync(); - - set_tag_propagation_policy(TPP_CUSTOM); } atsc_deinterleaver_impl::~atsc_deinterleaver_impl() {} @@ -57,31 +57,20 @@ int atsc_deinterleaver_impl::work(int noutput_items, { auto in = static_cast<const uint8_t*>(input_items[0]); auto out = static_cast<uint8_t*>(output_items[0]); + auto plin = static_cast<const plinfo*>(input_items[1]); + auto plout = static_cast<plinfo*>(output_items[1]); - std::vector<tag_t> tags; - auto tag_pmt = pmt::intern("plinfo"); - for (int i = 0; i < noutput_items; i++) { - plinfo pli_in; - get_tags_in_window(tags, 0, i, i + 1, tag_pmt); - if (tags.size() > 0) { - pli_in.from_tag_value(pmt::to_uint64(tags[0].value)); - } else { - throw std::runtime_error( - "Atsc Deinterleaver: Plinfo Tag not found on sample"); - } - assert(pli_in.regular_seg_p()); + for (int i = 0; i < noutput_items; i++) { + assert(plin[i].regular_seg_p()); // reset commutator if required using INPUT pipeline info - if (pli_in.first_regular_seg_p()) + if (plin[i].first_regular_seg_p()) sync(); // remap OUTPUT pipeline info to reflect all data segment end-to-end delay - plinfo pli_out; - plinfo::delay(pli_out, pli_in, s_interleavers); - - add_item_tag( - 0, nitems_written(0) + i, tag_pmt, pmt::from_uint64(pli_out.get_tag_value())); + plout[i] = plinfo(); + plinfo::delay(plout[i], plin[i], s_interleavers); // now do the actual deinterleaving for (unsigned int j = 0; j < ATSC_MPEG_RS_ENCODED_LENGTH; j++) { diff --git a/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc b/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc index 33dcf47600..b7f654a507 100644 --- a/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc +++ b/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc @@ -26,11 +26,11 @@ atsc_derandomizer::sptr atsc_derandomizer::make() atsc_derandomizer_impl::atsc_derandomizer_impl() : gr::sync_block("dtv_atsc_derandomizer", - io_signature::make(1, 1, ATSC_MPEG_PKT_LENGTH * sizeof(uint8_t)), + io_signature::make2( + 2, 2, ATSC_MPEG_PKT_LENGTH * sizeof(uint8_t), sizeof(plinfo)), io_signature::make(1, 1, ATSC_MPEG_PKT_LENGTH * sizeof(uint8_t))) { d_rand.reset(); - set_tag_propagation_policy(TPP_DONT); } int atsc_derandomizer_impl::work(int noutput_items, @@ -39,20 +39,12 @@ int atsc_derandomizer_impl::work(int noutput_items, { auto in = static_cast<const uint8_t*>(input_items[0]); auto out = static_cast<uint8_t*>(output_items[0]); + auto plin = static_cast<const plinfo*>(input_items[1]); - std::vector<tag_t> tags; - auto tag_pmt = pmt::intern("plinfo"); for (int i = 0; i < noutput_items; i++) { - plinfo pli_in; - get_tags_in_window(tags, 0, i, i + 1, tag_pmt); - if (tags.size() > 0) { - pli_in.from_tag_value(pmt::to_uint64(tags[0].value)); - } else { - throw std::runtime_error("Atsc Derandomizer: Plinfo Tag not found on sample"); - } - assert(pli_in.regular_seg_p()); + assert(plin[i].regular_seg_p()); - if (pli_in.first_regular_seg_p()) + if (plin[i].first_regular_seg_p()) d_rand.reset(); d_rand.derandomize(&out[i * ATSC_MPEG_PKT_LENGTH], &in[i * ATSC_MPEG_PKT_LENGTH]); @@ -60,7 +52,7 @@ int atsc_derandomizer_impl::work(int noutput_items, // Check the pipeline info for error status and and set the // corresponding bit in transport packet header. - if (pli_in.transport_error_p()) + if (plin[i].transport_error_p()) out[i * ATSC_MPEG_PKT_LENGTH + 1] |= MPEG_TRANSPORT_ERROR_BIT; else out[i * ATSC_MPEG_PKT_LENGTH + 1] &= ~MPEG_TRANSPORT_ERROR_BIT; diff --git a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc index 5970fb5d63..ae9c5f971c 100644 --- a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc +++ b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc @@ -17,6 +17,7 @@ #include "atsc_types.h" #include <gnuradio/io_signature.h> #include <volk/volk.h> +#include <fstream> namespace gr { namespace dtv { @@ -52,20 +53,18 @@ static void init_field_sync_common(float* p, int mask) atsc_equalizer_impl::atsc_equalizer_impl() : gr::block("dtv_atsc_equalizer", - io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)), - io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float))) + io_signature::make2( + 2, 2, ATSC_DATA_SEGMENT_LENGTH * sizeof(float), sizeof(plinfo)), + io_signature::make2( + 2, 2, ATSC_DATA_SEGMENT_LENGTH * sizeof(float), sizeof(plinfo))) { init_field_sync_common(training_sequence1, 0); init_field_sync_common(training_sequence2, 1); d_taps.resize(NTAPS, 0.0f); - d_buff_not_filled = true; - const int alignment_multiple = volk_get_alignment() / sizeof(float); set_alignment(std::max(1, alignment_multiple)); - - set_tag_propagation_policy(TPP_CUSTOM); // use manual tag propagation } atsc_equalizer_impl::~atsc_equalizer_impl() {} @@ -118,12 +117,13 @@ int atsc_equalizer_impl::general_work(int noutput_items, { auto in = static_cast<const float*>(input_items[0]); auto out = static_cast<float*>(output_items[0]); + auto in_pl = static_cast<const plinfo*>(input_items[1]); + auto out_pl = static_cast<plinfo*>(output_items[1]); int output_produced = 0; int i = 0; std::vector<tag_t> tags; - auto tag_pmt = pmt::intern("plinfo"); plinfo pli_in; if (d_buff_not_filled) { @@ -131,14 +131,9 @@ int atsc_equalizer_impl::general_work(int noutput_items, memcpy(&data_mem[NPRETAPS], in + i * ATSC_DATA_SEGMENT_LENGTH, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)); - get_tags_in_window(tags, 0, 0, 1, tag_pmt); - if (tags.size() > 0) { - pli_in.from_tag_value(pmt::to_uint64(tags[0].value)); - d_flags = pli_in.flags(); - d_segno = pli_in.segno(); - } else { - throw std::runtime_error("Atsc Equalizer: Plinfo Tag not found on sample"); - } + + d_flags = in_pl[i].flags(); + d_segno = in_pl[i].segno(); d_buff_not_filled = false; i++; @@ -164,12 +159,7 @@ int atsc_equalizer_impl::general_work(int noutput_items, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)); plinfo pli_out(d_flags, d_segno); - add_item_tag(0, - nitems_written(0) + output_produced, - tag_pmt, - pmt::from_uint64(pli_out.get_tag_value())); - - output_produced++; + out_pl[output_produced++] = pli_out; } memcpy(data_mem, &data_mem[ATSC_DATA_SEGMENT_LENGTH], NPRETAPS * sizeof(float)); @@ -177,14 +167,8 @@ int atsc_equalizer_impl::general_work(int noutput_items, in + i * ATSC_DATA_SEGMENT_LENGTH, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)); - get_tags_in_window(tags, 0, i, i + 1, tag_pmt); - if (tags.size() > 0) { - pli_in.from_tag_value(pmt::to_uint64(tags[0].value)); - d_flags = pli_in.flags(); - d_segno = pli_in.segno(); - } else { - throw std::runtime_error("Atsc Equalizer: Plinfo Tag not found on sample"); - } + d_flags = in_pl[i].flags(); + d_segno = in_pl[i].segno(); } consume_each(noutput_items); diff --git a/gr-dtv/lib/atsc/atsc_equalizer_impl.h b/gr-dtv/lib/atsc/atsc_equalizer_impl.h index bf41351807..7977dbe20e 100644 --- a/gr-dtv/lib/atsc/atsc_equalizer_impl.h +++ b/gr-dtv/lib/atsc/atsc_equalizer_impl.h @@ -44,7 +44,7 @@ private: unsigned short d_flags; short d_segno; - bool d_buff_not_filled; + bool d_buff_not_filled = true; public: atsc_equalizer_impl(); diff --git a/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc b/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc index cf00be36ee..82d15a8814 100644 --- a/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc +++ b/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc @@ -36,9 +36,9 @@ atsc_fs_checker::sptr atsc_fs_checker::make() atsc_fs_checker_impl::atsc_fs_checker_impl() : gr::block("dtv_atsc_fs_checker", io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)), - io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float))) + io_signature::make2( + 2, 2, ATSC_DATA_SEGMENT_LENGTH * sizeof(float), sizeof(plinfo))) { - gr::configure_default_loggers(d_logger, d_debug_logger, "dtv_atsc_fs_checker"); reset(); } @@ -59,13 +59,12 @@ int atsc_fs_checker_impl::general_work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) { - const float* in = static_cast<const float*>(input_items[0]); - float* out = static_cast<float*>(output_items[0]); + auto in = static_cast<const float*>(input_items[0]); + auto out = static_cast<float*>(output_items[0]); + auto out_pl = static_cast<plinfo*>(output_items[1]); int output_produced = 0; - auto tag_pmt = pmt::intern("plinfo"); - for (int i = 0; i < noutput_items; i++) { // check for a hit on the PN 511 pattern int errors = 0; @@ -114,12 +113,7 @@ int atsc_fs_checker_impl::general_work(int noutput_items, d_field_num = 0; d_segment_num = 0; } else { - add_item_tag(0, - nitems_written(0) + output_produced, - tag_pmt, - pmt::from_uint64(pli_out.get_tag_value())); - - output_produced++; + out_pl[output_produced++] = pli_out; } } } diff --git a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc index 4e6afe2753..9220783b48 100644 --- a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc +++ b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc @@ -37,8 +37,10 @@ atsc_rs_decoder::sptr atsc_rs_decoder::make() atsc_rs_decoder_impl::atsc_rs_decoder_impl() : gr::sync_block( "dtv_atsc_rs_decoder", - io_signature::make(1, 1, sizeof(uint8_t) * ATSC_MPEG_RS_ENCODED_LENGTH), - io_signature::make(1, 1, sizeof(uint8_t) * ATSC_MPEG_PKT_LENGTH)) + io_signature::make2( + 2, 2, sizeof(uint8_t) * ATSC_MPEG_RS_ENCODED_LENGTH, sizeof(plinfo)), + io_signature::make2( + 2, 2, sizeof(uint8_t) * ATSC_MPEG_PKT_LENGTH, sizeof(plinfo))) { d_rs = init_rs_char( rs_init_symsize, rs_init_gfpoly, rs_init_fcr, rs_init_prim, rs_init_nroots); @@ -46,8 +48,6 @@ atsc_rs_decoder_impl::atsc_rs_decoder_impl() d_nerrors_corrected_count = 0; d_bad_packet_count = 0; d_total_packets = 0; - - set_tag_propagation_policy(TPP_CUSTOM); } int atsc_rs_decoder_impl::decode(uint8_t* out, const uint8_t* in) @@ -93,27 +93,17 @@ int atsc_rs_decoder_impl::work(int noutput_items, { auto in = static_cast<const uint8_t*>(input_items[0]); auto out = static_cast<uint8_t*>(output_items[0]); + auto plin = static_cast<const plinfo*>(input_items[1]); + auto plout = static_cast<plinfo*>(output_items[1]); - std::vector<tag_t> tags; - auto tag_pmt = pmt::intern("plinfo"); for (int i = 0; i < noutput_items; i++) { - plinfo pli_in; - get_tags_in_window(tags, 0, i, i + 1, tag_pmt); - if (tags.size() > 0) { - pli_in.from_tag_value(pmt::to_uint64(tags[0].value)); - } else { - throw std::runtime_error( - "Atsc Viterbi Decoder: Plinfo Tag not found on sample"); - } - - assert(pli_in.regular_seg_p()); - - plinfo pli_out = pli_in; // copy pipeline info... + assert(plin[i].regular_seg_p()); + plout[i] = plin[i]; // copy pipeline info... int nerrors_corrected = decode(&out[i * ATSC_MPEG_PKT_LENGTH], &in[i * ATSC_MPEG_RS_ENCODED_LENGTH]); - pli_out.set_transport_error(nerrors_corrected == -1); + plout[i].set_transport_error(nerrors_corrected == -1); if (nerrors_corrected == -1) { d_bad_packet_count++; d_nerrors_corrected_count += 10; // lower bound estimate; most this RS can fix @@ -121,9 +111,6 @@ int atsc_rs_decoder_impl::work(int noutput_items, d_nerrors_corrected_count += nerrors_corrected; } - add_item_tag( - 0, nitems_written(0) + i, tag_pmt, pmt::from_uint64(pli_out.get_tag_value())); - d_total_packets++; #if 0 if (d_total_packets > 1000) { diff --git a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc index 5b807f3fce..0219379323 100644 --- a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc +++ b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc @@ -28,8 +28,10 @@ atsc_viterbi_decoder::sptr atsc_viterbi_decoder::make() atsc_viterbi_decoder_impl::atsc_viterbi_decoder_impl() : sync_block( "dtv_atsc_viterbi_decoder", - io_signature::make(1, 1, sizeof(float) * ATSC_DATA_SEGMENT_LENGTH), - io_signature::make(1, 1, sizeof(unsigned char) * ATSC_MPEG_RS_ENCODED_LENGTH)) + io_signature::make2( + 2, 2, sizeof(float) * ATSC_DATA_SEGMENT_LENGTH, sizeof(plinfo)), + io_signature::make2( + 2, 2, sizeof(unsigned char) * ATSC_MPEG_RS_ENCODED_LENGTH, sizeof(plinfo))) { set_output_multiple(NCODERS); @@ -50,8 +52,6 @@ atsc_viterbi_decoder_impl::atsc_viterbi_decoder_impl() fifo.emplace_back(fifo_size); reset(); - - set_tag_propagation_policy(TPP_CUSTOM); } atsc_viterbi_decoder_impl::~atsc_viterbi_decoder_impl() {} @@ -76,6 +76,8 @@ int atsc_viterbi_decoder_impl::work(int noutput_items, { auto in = static_cast<const float*>(input_items[0]); auto out = static_cast<unsigned char*>(output_items[0]); + auto plin = static_cast<const plinfo*>(input_items[1]); + auto plout = static_cast<plinfo*>(output_items[1]); // The way the fs_checker works ensures we start getting packets // starting with a field sync, and out input multiple is set to @@ -91,9 +93,7 @@ int atsc_viterbi_decoder_impl::work(int noutput_items, unsigned char out_copy[OUTPUT_SIZE]; std::vector<tag_t> tags; - auto tag_pmt = pmt::intern("plinfo"); for (int i = 0; i < noutput_items; i += NCODERS) { - /* Build a continuous symbol buffer for each encoder */ for (unsigned int encoder = 0; encoder < NCODERS; encoder++) for (unsigned int k = 0; k < enco_which_max; k++) @@ -102,7 +102,6 @@ int atsc_viterbi_decoder_impl::work(int noutput_items, ATSC_DATA_SEGMENT_LENGTH + enco_which_syms[encoder][k] % ATSC_DATA_SEGMENT_LENGTH]; - /* Now run each of the 12 Viterbi decoders over their subset of the input symbols */ for (unsigned int encoder = 0; encoder < NCODERS; encoder++) @@ -123,26 +122,13 @@ int atsc_viterbi_decoder_impl::work(int noutput_items, // copy output from contiguous temp buffer into final output for (int j = 0; j < NCODERS; j++) { - plinfo pli_in; - get_tags_in_window(tags, 0, i + j, i + j + 1, tag_pmt); - if (tags.size() > 0) { - pli_in.from_tag_value(pmt::to_uint64(tags[0].value)); - } else { - throw std::runtime_error("No plinfo on tag"); - } - memcpy(&out[(i + j) * ATSC_MPEG_RS_ENCODED_LENGTH], &out_copy[j * ATSC_MPEG_RS_ENCODED_LENGTH], ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(out_copy[0])); - plinfo pli_out; + plout[i + j] = plinfo(); // adjust pipeline info to reflect 12 segment delay - plinfo::delay(pli_out, pli_in, NCODERS); - - add_item_tag(0, - nitems_written(0) + i + j, - tag_pmt, - pmt::from_uint64(pli_out.get_tag_value())); + plinfo::delay(plout[i + j], plin[i + j], NCODERS); } } |