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