diff options
Diffstat (limited to 'gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc')
-rw-r--r-- | gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc b/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc index 616a4c2688..d83d0a625f 100644 --- a/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc +++ b/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc @@ -25,9 +25,10 @@ atsc_deinterleaver::sptr atsc_deinterleaver::make() } atsc_deinterleaver_impl::atsc_deinterleaver_impl() - : gr::sync_block("atsc_deinterleaver", - io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded)), - io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded))), + : 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))), alignment_fifo(156) { m_fifo.reserve(s_interleavers); @@ -36,6 +37,8 @@ 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() {} @@ -52,24 +55,38 @@ int atsc_deinterleaver_impl::work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) { - const atsc_mpeg_packet_rs_encoded* in = - (const atsc_mpeg_packet_rs_encoded*)input_items[0]; - atsc_mpeg_packet_rs_encoded* out = (atsc_mpeg_packet_rs_encoded*)output_items[0]; + auto in = static_cast<const uint8_t*>(input_items[0]); + auto out = static_cast<uint8_t*>(output_items[0]); + std::vector<tag_t> tags; + auto tag_pmt = pmt::intern("plinfo"); for (int i = 0; i < noutput_items; i++) { - assert(in[i].pli.regular_seg_p()); - plinfo::sanity_check(in[i].pli); + 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()); // reset commutator if required using INPUT pipeline info - if (in[i].pli.first_regular_seg_p()) + if (pli_in.first_regular_seg_p()) sync(); // remap OUTPUT pipeline info to reflect all data segment end-to-end delay - plinfo::delay(out[i].pli, in[i].pli, s_interleavers); + 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())); // now do the actual deinterleaving - for (unsigned int j = 0; j < sizeof(in[i].data); j++) { - out[i].data[j] = alignment_fifo.stuff(transform(in[i].data[j])); + for (unsigned int j = 0; j < ATSC_MPEG_RS_ENCODED_LENGTH; j++) { + out[i * ATSC_MPEG_RS_ENCODED_LENGTH + j] = + alignment_fifo.stuff(transform(in[i * ATSC_MPEG_RS_ENCODED_LENGTH + j])); } } |