diff options
Diffstat (limited to 'gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc')
-rw-r--r-- | gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc index e02649861e..1e53c78aba 100644 --- a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc +++ b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc @@ -26,9 +26,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(atsc_soft_data_segment)), - io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded))) + : 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)) { set_output_multiple(NCODERS); @@ -49,6 +50,8 @@ 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() {} @@ -71,8 +74,8 @@ int atsc_viterbi_decoder_impl::work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) { - const atsc_soft_data_segment* in = (const atsc_soft_data_segment*)input_items[0]; - atsc_mpeg_packet_rs_encoded* out = (atsc_mpeg_packet_rs_encoded*)output_items[0]; + auto in = static_cast<const float*>(input_items[0]); + auto out = static_cast<unsigned char*>(output_items[0]); // The way the fs_checker works ensures we start getting packets // starting with a field sync, and out input multiple is set to @@ -87,12 +90,17 @@ 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++) - symbols[encoder][k] = in[i + (enco_which_syms[encoder][k] / 832)] - .data[enco_which_syms[encoder][k] % 832]; + symbols[encoder][k] = in[(i + (enco_which_syms[encoder][k] / 832)) * + ATSC_DATA_SEGMENT_LENGTH + + enco_which_syms[encoder][k] % 832]; + /* Now run each of the 12 Viterbi decoders over their subset of the input symbols */ @@ -114,12 +122,26 @@ 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++) { - memcpy(&out[i + j].data[0], + 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 * NCODERS + j) * ATSC_MPEG_RS_ENCODED_LENGTH], &out_copy[j * OUTPUT_SIZE / NCODERS], ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(out_copy[0])); + plinfo pli_out; // adjust pipeline info to reflect 12 segment delay - plinfo::delay(out[i + j].pli, in[i + j].pli, NCODERS); + 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())); } } |