summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc')
-rw-r--r--gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc40
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()));
}
}